Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
ntr-un circuit electric unde arcele reprezint legturi, lungimea sau costul
acestora sunt de regul utilizate ca ponderi.
Este evident faptul c ntr-un asemenea context apar n mod natural probleme legate
de minimizarea costurilor.
n cadrul acestui paragraf vor fi prezentate mai n detaliu dou astfel de probleme
referitoare la grafurile ponderate:
(1) Gsirea drumului cu costul cel mai redus care conecteaz toate punctele
grafulu
(2) Gsirea drumului cu costul cel mai redus care leag dou puncte date.
Prima problem care este n mod evident util pentru grafuri reprezentnd circuite
electrice sau ceva analog, se numete problema arborelui de acoperire minim
(minimum spanning tree problem).
Cea de-a doua problem este util n grafurile reprezentnd hri de trasee (aeriene,
feroviare, turistice) i se numete problema drumului minim (shortest-path
problem).
Aceste probleme sunt tipice pentru o larg categorie de aspecte ce apar n prelucrarea
grafurilor ponderate.
Se impune o precizare.
De regul algoritmii utilizai presupun cutarea prin parcurgere a grafului,
motiv pentru care n mod intuitiv ponderile sunt asociate cu distanele.
n figura 11.a (a) apare o reprezentare grafic a unui graf neorientat ponderat.
1
1
6
1
2
4
5
4
3
3
3
5
4
2
5
(a)
(b)
Fig.11.a Reprezentarea unui graf ponderat i a unui arbore de acoperirie minim asociat
Un arbore de acoperire al lui G este un arbore liber care cuprinde toate nodurile din
N (fig.11.1.(b)).
Costul unui arbore de acoperire este suma costurilor tuturor arcelor cuprinse
n arbore.
arborele de acoperire minim conine arcele cu ponderea cea mai mic care
conecteaz un nod aparinnd unei submulimi cu un nod aparinnd celeilalte
[Se 88].
Costul asociat unui arc reprezint de fapt costul seleciei acelei legturi a
reelei.
Exist mai multe moduri de a construi arbori de acoperire minimi asociai unui graf
ponderat.
u'
v'
U
N-U
Fie G graful ponderat pentru care se dorete determinarea unui arbore de acoperire
minim
1
6
1
5
4
3
4
3
3
(0)
5
(2)
(1)
1
1
3
4
2
6
3
4
(3)
4
5
(4)
2
6
(5)
Unul dintre tablouri, denumit APROPIAT memoreaz n locaia i acel nod din
mulimea U care este la momentul respectiv cel mai apropiat de nodul i din
mulimea N-U.
La fiecare pas al algoritmului se baleaz tabloul COSTMIN pentru a gsi acel nod, s-l
denumim k, aparinnd mulimii N-U, care este cel mai apropiat de nodurile mulimii
U, adic nodul pentru care valoarea COSTMIN[k] este minim.
(1) Pe de o parte apar noi posibiliti de conectare ntre cele dou mulimi
(2) Pe de alt parte costurile unor conexiuni existente se pot reduce prin
introducerea noului nod k n mulimea U.
Valoarea infinit reprezint o valoare mare convenit, astfel nct acest nod s nu
mai poat fi selectat n continuare spre a fi inclus n U.
Se face precizarea c valoarea infinit trebuie s fie mai mare dect costul
oricrui arc al grafului, respectiv mai mare dect costul asociat lipsei arcului.
-----------------------------------------------------------{Implementarea algoritmului lui Prim}
procedure Prim(COST: array[1..n,1..n] of real);
{afiseaz arcele arborelui de acoperire minim pentru un graf
avnd nodurile{1,2,...,n} i matricea COST pentru costurile
arcelor}
var COSTMIN: array[1..n] of real;
APROPIAT: array[1..n] of integer;
i,j,k,min: integer;
{i i j sunt indici. n timpul parcurgerii tabloului
COSTMIN, k este indicele celui mai apropiat nod gsit pna
la momentul curent, iar min=COSTMIN[k]}
begin
for i:= 2 to n do
begin {iniializeaz mulimea U numai cu nodul 1}
COSTMIN[i]:= COST[1,i];
APROPIAT[i]:= 1;
end;
[11.2.1.1.a]
for i := 2 to n do
begin {caut cel mai apropiat nod k din afara lui U,
fa de U}
min := COSTMIN[2];
k := 2;
for j := 3 to n do
if COSTMIN[j]< min then
begin
min:= COSTMIN[j]
k:= j
end;
writeln(k,APROPIAT[k]); {tiprete arcul}
COSTMIN[k]:= infinit; {k se adaug lui U}
for j:= 2 to n do {ajusteaz costurile lui U}
if(COST[k,j]<COSTMIN[j]and COSTMIN[j]<infinit)
then
begin
COSTMIN[j]:= COST[k,j];
APROPIAT[j]:= k
end
end
end; {Prim}
----------------------------------------------------------- n figura 11.2.1.1.b apare urma execuiei algoritmului lui Prim aplicat grafului din figura
11.2.1.1.a.(0).
(0) initializare
Nod
1 2 3 4 5 6
Nod
1 2 3 4 5 6
Apropiat
1 1 1 1 1
Apropiat
CostMin
6 1 5
CostMin
U={1}
N-U={2,3,4,5,6}
3 -
1 3 3
5 6 4
U={1,3}
N-U={2,4,5,6}
Nod
1 2 3 4 5 6
Nod
1 2 3 4 5 6
Apropiat
6 3 -
Apropiat
CostMin
2 6
CostMin
3 -
U={1,3,6}
N-U={2,4,5}
3 -
1 2 3 4 5 6
-
U={1,3,6,4}
N-U={2,5}
3 -
Apropiat
CostMin
- 2 -
U={1,3,6,4,2}
N-U={5}
Nod
1 2 3 4 5 6
Apropiat
CostMin
- -
U={1,3,6,4,2,5}
N-U={ }
Pentru valori mari ale lui n, performana algoritmului poate deveni nesatisfctoare.
Dup cum s-a precizat n &10.4.3, considernd nodurile unui graf divizate n trei clase,
arbore, vecintate i nentlnite, atunci metodele de traversare a grafului se
difereniaz dup maniera n care sunt alese nodurile care trec din clasa vecintate n
clasa arbore.
Astfel la traversarea n adncime se alege din vecintate nodul cel mai recent
ntnit (ultimul) ceea ce corespunde utilizrii unei stive n pstrarea nodurilor
clasei vecintate.
Structura de date care poate fi asociat acestei metode este coada bazat pe prioritate.
n secvena [11.2.2.a] se prezint o metod de determinare a arborelui minim bazat pe
considerentele mai sus precizate.
(2) Dac nodul k apare n coad ns are un cost mai mare (adic o prioritate
mai mic) dect cea precizat ca parametru se realizeaz schimbarea
prioritii sale la valoarea p.
-----------------------------------------------------------PROCEDURE ArboreMinim;
VAR id,k: integer;
marc: ARRAY[1..maxN] OF integer;
parinte: ARRAY[1..maxN] OF integer;
q: CoadaBazataPePrioritate;
PROCEDURE CautaPrioritar(k:integer);
VAR t: legatura;
BEGIN
[1] IF Actualizeaza(q,k,nevazut) THEN parinte[k]:= 0;
[2] REPEAT
[3]
id:= id + 1;
[4]
k:= Extrage(q);
[5]
marc[k]:= -marc[k]; {k trece n clasa "arbore"}
[6]
IF marc[k] = nevazut THEN marc[k]:= 0;
[7]
t := Stradj[k]
[8]
WHILE t <> nil DO
[11.2.2.a]
BEGIN
[9]
IF marc[t^.nume]<0 THEN {nevizitat sau in coada}
[10]
IF Actualizeaza(q,t^.nume,t^.cost) THEN
BEGIN
[11]
marc[t^.nume]:= -(t^.cost); {nodul t^.nume
trece n clasa "vecinatate"}
[12]
parinte[t^.nume]:= k
END;
[13]
t := t^.urm
END
[14] UNTIL Vid(q)
END; {CautaPrioritar}
BEGIN
id := 0;Initializeaza(q);
FOR k:= 1 TO N DO marc[k]:= -nevazut;
FOR k:= 1 TO N DO
IF marc[k] = -nevazut THEN CautaPrioritar(k)
END; {ArboreMinim}
------------------------------------------------------------
Arborele de acoperire minim care n acest caz este un arbore de cutare bazat pe
prioritate, este pstrat n tabloul parinte n reprezentarea indicator spre printe.
Fiecare locaie a tabloului memoreaz printele nodului n cauz respectiv nodul care a
determinat mutarea respectivului nod din clasa vecintate n clasa arbore.
De altfel, pentru fiecare nod k al arborelui, marc[k] reprezint costul arcului care-l
leag pe k de printele su printe[k].
(1) Nodurile din clasa arbore sunt marcate cu valori pozitive n tabloul marc
(2) Nodurile din clasa "vecintate" sunt marcate cu valori negative (linia [11])
Dup cum se va vedea, de fapt soluiile propuse se ntreptrund i ele nu sunt dect
cazuri particulare ale unui algoritm generalizat de cutare bazat pe prioriti.
O alt metod de construcie a unui arbore de acoperire minim, este algoritmul lui
Kruskal
Algoritmul lui Kruskal pornete de la un graf T=(N,) care const doar din
cele n noduri ale grafului original G, dar care nu are nici un arc.
Pentru a construi componente din ce n ce mai mari se examineaz arcele din mulimea
A n ordinea cresctoare a costului lor.
Dac arcul selectat conecteaz dou noduri aparinnd unor componente conexe
distincte, arcul respectiv este adugat grafului T.
1
6
1
5
4
3
2
(0)
(1)
4
3
2
6
(3)
1
1
6
(2)
1
1
3
3
3
4
6
(4)
4
4
2
6
(5)
Fig.11.2.3.a. Construcia unui arbore de acoperire minim pe baza algoritmului lui Kruskal