Notiuni generale. În general, pentru situaţiile care necesită la rezolvare un oarecare efort mintal (şi un caz tipic este cel al celor din economie), se caută, în primul rând, o metodă de reprezentare a lor care să permită receptarea întregii probleme dintr-o privire (pe cât posibil) şi prin care să se evidenţieze cât mai clar toate aspectele acesteia. În acest scop se folosesc imagini grafice gen diagrame, schiţe, grafice etc. O reprezentare dintre cele mai utilizate este cea prin grafuri. Acestea sunt utilizate în special pentru vizualizarea sistemelor şi situaţiilor complexe. În general, vom reprezenta componentele acestora prin puncte în plan iar relaţiile (legăturile, dependenţele, influenţele etc) dintre componente prin arce de curbă cu extremităţile în punctele corespunzătoare. Între două puncte pot exista unul sau mai multe segmente (în funcţie de câte relaţii dintre acestea, care ne interesează, există) iar segmentelor li se pot asocia sau nu orientări (după cum se influenţează cele două componente între ele), numere care să exprime intensitatea relaţiilor dintre componente etc. Este evident, totuşi, că această metodă are limite, atât din punct de vedere uman (prea multe puncte şi segmente vor face desenul atât de complicat încât se va pierde chiar scopul pentru care a fost creat – claritatea şi simplitatea reprezentării, aceasta devenind neinteligibilă) cât şi din punct de vedere al tehnicii de calcul (un calculator nu poate "privi" un desen ca un om).
definitia grafurilor tipuri de grafuri algoritmi pentru determinarea drumului minim intr-un graf
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Notiuni generale.
În general, pentru situaţiile care necesită la rezolvare un oarecare efort
mintal (şi un caz tipic este cel al celor din economie), se caută, în primul rând,
o metodă de reprezentare a lor care să permită receptarea întregii probleme
dintr-o privire (pe cât posibil) şi prin care să se evidenţieze cât mai clar toate
aspectele acesteia.
În acest scop se folosesc imagini grafice gen diagrame, schiţe, grafice
etc. O reprezentare dintre cele mai utilizate este cea prin grafuri. Acestea
sunt utilizate în special pentru vizualizarea sistemelor şi situaţiilor complexe.
În general, vom reprezenta componentele acestora prin puncte în plan iar
relaţiile (legăturile, dependenţele, influenţele etc) dintre componente prin arce
de curbă cu extremităţile în punctele corespunzătoare. Între două puncte pot
exista unul sau mai multe segmente (în funcţie de câte relaţii dintre acestea,
care ne interesează, există) iar segmentelor li se pot asocia sau nu orientări
(după cum se influenţează cele două componente între ele), numere care să
exprime intensitatea relaţiilor dintre componente etc.
Este evident, totuşi, că această metodă are limite, atât din punct de
vedere uman (prea multe puncte şi segmente vor face desenul atât de
complicat încât se va pierde chiar scopul pentru care a fost creat – claritatea
şi simplitatea reprezentării, aceasta devenind neinteligibilă) cât şi din punct de
vedere al tehnicii de calcul (un calculator nu poate "privi" un desen ca un
om).
Din acest motiv, alături de expunerea naiv-intuitivă a ceea ce este un
graf, dată mai sus, se impune atât o definiţie riguroasă cât şi alte modalităţi de
reprezentare a acestora, adecvate în general rezolvărilor matematice.
Definiţia 1 Se numeşte multigraf un triplet G = (X, A, f) în care X şi A
sunt două mulţimi iar f este o funcţie, definită pe produsul vectorial al lui X cu
el însuşi (X2 = X×X), care ia valori în mulţimea părţilor mulţimii A (notată P(A))
Mulţimea X se numeşte mulţimea nodurilor multigrafului şi elementele
sale se numesc noduri (sau vârfuri) ale multigrafului, iar A reprezintă
mulţimea relaţiilor (legăturilor) posibile între două noduri ale multigrafului.
Definiţia 2 Se numeşte graf orientat un multigraf în care mulţimea A
are un singur element: A = {a}.
În acest caz mulţimea părţilor mulţimii A are doar două elemente:
mulţimea vidă ∅ şi întreaga mulţime A. Dacă unei perechi orientate (xi, xj) din
X2 i se asociază prin funcţia f mulţimea A atunci spunem ca există arc de la
nodul xi la nodul xj iar perechea (xi,xj) se va numi arcul (xi,xj). Nodul xi se
numeşte nod iniţial sau extremitate iniţială a arcului (xi,xj) iar nodul xj se
numeşte nod final sau extremitate finală a arcului (xi,xj). Arcul (xi,xj) este
incident spre interior vârfului xj şi incident spre exterior vârfului xi. Dacă
pentru un arc nodul iniţial coincide cu nodul final atunci acesta se numeşte
buclă. Nodurile xi şi xj se vor numi adiacente dacă există cel puţin unul din
arcele (xi,xj) şi (xj,xi).
Dacă unei perechi orientate (xi, xj) din X2 i se asociază prin funcţia f
mulţimea vidă ∅ atunci spunem că nu există arc de la nodul xi la nodul xj.
Este evident că a cunoaşte un graf orientat este echivalent cu a
cunoaşte vârfurile şi arcele sale. Din acest motiv putem defini un graf orientat
prin perechea (X,U), unde X este mulţimea vârfurilor sale iar U mulţimea
arcelor sale.
De asemenea, putem cunoaşte un graf orientat cunoscând mulţimea
nodurilor şi, pentru fiecare nod, mulţimea arcelor incidente spre exterior. Din
acest motiv putem defini un graf orientat ca o pereche (X,Γ) unde X este
perechea nodurilor iar Γ este o funcţie definită pe X cu valori înmulţimea
părţilor lui X, valoarea acesteia într-un nod xi, Γ(xi) ⊆ X fiind mulţimea
nodurilor adiacente nodului xi, prin arce pentru care xi este extremitatea
iniţială.
Definiţia 3 Se numeşte graf neorientat un multigraf în care mulţimea
A are un singur element iar funcţia f are proprietatea:
f[(xi,xj)] = f[(xj,xi)] , oricare ar fi nodurile xi şi xj din X
În aceste condiţii, dacă f[(xi,xj)] = f[(xj,xi)] = A atunci perechea
neorientată {xi,xj} este o muchie iar dacă f[(xi,xj)] = f[(xj,xi)] = ∅ spunem că nu
există muchie între vârfurile xi şi xj.
Deoarece, în cele mai multe din cazurile practice care vor fi analizate în acest
capitol, situaţia este modelată matematic printr-un graf orientat, vom folosi,
pentru simplificarea expunerii, denumirea de graf în locul celei de graf
orientat iar în cazul în care graful este neorientat vom specifica acest fapt la
momentul respectiv.
Moduri de prezentare ale unui graf
A. O primă modalitate de reprezentare este listarea efectivă a tuturor
nodurilor şi a arcelor sale.
B. Putem reprezenta graful dând pentru fiecare nod mulţimea nodurilor
cu care formează arce în care el este pe prima poziţie.
C. Putem reprezenta geometric graful, printr-un desen în plan,
reprezentând fiecare nod printr-un punct(cerculeţ) şi fiecare arc
printr-un segment de curbă care are ca extremităţi nodurile arcului şi
pe care este trecută o săgeată orientată de la nodul iniţial spre cel
final.
D. Putem folosi o reprezentare geometrică în care nodurile sunt
reprezentate de două ori, în două şiruri paralele, de la fiecare nod din
unul din şiruri plecând săgeţi spre nodurile cu care formează arce în
care el este pe prima poziţie, de pe al doilea şir (reprezentarea prin
corespondenţă).
E. Un graf poate fi reprezentat printr-o matrice pătratică booleană, de
dimensiune egală cu numărul de noduri, în care o poziţie aij va fi 1
dacă există arcul (xi,xj) şi 0 în caz contrar, numită matricea
adiacenţelor directe.
F. Un graf poate fi reprezentat printr-o matrice pătratică latină, de
dimensiune egală cu numărul de noduri, în care pe o poziţie aij va fi
xixj dacă există arcul (xi,xj) şi 0 în caz contrar.
Exemplu: Dacă în reprezentarea A avem graful G = (X,U), unde X = {x1, x2, x3,
x4, x5, x6} şi U = {(x1,x1), (x1,x2), (x1,x4), (x1,x5), (x2,x3), (x2,x4), (x2,x6), (x3,x1),
(x3,x2), (x4,x5), (x5,x2), (x6,x4)}, atunci în celelalte reprezentări vom avea:
În teoria grafurilor, problema celui mai scurt drum constă în găsirea unui drum astfel încât
suma “costurilor” muchiilor constituente să fie minimă. Un exemplu îl constituie găsirea celei
mai rapide modalităţi de a trece de la o locaţie la alta pe o hartă; în acest caz nodurile sunt
reprezentate de către locaţiile respective, iar muchiile reprezintă segmentele de drum, şi
sunt ponderate, costurile constituind timpul necesar parcurgerii acelui segment.
Formal, fiind dat un graf ponderat (adică, o mulţime de vârfuri V, o mulţime a muchiilor E, şi
o funcţie de cost:
f : E →R
cu valori reale) şi un element v al lui V, să se găsească un drum P de la v la fiecare v′ din V
astfel încât
să fie minim între toate drumurile ce leagă v de v′ .
Uneori mai poate fi recunoscută sub numele de problema drumului cel mai scurt
corespunzător perechii singulare, cu scopul deosebirii acesteia de următoarele generalizări:
• problema drumului cel mai scurt corespunzător sursei unice, o problemă mai
generală, în care trebuie să găsim cele mai scurte drumuri de la un nod sursă v la toate
celelalte noduri ale grafului.
• problema drumului cel mai scurt corespunzător tuturor perechilor reprezintă o
problemă şi mai generală, în care trebuie să găsim cele mai scurte drumuri între oricare
pereche de noduri (vârfuri) v, v′ din graf. Ambele generalizări amintite au algoritmi mai
performanţi în practică decât simpla rulare a algoritmului corespunzător drumului cel mai
scurt în cazul perechii-unice (singulare) pentru toate perechile relevante de vârfuri.
Algoritmi
Cei mai importanţi algoritmi care rezolvă această problemă sunt:
• Algoritmul lui Dijkstra – rezolvă problema sursei unice, dacă toate muchiile sunt
ponderate pozitiv Acest algoritm poate genera cele mai scurte drumuri de la un
anumit punct de placare s la toate celelalte noduri.
• Algoritmul Bellman-Ford – rezolvă problema sursei unice şi pentru costuri negative
ale muchiilor.
• Algoritmul Floyd-Warshall – rezolvă problema celor mai scurte drumuri
corespunzătoare tuturor perechilor.
• Algoritmul lui Kruskal este un algoritm în teoria grafurilor care găsește arborele
parțial de cost minim pentru un graf conex ponderat.
Algoritmul lui Dijkstra
Prezentare algoritm
Algoritmul lui Dijkstra este un algoritm care calculeaza drumurile minime de la un nod dat
pana la toate celalalte noduri. Grafurile pe care se aplica acest algoritm sunt, in general,
ponderate si orientate si au un anumit cost de care se va tine seama in calcularea drumului
minim.
Un graf orientat este acel graf care poate avea muchie intre doua noduri cu o singura
directie: ori se merge de la nodul A in nodul B, ori se merge de la nodul B in nodul A
(ambele variante in acelasi timp sunt imposibile, altfel am avea un graf neorientat).
Un graf ponderat, este un graf in care avem asociat un cost fiecarei muchii. In cazul in
care avem un graf neponderat, putem asocia ca drum de la un nod la altul minimul de muchii
prin care se trece.
Algorimul lui Dijkstra, pentru a se putea rula, are nevoie ca date de intrare de un graf
cu “n” noduri, de matricea de adiacenta a acestuia si de costul fieacrei muchii (toate acestea
reprezentand un graf cu toate elementele sale) si nodul de start.
Dupa rularea algoritmului, acesta obtine un vector in care pune distanta minima de la
nodul de start pana la fiecare nod in parte astfel:
• Rout-area optimală. În cazul acestei aplicaţii preocuparea principală o constituie
găsirea drumului caracterizat de flux 60 maxim între două vârfuri. Aceasta reprezintă că, în
loc să considerăm minimul ca în cazul pseudocodului de mai sus, vom fi interesaţi de maxim.
Costurile muchiilor constituie restricţii în ceea ce priveşte fluxul. Costurile drumului
reprezintă „blocaje”.
Astfel, operaţia de sumare de mai sus este înlocuită cu operaţia corespunzătoare minimului.
• Testarea bipartiţiei unui graf neorientat.
Algoritmul lui Bellman – Kalaba
Algoritmul se aplică în grafuri finite care nu au circuite de valoare negativă (pentru o problemă de minim) sau care nu au circuite de valoare pozitivă (într-o problemă de maxim) şi găseşte drumurile de valoare minimă (maximă) de la toate nodurile grafului la un nod oarecare, fixat. Dacă dorim să cunoaştem drumurile de valoare minimă (maximă) între oricare două noduri vom aplica algoritmul, pe rând, pentru fiecare nod al grafului.
Fie G = {x1, x2, ... ,xn} un graf orientat finit. Presupunem (fără a restrânge generalitatea, că am numerotat nodurile astfel încât nodul spre care căutăm drumurile de valoare minimă (maximă) de la celelalte noduri să fie xn.
Pasul 1. Se construieşte matricea pătratică M cu dimensiunea egală cu numărul de noduri ale grafului ale cărei elemente sunt:
Pasul 2. Se adaugă succesiv liniile Li la matricea M, elementele acestora calculându-se prin relaţiile de recurenţă:
1. L1j = mjn j = 1,...,n (prima linie este ultima coloană, transpusă, a matricii M)
2. Lij = min (Li-1,j , (mn1,kmin=
jk + Li-1,k)) într-o problemă de minim
sau Lij = max (Li-1,j , (mn1,kmax=jk + Li-1,k)) într-o problemă de maxim
Pasul 3. După calcularea fiecărei linii noi se compară elementele ei cu cele ale precedentei:
− Dacă Lij = Li-1,j pentru orice j = 1,...,n atunci se opreşte recurenţa şi ultima linie calculată conţine valorile minime ale drumurilor de la celelalte noduri la nodul xn.
− i+1 Dacă există cel puţin un indice j cu Lij ≠ Li-1,j se trece la calcularea noii linii L
Observaţie: Pentru grafuri foarte mari, algoritmul necesită un volum mare de memorie, prin necesitatea memorării matricei M, care este greu de manipulat. Chiar dacă din cele n 2 arce posibile graful ar avea doar un procent foarte mic matricea grafului va avea tot n2 poziţii de memorat şi analizat.
Exemplu: Presupunem dat graful orientat de mai jos, în care se doreşte găsirea drumului de valoare minimă de la nodul x1 la nodul x9.
iar după calcularea liniilor Li obţinem:
Deoarece L4 = L5 oprim calcularea liniilor după calcularea liniei 5. În această linie se află valorile celor mai scurte de la toate nodurile la nodul x9. Drumul dorit de noi (x1 → x9) are valoarea dată de prima poziţie a liniei 5, fiind egal cu 13.
Pentru a găsi acest drum, plecăm înapoi de la linia 4 şi avem: