Documente Academic
Documente Profesional
Documente Cultură
Observaţia 3.1.1 Dacă un graf fără circuite are drum hamiltonian, atunci acesta este unic.
Exemplul 3.1.1. Fie graful din figura 1. Să cercetăm conform algoritmului dacă are sau nu
drum hamiltonian.
Fig.1
x2
x3
x1 x6
x4 x5
1
Matricea booleană ataşată grafului este: x1 x2 x3 x4 x5 x6
x1 0 0 0 0 0 0
x2 0 0 0 0 0 1
B= x3 0 1 0 0 0 1
x4 1 1 1 0 1 0
x5 1 0 1 0 0 0
x6 1 0 0 0 0 0
x1 0 0 0 0 0 0 0
x2 1* 0 0 0 0 1 2
D=
x3 1* 1 0 0 0 1 3
x4 1 1 1 0 1 1* 5
x5 1 1* 1 0 0 1* 4
x6 1 0 0 0 0 0 1
Cum pe coloana a avem puteri de atingere diferite două câte două, rezultă că graful
admite un drum hamiltonian. Acesta este dH = {x4, x5, x3, x2, x6, x1}.
Algoritmul Yu Chen pentru grafuri cu circuite.
Acest algoritm are următorii paşi:
Pasul 1. Se determină componentele tare conexe ale grafului (X , Γ), notate cu C1, C2, . . ..
Pasul 2. Se determină graful condensat asociat grafului (X, Γ), care este un graf fără circuite.
Pasul 3. Se determină drumul hamiltonian în graful condensat, când există.
Pasul 4. Se aranjează componentele tare conexe în ordinea dată de drumul hamiltonian
determinat la Pasul 3.
Pasul 5. Se scriu toate drumurile hamiltoniene din fiecare componentă tare conexă.
Pasul 6. Stabilim legăturile de la o componentă la alta în funcţie de arcele de incidenţă
2
(legătură) din graful dat, citind apoi toate drumurile hamiltoniene.
Observaţia 3.1.2. Dacă în graful condensat nu există drum hamiltonian sau între două com-
ponente nu există legătură, atunci graful nu are drumuri hamiltoniene.
Exemplul 3.1.2. Să aflăm drumurile hamiltoniene ale grafului din figura, 2, de mai jos.
x2 x5 x6
x1
x8
x3 x4 x7
Fig. 2
C1
C4
C3
C1 C3 C4 C2
x1x3x8x7 x4 x5x6 x2
x7x8x1x3 x6x5
Apoi stabilim legăturile între ultimele elemente din drumurile dintr-o componentă şi
3
primele vârfuri din componenta următoare (le indicăm prin săgeţi).
Obţinem drumurile hamiltoniene:
Algoritmul matricilor latine. Vom prezenta un procedeu prin care se pot găsi toate drumurile
elementare, deci şi cele hamiltoniene, precum şi circuitele hamiltoniene. Fie (X, Γ) un graf.
Vom utiliza matricea latină (Definiţia 1.1.20) L = (lij), unde
Construim matricea 𝐿̃, obţinută din L prin înlăturarea lui xi din succesiunea xixj ,
când aceasta există.
Acum, definim o înmulţire specială de matrice, numită înmulţirea latină şi notată
prin ” ∗”, după cum urmează: a) înmulţirea se face linii prin coloane; b) în locul înmulţirii
obişnuite se face o alăturare de elemente, dacă acestea nu se repetă, sau se scrie 0 în caz
contrar; c) în locul adunării obişnuite se iau grupele obţinute la b), când avem astfel de
grupe. Prescurtat, vom scrie L ∗ 𝐿̃ = L2. Analog, calculăm L2 ∗ 𝐿̃= L3, . . . , Lk−1 ∗ 𝐿̃ = Lk. Se
observă că Lk conţine toate drumurile elementare de lungime k.
Prin urmare, în matricea Ln−1 figurează toate drumurile hamiltoniene. Dacă dorim
să obţinem circuitele hamiltoniene se va calcula Ln, dar admitem, ca excepţie, situaţia de
repetare a primului şi a ultimului vârf (cel care închide circuitul).
a d
c e
Fig.3
Scriem matricea latină L, iar apoi din ea găsim 𝐿̌ prin suprimarea primei litere:
4
a b c d e a b c d e
a 0 ab ac 0 0 a 0 b c 0 0
L= b 0 0 bc 0 be 𝐿̌= b 0 0 c 0 e
c 0 0 0 cd 0 c 0 0 0 d 0
d da db 0 0 de d a b 0 0 e
e 0 0 ec 0 0 e 0 0 c 0 0
Acum calculăm
a b c d e
b 0 0 bec bcd 0
dbc
e 0 0 0 ecd 0
Apoi avem:
a b c d e
d 0 0 dabc 0 dabe
dbec
e ecda ecdb 0 0 0
5
şi
a b c d e
a 0 0 0 abecd acdbe
abcde
b
L4=L3∗ 𝐿̃= becda 0 0 0 0
c 0 0 0 0 cdabe
d 0 0 dabec 0 0
e 0 ecdab 0 0 0
În concluzie, graful dat are 7 drumuri hamiltoniene: d1H = {a, b, e, c, d}, d2H =
{a, c, d, b, e}, d3H ={a, b, c, d, e}, d4H ={b, e, c, d, a}, d5H ={c, d, a, b, e}, d6H ={d, a, b, e, c} şi
d7H ={e, c, d,a, b}.
Pentru a obţine circuitele hamiltoniene se va calcula L5 = L4 ∗ ̃𝐿, dar acum se va admite ca
primul şi ultimul vârf să se repete.
a b c d e
L5=L4∗ 𝐿̃=
a abecda 0 0 0 0
b 0 becdab 0 0 0
c 0 0 cdabec 0 0
d 0 0 0 dabecd 0
e 0 0 0 0 ecdabe
În multe probleme practice suntem puşi în situaţia de a ataşa fiecărui arc din graful
asociat problemelor respective un număr (timp de deplasare de-a lungul arcului, cost de
transport de-a lungul arcului, beneficiu etc.) care, într-o astfel de situaţie, se interpretează
ca lungimea sau capacitatea arcului. De obicei, într-o astfel de problemă practică se cere
drumul de lungime optimă (maximă sau minimă), distanța în timp, cost sau capacitate.
Vom mai considera că graful asociat problemei nu are circuite, dar are un vârf de
6
intrare x1 şi un vârf de ieşire xn.
Algoritmul elementar (Bellman). El are la bază principiul de optimalitate al lui Bellman:
orice politică optimală este formată din subpolitici optimale.
Prin acest algoritm fiecărui vârf xi i se ataşează un număr di, reprezentând lungimea
minimă a drumurilor de la x1 la xi măsurată ca distanță, cost, consum de combustibil, ca distanță
în timp(timp necear), număr de oameni pe lucrare/operațiune(descărcare, încărcare), cantitate de
alimente necesară echipajului între porturi.
Considerăm d1 = 0. Acum, să presupunem că dorim să găsim pe dl, unde vârful xl este
succesorul vârfurilor xi, xj şi xk pana la care au fost deja calculate numerele di, dj şi dk.
Atunci lungimea minimă dl de la x1 la xl se determină prin formula
dl = min(di + cil, dj + cjl, dk + ckl)
unde cil, cjl şi ckl sunt capacităţile corespunzătoare arcelor (xi, xl), (xj, xl) şi (xk, xl).
În formula lui dl subliniem în paranteze valoarea pentru care minimul este atins.
După determinarea tuturor numerelor d1, d2, . . . , dn, valoarea lui dn este lungimea minimă a
drumului de la x1 la xn, iar pornind de la xn spre x1 şi citind vârfurile subliniate, obţinem
drumul de lungime minimă.
Pentru un drum de lungime maximă se lucrează absolut la fel doar ca vom înlocui
minimul cu maximul.
Exemplul 3.2.1. Pentru graful din figura 3 să se afle drumul de lungime minimă.
X2 4 X5 9
X7
2 3
X1 4 3 8 7
9 2
X3 X4 X6
Fig.3
Avem succesiv:
d1 = 0,
d3 = min{d1 + 7} = 7,
d2 = min{d1 + 2, d3 + 4} = min{2, 11} = 2,
d4 = min{d2 + 3, d3 + 9} = min{5, 16} = 5,
d5 = min{d2 + 4, d4 + 8} = min{6, 13} = 6,
d6 = min{d5 + 3, d4 + 2} = min{9, 7} = 7,
d7 = min{d5 + 9, d6 + 7} = min{15, 14} = 14.
7
Prin urmare, lungimea minimă este 14, iar drumul care are această lungime este:
dmin = {x1, x2, x4, x6, x7}. În figura 3 arcele drumului minim sunt dublate cu linie întreruptă.
Algoritmul Bellman–Kalaba. Ideea de lucru este aceeaşi cu cea de la algoritmul elementar:
succesiv, pentru fiecare vârf, se determină câte o cotă (un număr). Căutăm tot drumuri de
lungime minimă. Introducem matricea pătratică 𝐶 = (𝑐𝑖,𝑗 )𝑖,𝑗=1,𝑛 ̅̅̅̅̅
, definită astfel
𝑙(𝑥𝑖 , 𝑥𝑗 ), 𝑑𝑎𝑐ă 𝑒𝑥𝑖𝑠𝑡ă 𝑎𝑟𝑐𝑢𝑙 (𝑥𝑖 , 𝑥𝑗 )
cij ={ 0 , 𝑑𝑎𝑐ă 𝑖 = 𝑗
∞, 𝑑𝑎𝑐ă 𝑛𝑢 𝑒𝑥𝑖𝑠𝑡ă 𝑎𝑟𝑐𝑢𝑙 (𝑥𝑖 , 𝑥𝑗 )
unde l(xi, xj) este lungimea arcului (xi, xj).
Notăm cu lik, 𝑖 = ̅̅̅̅̅1, 𝑛, cota ataşată vârfului xi la pasul k, unde de obicei, luăm li,1 = cin,
când se caută drumul de lungime minimă între x1 şi xn.
Determinăm valorile lik, pas cu pas, prin rezolvarea sistemului
li,k = min (cij + lj,k−1), k = 2, 3, . . . , 𝑖 = ̅̅̅̅̅ ⃐ 𝑛
1, 𝑛, j =1,
Algoritmul se încheie când li,k = li,k+1 situaţie în care l1,k reprezintă lungimea minimă
a drumului de la x1 la xn.
Stabilirea drumului de lungime minimă se face astfel: pornind de la xn, pentru fiecare
arc (xi, xj) se decide apartenenţa sa la drumul minim dacă lj,k − li,k = cij = l(xi, xj).
Practic, algoritmul lucrează după următorii paşi:
Pasul 1. Se scrie matricea C.
Pasul 2. Se calculează cotele li,1, 𝑖 = 1,̅̅̅̅̅
𝑛. Pentru aceasta matricei C i se adaugă ultima
coloană, pe care o notăm cu li,1. Apoi, se înmulţeşte C cu această coloană li,1 după regula:
înmulţirea se înlocuieşte cu adunare, iar adunarea cu operaţia de luare a minimului. Rezultă
astfel valorile de pe coloana li,2.
Pasul 3. Procesul de la pasul 2 se repetă cu coloana li,2 ş.a.m.d. până se obţin două coloane
identice li,k şi li,k+1.
Exemplul 3.2.2. Să găsim drumul de lungime minimă din graful dat în figura 3 utilizând
algoritmul Bellman–Kalaba.
4 x5
X2 9
X7
2 3
X1 4 3 8 7
9 2
X3 x4 x6
Obtinem succesiv
8
x1 x2 x3 x4 x5 x6 x7 li,1 li,2 li,3 li,4 li,5
x1 0 2 7 ∞ ∞ ∞ ∞ ∞ ∞ 15 14 14
x2 ∞ 0 ∞ 3 4 ∞ ∞ ∞ 13 12 12 12
x3 ∞ 4 0 9 ∞ ∞ ∞ ∞ ∞ 17 16 16
x4 ∞ ∞ ∞ 0 8 2 ∞ ∞ 9 9 9 9
x5 ∞ ∞ ∞ ∞ 0 3 9 9 9 9 9 9
x6 ∞ ∞ ∞ ∞ ∞ 0 7 7 7 7 7 7
x7 ∞ ∞ ∞ ∞ ∞ ∞ 0 0 0 0 0 0