1 / 138

Kap 10 Graf

Kap 10 Graf. Definisjon av graf. En graf G er en ordnet mengde G = (V,E) hvor - V er en mengde bestående av elementer kalt punkter / noder (vertics) - E er en mengde bestående av elementer kalt kanter (edges). Hvert element e i E er gitt ved et entydig uordnet par av

leone
Download Presentation

Kap 10 Graf

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Kap 10 Graf

  2. Definisjon av graf En graf G er en ordnet mengde G = (V,E) hvor - V er en mengde bestående av elementer kalt punkter / noder (vertics) - E er en mengde bestående av elementer kalt kanter (edges). Hvert element e i E er gitt ved et entydig uordnet par av punkter / noder e = [u,v]

  3. Ordnet graf Grafen kalles ordnet hvis hvert element e i E er gitt ved et ordnet par av punkter / noder e = (u,v)

  4. Endepunkter / Naboer Anta at e = [u,v] . u og v kalles da endepunkter til e. u og v sies også å være naboer (adjacent nodes).

  5. Grad Med graden til u deg(u) mener vi antall elementer e i E som inneholder u.

  6. Isolert punkt u kalles for et isolert punkt hvis deg(u) = 0

  7. Utgrad / Inngrad La G = (V,E) være en ordnet graf og la u være et element (punkt) i V. Med utgraden til u outdeg(u) mener vi antall kanter som går ut fra u. Med inngraden til u indeg(u) mener vi antall kanter som går inn til u.

  8. Vei P av lengde n Med en vei (path) P av lengde n, Len(P) = n, mellom to punkter u og v mener vi en sekvens av n+1 punkter P = (v0 ,v1 ,v2 ,.......,vn) slik at u = v0 v = vn vi-1 og vi er naboer for i = 1,2,....,n

  9. Lukket vei Veien P sies å være lukket hvis vn = v0.

  10. Enkel vei Veien P sies å være enkel hvis alle vi er ulike med unntak av vn som kan være lik v0.

  11. Syklus En syklus er en lukket enkel vei P med Len(P) >= 3. En syklus med lengde k kalles en k-syklus.

  12. Sammenhengende graf En graf G = (V,E) kalles sammenhengende (connected) hvis det for hvert par av punkter u og v i V finnes en vei P mellom dem.

  13. Komplett graf En graf G = (V,E) kalles komplett hvis hvert punkt u i V er nabo til et vilkårlig annet punkt v i V.

  14. Tre En sammenhengende graf G uten sykluser kalles et tre.

  15. Labeled graf En graf G = (V,E) kalles labeled hvis det til en eller flere kanter e i E er assosiert data.

  16. Vektgraf En graf G = (V,E) en vektgraf hvis det til hver kant e i E er assosiert et ikke-negativt tall w(e) kalt lengden av e. I et slikt tilfelle er hver vei P i G assosiert med en vekt w(P) som er lik summen av kantlengdene langs veien i P. 1 2 7 0

  17. Multiple kanter Ulike kanter e1 og e2 kalles multiple kanter hvis de forbinder de samme endepunktene e1 = [u,v] og e2 = [u,v] .

  18. Loop En kant kalles en loop hvis den har identiske endepunkter e = [u,u] .

  19. Multigraf Med en multigraf mener vi en graf som kan inneholde loops og/eller multiple kanter.

  20. Rettet graf Med en rettet graf mener vi en ordnet multigraf.

  21. Implementering av graf Ulike implementeringer av en graf: - Nabo-matrise - Vekt-matrise - Lenket liste

  22. Nabo-matrise La G = (V,E) være en graf. La V inneholde n punkter v1, v2, v3, …, vn . Vi definerer n x n nabo-matrisen A = (aij) ved:

  23. Nabo-matrise for uordnet graf Graf Nabo-matrise a b c d e a 0 1 0 1 1 b 1 0 0 0 1 A = c 0 0 0 1 0 d 1 0 1 0 0 e 1 1 0 0 0 Utsagnet: Det finnes en e E slik at e = [vi,vj] er ekvivalent med utsagnet: Det finnes en e E slik at e = [vj,vi] . Herav følger at nabo-matrisen A er symmetrisk, dvs A = AT .

  24. Nabo-matrise for ordnet graf Graf Nabo-matrise a b c d e a 0 1 0 1 0 b 0 0 0 0 0 A = c 0 0 0 1 0 d 0 0 0 0 0 e 1 1 0 0 0 Denne nabo-matrisen er ikke symmetrisk.

  25. Beregning av antall veier av gitt lengde Teorem: La A = (aij) være nabo-matrisen til grafen G. La AK = (a(K)ij) (a(K)ij) vil da angi antall veier av lengde K mellom punktene i og j. Bevis: Teoremet er opplagt sant for K = 1. Anta at påstanden er sanne for K = R-1. Vi skal vise at da er påstanden sann for K = R. Vi har: Elementet a(R)ij i matrisen A fremkommer ved følgende: a(R-1)ik angir antall veier av lengde R-1 mellom i og k akj angir antall veier av lengde 1 mellom punktene k og j. Produktet vil da angi antall veier av lengde R som går fra i til j via k. Ved å summere dette produktet over alle punkter k, vil vi få totalt antall veier av lengde R mellom i og j.

  26. Beregning av antall veier av gitt lengde Graf Nabo-matrise a b c d a 0 1 1 1 A = b 0 0 1 0 c 0 0 0 0 d 0 0 1 0 0 1 1 1 0 1 1 1 0 0 2 0 A = 0 0 1 0 0 0 1 0 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 Det går 2 veier med lengde 2 mellom punktene a og c. 2

  27. Beregning av antall veier mellom to punkter AK angir antall veier av lengde K mellom to punkter Br = A + A2 + A3 + … + Ar angir antall veier av lengde r eller mindre mellom to punkter Bn angir antall veier mellom to punkter (n = antall punkter)

  28. Vei-matrise En vei-matrise P = (pij) defineres ved følgende: Herav får vi ( Bn = (bij) ):

  29. Antall veier av gitt lengde - Algoritme antVei (A,n,p1,p2,lengde) /* Finner antall veier med gitt lengde mellom to punkter. */ /* A: Nabo-matrisen */ /* n : Dimensjon til nabo-matrisen */ /* p1 : Punkt nr 1 */ /* p2 : Punkt nr 2 */ /* lengde : Gitt veilengde */ /* ant : Returnerer med antall veier med gitt lengde */ /* mellom punktene p1 og p2 */ power(A,n,lengde,kMat) // beregner AK return kMat(p1,p2)

  30. Vei-eksistens - Algoritme 1 Vei_Eksistens (A,n,p1,p2,eksist) /* Finner ut hvorvidt det eksisterer en vei mellom to gitt punkter. */ /* A: Nabo-matrisen */ /* n : Dimensjon til nabo-matrisen */ /* p1 : Punkt nr 1 */ /* p2 : Punkt nr 2 */ eksist := False IF A(p1,p2) != 0 THEN eksist := True ELSE k := 2 WHILE (k <= n) AND (NOT eksist) DO power(A,n,k,kMat) IF kMat(p1,p2) != 0 THEN eksist := True ELSE k := k + 1 ENDIF ENDWHILE ENDIF Return eksist

  31. Vei-eksistens - Warsalls algoritme Vi definerer en sekvens av boolske n * n matriser Pk (inneholder 0 eller 1) ved: Warsall oppdaget følgende:

  32. Vei-eksistens - Algoritme 2 vei_Matrise_P (A,n,P) /* Bestemmelse av veimatrisen P */ /* A : Nabo-matrisen */ /* n : Dimensjon til A og P */ /* P : Vei-matrisen */ FOR i := 1 TO n DO // initiering av P P = A FOR j := 1 TO n DO P[i,j] := A[i,j] ENDFOR ENDFOR FOR k := 1 TO n DO FOR i := 1 TO n DO FOR j := 1 TO n DO P[i,j] := P[i,j] v (P[i,k] ^ P[k,j]) // oppdatering av P ENDFOR ENDFOR ENDFOR

  33. Gjennomløping av en graf Dybde først gjennomløp Bredde først gjennomløp Dybde først gjennomløp kan programmeres rekursivt. Der hvor rekursiv programmering ikke benyttes, gjøres bruk av følgende: - Stakk ved dybde først gjennomløp - Kø ved bredde først gjennomløp Ved slikt gjennomløp kan vi assosiere tre ulike status-tilstander til hvert punkt i grafen: - Status = 1 : Klar status. Initieringsstatus til et punkt. - Status = 2 : Vente status. Punktet befinner seg i en stakk/kø og venter på å bli prosessert. - Status = 3 : Ferdig status. Punktet er prosessert.

  34. Dybde først gjennomløp - Velg et startpunkt A. - Besøk en nabo til A. - Besøk naboene til naboene til A osv. Dybde_Traversal Initialiser alle punktene (status = 1) Push valgt startpunkt A til stakken og sett status(A) = 2 REPEAT Pop punktet N fra stakken Prossesser N og sett status(N) = 3 Push alle naboene (som har status = 1) til N til stakken og sett status = 2 for alle disse UNTIL stakken er tom

  35. Dybde først gjennomløp - Rekursjon dybde_Traversal (A,n,visit) sokFra(k) visit[k] := True // søking med utgangspunkt i punktet k FOR j := 1 TO n DO IF (NOT Visit[j]) AND (A[k,j] <> NULL THEN sokFra(j) ENDIF ENDFOR FOR i := 1 TO n DO // hoved-del visit[i] := False ENDFOR FOR i := 1 TO n DO IF NOT visit[i] THEN sokFra(i) ENDIF ENDFOR

  36. Bredde først gjennomløping - Velg et startpunkt A. - Besøk alle naboene til A. - Besøk alle naboene til naboene til A osv. Bredde_Traversal Initialiser alle punktene (Status = 1) Adder valgt startpunkt A til køen og sett Status[A] = 2 REPEAT Fjern punktet N i køen. Prosesser N og sett Status[N] = 3 Adder til køen alle naboene (med Status = 1) til N og sett Status = 2 for alle disse UNTIL køen er tom

  37. Vekt-graf Vi skal se nærmere på en vekt-graf, dvs en graf hvor hver kant er tilordnet et ikke-negativt tall. En slik graf kalles også for et nettverk.

  38. Vekt-matrise La G være en vekt-graf med n noder. La w(e) være vekten tilordnet kanten e. På samme måte som vi tidligere har laget en nabo-matrise, lager vi nå en såkalt vekt-matrise W gitt ved:

  39. Vekt-graf med tilhørende vekt-matrise Vekt-graf Vekt-matrise 1 2 3 4 5 1 0 7 9 3 2 W = 2 7 0 4 6 0 3 9 4 0 8 0 4 3 6 8 0 4 5 2 0 0 4 0

  40. Minimalisering ved gjennomløping av en graf Vi skal nå forsøke å besvare følgende to spørsmål: 1. Hvordan skal vi ut fra et eksisterende nettverk hvor det finnes en vei mellom alle punktene, konstruere et nytt nettverk slik at det fremdeles finnes en vei mellom alle punktene, men nå slik at den totale summen av kantene blir mint mulig? 2. Hvordan skal vi finne den korteste veien mellom to gitte punkter?

  41. Minimum utspent tre - Alle punktene skal være med i treet - Den totale kant-vekten er minimalisert min_Utspent_Tre Inkluder (velg) et vilkårlig punkt REPEAT FOR alle punkter NOT inkludert DO Inkluder det punktet som har en kant med minimal vekt og som samtidig er knyttet til et av punktene som allerede er inkludert Adder dette punktet og kanten til treet ENDFOR UNTIL alle punkter er inkludert

  42. Minimum utspent tre Korteste kant fra inkludert punkt til ikke-inkludert punkt: Begynner med et vilkårlig punkt (her 1) Korteste kant fra punt 1 er kanten til punkt 5 Korteste kant er fra punkt 1 til punkt 4 Korteste kant er fra punkt 4 til punkt 2 Korteste kant er fra punkt 2 til punkt 3

  43. Korteste veimellom to gitte punkter Hvordan skal vi finne korteste vei mellom to gitte punkter? Vi ønsker å finne en matrise Q som er slik at qij = lengden av den korteste veien mellom vi og vj. Vi definerer en sekvens av matriser Q0, Q1, Q2, …, Qn slik at: Vi sammenligner en gitt vei mellom to punkter i og j ved å sammenligne med en annen vei ved å gå innom et annet punkt k.

  44. Korteste veimellom to gitte punkter Vekt-graf Vekt-matrise 7 R S T U R 7 5 0 0 W = S 7 0 0 2 T 0 3 0 0 U 4 0 1 0 5

  45. 7 Korteste veimellom to gitte punkter 5 5 7 5 u u Q0 = 7 u u 2 u 3 u u 4 u 1 u RR RS - - SR - - SU - TS - - UR - UT - R S T U = 1 2 3 4 7 5 u u Q1 = 7 12 u 2 u 3 u u 4 9 1 u RR RS - - SR SRS - SU - TS - - UR URS UT - 7 5 u 7 Q2 = 7 12 u 2 10 3 u 5 4 9 1 11 RR RS - RSU SR SRS - SU TSR TS - TSU UR URS UT URS 7 5 u 7 Q3 = 7 12 u 2 10 3 u 5 4 4 1 6 RR RS - RSU SR SRS - SU TSR TS - TSU UR UTS UT UTSU 7 5 8 7 Q4 = 6 6 3 2 9 3 6 5 4 4 1 6 RR RS RSUT RSU SUR SUTS SUT SU TSUR TS TSUT TSU UR UTS UT UTSU

  46. Korteste veimellom to gitte punkter 7 min_Vei (w,q,n) u := maxInt FOR i := 1 TO n DO // initiering av q FOR j := 1 TO n DO IF w[i,j] = null THEN q[i,j] := u ELSE q[i,j] := w[i,j] ENDIF ENDFOR ENDFOR FOR k := 1 TO n DO // oppdatering av q FOR i := 1 TO n DO FOR j := 1 TO n DO q[i,j] := min(q[i,j],q[i,k]+q[k,j]) ENDFOR ENDFOR ENDFOR 5 5

  47. Korteste-vei algoritmeDijkstra - Strategi / Algoritme Dijkstra (source,n) FOR v := 1 TO n DO dist[v] := infinity prev[v] := undefined ENDFOR dist[source] := 0 Q := set of all nodes in Graph finish := false WHILE Q is not empty AND not finished DO u := vertex in Q with smallest dist IF dist[u] = infinity THEN finished := true ELSE remove u from Q FOR each neghbour v of u DO alt := dist[u] + dist_between(u,v) IF alt < dist[v] dist[v] := alt prev[v] := u decrease_key v in Q ENDIF ENDFOR ENDWHILE S T S T S := empty sequence u := target WHILE prev[u] is defined DO insert u at the beginning of S u = prev[v] ENDWHILE

  48. 1 4 1 2 3 4 1 inf 5 inf inf 2 7 3 inf inf 3 inf 3 inf inf 4 4 inf 1 inf 4 Korteste-vei algoritmeDijkstra - Eks 2 7 1 5 3 2 3 1 2 3 4 1 inf 5 inf inf 2 7 3 inf inf 3 inf 3 inf inf 4 4 inf 1 inf Dijkstra (source,n) FOR v := 1 TO n DO dist[v] := infinity prev[v] := undefined ENDFOR dist[source] := 0 Q := set of all nodes in Graph finish := false WHILE Q is not empty AND not finished DO u := vertex in Q with smallest dist IF dist[u] = infinity THEN finished := true ELSE remove u from Q FOR each neghbour v of u DO alt := dist[u] + dist_between(u,v) IF alt < dist[v] dist[v] := alt prev[v] := u decrease_key v in Q ENDIF ENDFOR ENDWHILE dist prev Q u v alt 1 2 3 4 4 S := empty sequence u := target WHILE prev[u] is defined DO insert u at the beginning of S u = prev[v] ENDWHILE 4 1 1 3 5 3 2

  49. 1 4 1 2 3 4 1 inf 5 inf inf 2 7 3 inf inf 3 inf 3 inf inf 4 4 inf 1 inf 4 Korteste-vei algoritmeDijkstra - EksInit 2 7 1 5 3 2 3 1 2 3 4 1 inf 5 inf inf 2 7 3 inf inf 3 inf 3 inf inf 4 4 inf 1 inf Dijkstra (source,n) FOR v := 1 TO n DO dist[v] := infinity prev[v] := undefined ENDFOR dist[source] := 0 Q := set of all nodes in Graph finish := false WHILE Q is not empty AND not finished DO u := vertex in Q with smallest dist IF dist[u] = infinity THEN finished := true ELSE remove u from Q FOR each neghbour v of u DO alt := dist[u] + dist_between(u,v) IF alt < dist[v] dist[v] := alt prev[v] := u decrease_key v in Q ENDIF ENDFOR ENDWHILE dist prev Q u v alt 1 inf undef 2 inf undef 3 inf undef 4 inf undef

  50. 1 4 1 2 3 4 1 inf 5 inf inf 2 7 3 inf inf 3 inf 3 inf inf 4 4 inf 1 inf 4 Korteste-vei algoritmeDijkstra - EksInit source - Min Heap 2 7 1 5 3 2 3 1 2 3 4 1 inf 5 inf inf 2 7 3 inf inf 3 inf 3 inf inf 4 4 inf 1 inf Dijkstra (source,n) FOR v := 1 TO n DO dist[v] := infinity prev[v] := undefined ENDFOR dist[source] := 0 Q := set of all nodes in Graph finish := false WHILE Q is not empty AND not finished DO u := vertex in Q with smallest dist IF dist[u] = infinity THEN finished := true ELSE remove u from Q FOR each neghbour v of u DO alt := dist[u] + dist_between(u,v) IF alt < dist[v] dist[v] := alt prev[v] := u decrease_key v in Q ENDIF ENDFOR ENDWHILE dist prev Q u v alt 1 inf undef 1 2 inf undef 2 3 inf undef 3 4 0undef 4

More Related