Referat Determinarea Arborelui Partial De Cost Minim

Mai jos puteti citi fragmente din Referat Determinarea Arborelui Partial De Cost Minim si de asemenea puteti face Download Referat Determinarea arborelui partial de cost minim

Citeste fragmente din Referat Determinarea Arborelui Partial De Cost Minim

Arbori – Notiuni introductive O categorie importanta de grafuri esteaceea in care muchiile sun niste legaturi de tip parinte-fiu.Un astfel de graf se va numi ARBORE. Definitie: Se numeste arbore un graf conex si fara cicluri. Un arbore cu n varfuri are n-1 muchii. Proprietati caracteristice unui arbore: Exista un nod in care nu intra nici un arc numit radacina arborelui. Cu exceptia radacinii, fiecare nod are proprietatea ca in el intra un singur arc. Acesta leaga nodul respectiv de un alt nod numit numit predecesor sau parinte. Dintr-un nod pot iesi unul sau mai multe arce.Fiecare astfel de arc,leaga nodul Respectivd de un alt nod numit Succesor sau fiu al nodului. * Nodurile sunt organizate pe nivele primul nivel fiind ocupat de nodul radacina. Nodurile de pe ultim nivel se caracterizeaza prin faptul ca din ele nu mai iese nici un arc ,si se numesc noduri terminale sau frunze. Nodurile pot contine o asa informatie utila ,carte poate fi de orice tip. Exemplu: Nodul 1 este radacina arborelui. Frunzele arborelui sunt 3,8,9. Algoritmul Prim (scris în 1957 si implementat în 1961 de catre Dijkstra) elimina acest neajuns. Se opereaza cu datele din acelasi graf. Se porneste initial, ca si în algoritmul lui Kruskal cu “n” vârfuri izolati (adica de la cele “n” varfuri, dar fara a fi trasat între aceste vârfuri vre-o muchie), urmând ca pe parcurs aceste vârfuri sa fie legate între ele de arborele cu lungimea minima. Fie G=(X,U) un graf neorientat si conex cu n varfuri. Fiecare muchie se caracterizeaza printr-un numar intreg asociat ,numit cost. Graful este definit prin matricea costurilor, care fiind foarte asemanatoare cu matricea de adiacenta o va inlocui pe aceasta din urma.Notand matricea costurilor cu A , un element Pentru acest graf matricea costurilor completa este: Vom adauga pe rand varfurile grafului la arborele partial.Folosim cei tre vectori -vectorul S,numit vector caracteristic.In timpul constructiei arborelui fiecare element S[i] are valoare 1 daca varful i a fost deja inclus in arborele partial ,respectiv 0 in caz contrar.Asadar t initial toate elementele vectorului sunt 0, iar in momentul includerii unui varf I in arbore facem facem s[i]=1; -vectorul T numit vectorul parintilor . Pentru fiecare i care se adauga arborelui ,elementul T[i] va reprezenta varful parinte al lui i in arbore. -vectorul C, numit vectorul costurilor.Pentru fiecare varf i elementul c[i] va avea valoarea costul muchiei care il leaga de parintele sau in arbore. Luam in considerare doar michiile care au varf in arborele deja construit si celalat varf in afara arborelui. Dintre aceste muchii vom alege una care are costul cel mai mic. “Legam” muchia aleasa in arbore si actualizam vectorii S,T si C. Daca sunt mai multe astfel de muchii care au costul minim, putem alege oricare ,de unde rezulta observatia ca arborele partial de cost minim al unui graf nu este unic. Pentru graful dat exemplu avem initial in arbore varful de start 1 deci la primul pas se iau in considerare muchiile care trec prin varful 1. Pasul 1: initializarea vectorului S[start]=1 start=1; 1 2 3 4 5 1 0 0 0 0 1 2 3 4 5 0 0 0 0 0 1 2 3 4 5 0 0 0 0 0 S= T= C= Pasul 2: cautarea urmatoarei muchii: (1,2) cu costul 13 (1,3) cu costul 16 (1,4) cu costul 13 Alegem muchia cu costul minim:muchia (1,2) pe care o legam in arbore. Actualizam totodata vectorii caracteristici S,T,C. In arbore a aparut varful 2 fapt pe care-l vom remarca in vectorul caracteristic S[2]:=1. Parintele varfului 2 este varful 1 , deci T[2]:=1. Costul muchiei care leaga varful 2 de parintele sau varful 1 muchia (1,2) deci C[2]:=13. 1 2 3 4 5 1 1 0 0 0 dfasfgasg S= 1 2 3 4 5 0 1 0 0 0 T= 1 2 3 4 5 0 13 0 0 0 C= Pasul 3: La pasul al trei-lea alegem tot asa o muchie de cost minim cu o extremitate in arborele deja creat si cealalta extremitate neinclusa inca in arbore. Acum in arbore avem varfurile 1 si 2 deci vom cauta printre muchiile care trec prin aceste varfuri ,”vizitind” liniile 1 si 2 ale matricei costurilor. Intra in discutie muchiile (1,3) cu costul 16 , (1,4) cu costul 13,(2,3) cu costul 12, (2,5) cu costul 15.Atentie! Muchia (1,2)nu o mai luam in considerare deoarece are ambele extremitati deja in graful creat.Dintre aceste muchii o alegem pe cea cu costul minim 12 si anume muchia (2,3).O legam in arbore si actualizam din nou vectorii :S[3]:=1(marcam includerea varfului 3 in arbore),T[3]:=2(parintele varfului mou inclus 3 este 2.),C[3]:=12 (costul muchiei alese (2,3)este 12). 1 2 3 4 5 1 1 1 0 0 S= 1 2 3 4 5 0 1 2 0 0 T= 1 2 3 4 5 0 13 12 0 0 C= Analog lapasul urmator cautam printre muchiile grafului care au o extremitate in multimea {1,2,3} a varfurilor deja incluse si cealalta extremitate in afara.Acestea sunt (1,4),(2,5),(3,4)si (3,5).Doua dintre ele si anume (1,4) si (3,5) au costul cel mai mic, 13.Alegem muchia (1,4) caz in care arborele si vetorii vor arata astfel: 1 2 3 4 5 1 1 1 1 0 S= 1 2 3 4 5 0 1 2 1 0 T= 1 2 3 4 5 0 13 12 13 0 C= In sfarsit la ultimul pas a mai ramas de adugat in arbore varful 5.In final vom obtine arborele partial de cost minim si vectorii de mai jos: 1 2 3 4 5 1 1 1 1 1 S= 1 2 3 4 5 0 1 2 1 3 T= 1 2 3 4 5 0 13 12 13 13 C= In continuare este prezentata procedura de formare a arborelui partial de cost minim: Pentru inceput se initializeaza cu 0 vectorii S,T si C.Intr-un ciclu cu I=1,2,3,..,n atribuim la fiecare pas valoarea 0 elementelor S[i],T[i] si C[i]. Apoi prin S[start]:=1. Elementele T[start] si C[start] nu se modifica ramanand cu valoarea initiala 0, deoarece varful de plecare nu are parinte si ca atare nici muchie care sa-l lege de un astfel de parinte. In continuare vom aduga pe rand in arborre celelate n-1 varfuri. Pentru aceasta este suficient un singur ciclu for, in care contorul k=1,2,3,..,n-1 nu are alt rol decat sa numere adugarile.La fiecare pas adaugam un varf in arbore astfel. Trebuie sa gasim o muchie de cost minim cu o extremitate in arborele deja creat si cealalta extremitate in afara arborelui. Fie aceasta muchie (n1,n2).Pentru a o gasi avem nevoie de o variabila cost_min in care sa memoram costul minim.Initializam cost_min cu Maxint si n1,n2 cu –1. Cautarea muchie se face in matricea costurilor .Parcurgem toata matricea in 2 cicluri for cu liniile i de la 1 la n si coloanele j de la 1 la n.La fiecare pas, gasirea unei astfel de muchii ne obliga sa facem trei testari: -daca varful i este deja in arbore (S[i]=1)si j nu este in arbore(S[j]=0) -daca efectiv exista muchia (i,j) (a[i,j]<>0). -daca costul a[i,j] al acestei muchii este mai mic decat costul minim pe care-l avem in variabila cost_min. In cazul in care toate cele trei conditii de mai sus sunt indeplinte inseamna ca am gasit muchia (i,j) si memoram extremitatile sale in n1 si n2.Contoarele i,j se modifica. Urmeaza adaugarea in arborele existent a muchiei (n1,n2) gasite mai inainte. Cu actualizarea vectorilor: S[n2] :=1; T[n2]:=n1 C[n2]:=a[n1,n2]. Matricea de adiancenta in cazul urmator este: 0 13 16 13 0 13 0 12 0 15 16 12 0 17 13 13 0 17 0 0 0 15 13 0 0 program arbore; uses crt; type vector=array [1..50]of integer; var a:array[1..30,1..30]of integer; n,i,j,k,start,cost_min,n1,n2:integer; S,T,C:vector; {S=Vectorul caracteristic T=Vectorul parintilor C=vectorul costurilor} f:text; {f=fisierul text din care se citeste matricea de adiacenta} procedure citire_matrice;{citeste matricea costurilor} begin assign (f, date.txt ); reset(f); read(f,n); for i:=1 to n do for j:=1 to n do read(f,a[i,j]); close(f); end; procedure afisare_matrice;{adiseaza matricea costurilor} begin writeln ( matricea costurilor este: ); for i:=1 to n do begin for j:=1 to n do write (a[i,j]:3); writeln; end; writeln; end; procedure formare_arbore;{costruieste arborele partial de cost minim} begin for i:=1 to n do {initializeaza cu 0 vectorii S,T,C} begin s[i]:=0; t[i]:=0; c[i]:=0; end; write( dati varful de start: );{citeste varful de start care va fi radacina arborelui,si il adauga in arborele initial vid } readln(start); writeln; s[start]:=1; {intr-un ciclu se aduga pe rand in arbore celelalte n-1 varfuri; contorul k nu are decat rolul de a numara modificarile facute} for k:=1 to n-1 do begin {caut muchia de cost minim cu o extremitate in arbore si cealata in afara;in n1 si n2 memorez extremitatile muchiei} n1:=-1; n2:=-1; cost_min:=maxint; for i:=1 to n do for j:=1 to n do if (s[i]=1)and(s[j]=0)then if (a[i,j]<>0) then if a[i,j]0) then if a[i,j]0 then begin writeln( de la ,t[i], la ,i, de lungime ,c[i], si cost ,c[i]*k); cost:=cost+c[i]*k; end; writeln ( Costul total al investitiei este: ,cost); end; begin clrscr; citire; afisare; formare; afis; readkey; end. PAGE PAGE 1 쥁@