Presentasjon lastes. Vennligst vent

Presentasjon lastes. Vennligst vent

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.

Liknende presentasjoner


Presentasjon om: "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."— Utskrift av presentasjonen:

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 = (v 0,v 1,v 2, ,v n ) slik at u = v 0 v = v n v i-1 og v i er naboer for i = 1,2,....,n

9 Lukket vei Veien P sies å være lukket hvis v n = v 0.

10 Enkel vei Veien P sies å være enkel hvis alle v i er ulike med unntak av v n som kan være lik v 0.

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

17 Multiple kanter Ulike kanter e 1 og e 2 kalles multiple kanter hvis de forbinder de samme endepunktene e 1 = [u,v] og e 2 = [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 v 1, v 2, v 3, …, v n. Vi definerer n x n nabo-matrisen A = (a ij ) ved:

23 Nabo-matrise for uordnet graf a b c d e a b A = c d e GrafNabo-matrise Utsagnet: Det finnes en e  E slik at e = [v i,v j ] er ekvivalent med utsagnet: Det finnes en e  E slik at e = [v j,v i ]. Herav følger at nabo-matrisen A er symmetrisk, dvs A = A T.

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

25 Beregning av antall veier av gitt lengde Teorem:La A = (a ij ) være nabo-matrisen til grafen G. La A K = (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 a kj 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 a b c d a A = b c d Nabo-matriseGraf A = = Beregning av antall veier av gitt lengde Det går 2 veier med lengde 2 mellom punktene a og c.

27 Beregning av antall veier mellom to punkter A K angir antall veier av lengde K mellom to punkter B r = A + A 2 + A 3 + … + A r angir antall veier av lengde r eller mindre mellom to punkter B n angir antall veier mellom to punkter (n = antall punkter)

28 Vei-matrise En vei-matrise P = (p ij ) defineres ved følgende: Herav får vi ( B n = (b ij ) ):

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 A K 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 P k (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 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

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 W = Vekt-matrise Vekt-graf

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 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 - Alle punktene skal være med i treet -Den totale kant-vekten er minimalisert

42 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 Minimum utspent tre

43 Korteste vei mellom to gitte punkter Hvordan skal vi finne korteste vei mellom to gitte punkter? Vi ønsker å finne en matrise Q som er slik at q ij = lengden av den korteste veien mellom v i og v j. Vi definerer en sekvens av matriser Q 0, Q 1, Q 2, …, Q n 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 vei mellom to gitte punkter Vekt-graf R S T U R W = S T U Vekt-matrise 7 5

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

46 Korteste vei mellom to gitte punkter 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 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 7 5 5

47 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 Korteste-vei algoritme Dijkstra - Strategi / Algoritme ST ST S:=empty sequence u:=target WHILEprev[u] is defined DO insert u at the beginning of S u = prev[v] ENDWHILE

48 1234 1inf5infinf 273infinf 3inf3infinf 44inf1inf distprevQuvalt 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 Korteste-vei algoritme Dijkstra - Eks inf5infinf 273infinf 3inf3infinf 44inf1inf S:=empty sequence u:=target WHILEprev[u] is defined DO insert u at the beginning of S u = prev[v] ENDWHILE

49 1234 1inf5infinf 273infinf 3inf3infinf 44inf1inf distprevQuvalt 1infundef 2infundef 3infundef 4infundef 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 Korteste-vei algoritme Dijkstra - Eks Init inf5infinf 273infinf 3inf3infinf 44inf1inf

50 1234 1inf5infinf 273infinf 3inf3infinf 44inf1inf distprevQuvalt 1infundef1 2infundef2 3infundef3 40undef4 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 Korteste-vei algoritme Dijkstra - Eks Init s ource - Min Heap inf5infinf 273infinf 3inf3infinf 44inf1inf

51 1234 1inf5infinf 273infinf 3inf3infinf 44inf1inf distprevQuvalt 1infundef14 2infundef2 3infundef3 40undef 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 Korteste-vei algoritme Dijkstra - Eks Source inf5infinf 273infinf 3inf3infinf 44inf1inf

52 1234 1inf5infinf 273infinf 3inf3infinf 44inf1inf distprevQuvalt 1infundef14 2infundef2 3infundef3 40undef 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 Korteste-vei algoritme Dijkstra - Eks Nabo til node inf5infinf 273infinf 3inf3infinf 44inf1inf distprevQuvalt infundef2 3infundef3 40undef distprevQuvalt infundef undef

53 1234 1inf5infinf 273infinf 3inf3infinf 4441inf distprevQuvalt infundef undef 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 Korteste-vei algoritme Dijkstra - Eks Nabo til node inf5infinf 273infinf 3inf3infinf 44inf1inf distprevQuvalt undef

54 1234 1inf5infinf 273infinf 3inf3infinf 4441inf distprevQuvalt undef 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 Korteste-vei algoritme Dijkstra - Eks Nabo til node inf5infinf 273infinf 3inf3infinf 44inf1inf distprevQuvalt undef

55 1234 1inf5infinf 273infinf 3inf3infinf distprevQuvalt undef 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 Korteste-vei algoritme Dijkstra - Eks Nabo til node inf5infinf 273infinf 3inf3infinf 44inf1inf distprevQuvalt undef distprevQuvalt

56 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 Korteste-vei algoritme Dijkstra - Eks Gjennomløp av korteste vei inf5infinf 273infinf 3inf3infinf 44inf1inf S:=empty sequence u:=target WHILEprev[u] is defined DO insert u at the beginning of S u = prev[v] ENDWHILE distprev

57 Lenket liste implementering av graf Punkt Kant-liste (Nabo-liste) AB - C - D B CD D EA - D Nabo-liste Graf

58 Innsetting Start : Start-peker til første punkt i Punkt-listen PLed : Peker til første ledige i Punkt-listen KLed: Peker til første ledige i Kant-listen Pkt : Info-felt i Punkt-listen NPkt: Peker til neste punkt i Punkt-listen FKant: Peker til første kant Pkant: Peker som viser hvilket punkt som svarer til denne kanten NKant: Peker til neste kant

59 finnElement finnElement (pkt,nPkt,start,post,lok) /* Søker etter posten med innhold post i tabellen pkt */ /* og returnerer med lokasjonen til denne posten. */ /* post: Innhold i søkt Post */ /* lok : Returnerer med lokasjonen (posisjonen) */ /* til søkt Post (returnerer med verdien NULL */ /* hvis posten ikke finnes) */ null:= 0 lok:= null peker:= start WHILE (peker != null) AND (lok = null) DO IF post = pkt[peker] THEN lok := peker ELSE peker := nPkt[peker] ENDIF ENDWHILE

60 finnKant finnKant(pkt,nPkt,fKant,pKant,nKant,start,post1,post2,lok1,lok2,flag) /* Søker etter en gitt kant i kant-tabellen og returnerer med lokasjonen til denne kanten. */ /* post1 : Første punkt i søkt kant */ /* post2 : Andre punkt i søkt kant */ /* lok1 : Returnerer med lokasjonen (posisjonen) til første punkt i søkt kant */ /* (returnerer med verdien null hvis posten ikke finnes */ /* lok2 : Returnerer med lokasjonen (posisjonen) til andre punkt i søkt kant */ /* (returnerer med verdien null hvis posten ikke finnes) */ /* flag :Returnerer med verdien true hvis det finnes en kant mellom post1 og post2*/ null:= 0 flag := false finnElement (pkt,nPkt,start,post1,lok1) finnElement (pkt,nPkt,start,post2,lok2) IF (lok1 != null) AND (lok2 != null) THEN finnElement(pKant,nKant,fKant[lok1],lok2,lok) IF lok != null THEN flag := true ENDIF

61 innsettPunkt innsettPunkt (pkt,nPkt,fKant,start,pled,post,full) /* Setter inn nytt punkt først i punkt-listen*/ /* post : Nytt punkt som skal innsettes */ null:= 0 IF pled = null THEN// Pkt-listen er full full := true ELSE// Ledig plass i Pkt-listen full := false ny := pled pled := nPkt[ny] pkt[ny] := post fKant[ny]:= null nPkt[ny] := start start := ny ENDIF

62 Innsett_Kant innsettKant (pkt,nPkt,fKant,start,pKant,nKant,kLed,p1,p2,full,flag) /* Setter inn ny kant først i kant-listen. ‘/ null := 0 IF kled = null THEN full := true flag := false ELSE full := false finnElement (pkt,nPkt,start,p1,lok1) finnElement (pkt,nPkt,start,p2,lok2) IF (lok1 != null) AND (lok2 != null) THEN ny := kled kLed := nKant[Ny] pKant[Ny] := lok2 nKant[Ny] := fKant[lok1] fKant[Lok1] := ny flag := true ENDIF

63 fjernElement fjernElement (info,neste,start,led,post,flag) // Fjerner et gitt element i en åpen forlengs liste null:= 0 flag := false IF start != null THEN IF post = info[head] THEN // Slette første Post peker := start start := neste[peker] neste[peker] := led led := peker flag := true ELSE// Slette post ute i listen forrige := start peker := neste[start] WHILE (peker != nULL) AND (NOT flag) DO IF post = info[peker] THEN neste[forrige]:= neste[peker] neste[peker] := led led := peker flag := true ELSE forrige:= peker peker := neste[peker] ENDIF ENDWHILE ENDIF

64 fjernPunkt fjernPunkt (pkt,nPkt,fKant,start,pLed,pKant,nKant,kLed,post,flag) /* Fjerner et gitt punkt samt kanter tilhørende dette punktet */ null := 0 finnElement (pkt,nPkt,start,post,lok) // Punktet som skal fjernes IF lok = null THEN Flag := False ELSE peker := start WHILE peker != null DO // Fjern inngående kanter til Post fjernElement (pKant,nKant,fKant[peker],kLed,lok,flag) peker := nPkt[peker] ENDWHILE IF fKant[Lok] != NULL THEN// Fjern utgående kanter fra Post beg := fKant[lok] end := fKantlok] peker := nKant[end] WHILE peker != null DO end := peker peker := nKant[peker] ENDWHILE nKant[end] := kLed kLed := beg ENDIF fjernElement (pkt,nPkt,start,pled,post,flag)// Fjern Post ENDIF

65 fjernKant fjernKant (pkt,nPkt,fKant,start,pKant,nKant,kLed,p1,p2,flag) /* Fjerner en gitt kant i kant-listen */ /* p1 : Første punkt i kanten som skal slettes */ /* p2 : Andre punkt i kanten som skal slettes */ /* flag : Returnerer med verdien True */ /* hvis slettingen er ok */ finnElement(pkt,nPkt,start,p1,lok1) finnElement(pkt,nPkt,start,p2,lok2) fjernElement(pKant,nKant,fKant[lok1],kLed,lok2,flag)

66 Klassehierarki - Graf I_Vertex Test I_ContainerA_Container I_ComparableA_Object I_Edge I_Graph A_GraphGraphAsMatrix GraphAsList Test I_DiGraph DigraphAsMatrix DigraphAsList Test

67 Interface I_Vertex

68 Interface I_Edge

69 Interface I_Graph

70

71 Abstrakt klasse A_Graph

72 A_Graph getNumberOfVertices - getVertex

73 A_Graph getVertices

74 A_Graph addVertex

75 A_Graph getNumberOfEdges - getEdge – getEdges addEdge - isEdge

76 A_Graph depthFirstTraversal

77 A_Graph breadthFirstTraversal

78 A_Graph isDirected

79 A_Graph isConnected Connected: Finnes en vei mellom hvert par av noder. Starter i en fritt valgt node (her node nr 0). Benytter dybdeFørst gjennomløp og teller antall noder som besøkes. Grafen er connected hvis antall besøkte noder er lik totalt antall noder i grafen.

80 A_Graph isCyclic

81 A_Graph getPredecessors - getSuccessors getIncidentEdges - getEmanatingEdges

82 A_Graph.GraphVertex getPredecessors - getSuccessors getIncidentEdges - getEmanatingEdges

83 A_Graph.GraphVertex getNumber - getWeight

84 A_Graph.GraphVertex getPredecessors - getSuccessors getIncidentEdges - getEmanatingEdges

85 A_Graph.GraphVertex compareTo

86 A_Graph.GraphEdge getPredecessors - getSuccessors getIncidentEdges - getEmanatingEdges

87 A_Graph.GraphEdge getV1 - getV2 - getWeight

88 A_Graph.GraphEdge getConnectedVertex – isDirected compareTo

89 A_Graph.Counter

90 GraphAsMatrix

91 GraphAsMatrix addEdge

92 GraphAsMatrix getEdge - isEdge

93 GraphAsMatrix getEdges

94 GraphAsMatrix getPredecessors

95 GraphAsMatrix getSucessors

96 GraphAsMatrix getIncidentEdges

97 GraphAsMatrix getEmanatingEdges

98 GraphAsList

99 GraphAsList addEdge

100 GraphAsList getEdge

101 GraphAsList isEdge

102 GraphAsList getEdges (1/3)

103 GraphAsList getEdges (2/3)

104 GraphAsList getEdges (3/3)

105 GraphAsList getPredecessors (1/3)

106 GraphAsList getPredecessors (2/3)

107 GraphAsList getPredecessors (3/3)

108 GraphAsList getSucessors

109 GraphAsList getIncidentEdges (1/3)

110 GraphAsList getIncidentEdges (2/3)

111 GraphAsList getIncidentEdges (3/3)

112 GraphAsList getEmanatingEdges

113 DigraphAsMatrix DigraphAsMatrix - addEdge - isDirected

114 DigraphAsMatrix topologicalOrderTraversal (1/3) Strategi: WHILE flere noder velg en node med inngrad 0 (må finnes minst en slik hvis asyklisk graf) adder noden til sortering S slett noden og alle tilhørende utgående kanter fra grafen ENDWHILE En topologisk sortering av en rettet, asyklisk graf er en sekvens S = {v 1,v 2,…v n } hvor alle noder er med eksakt en gang. For hvert par av distinkte noder v i og v j i S har vi i < j hvis det går en kant fra v i til v j. A B C D E F S = {A,B,C,D,E,F} S = {A,C,B,E,F,D} Fjerning av en node og tilhørende utgående kanter kan simuleres ved å senke inngrad med 1 for alle etterfølgende noder.

115 DigraphAsMatrix topologicalOrderTraversal (2/3) A B C D E F S = {A,B,C,D,E,F} S = {A,C,B,E,F,D}

116 DigraphAsMatrix topologicalOrderTraversal (3/3) A B C D E F S = {A,B,C,D,E,F} S = {A,C,B,E,F,D}

117 DigraphAsMatrix isStronglyConnected Strongly connected: Finnes en vei mellom hvert par av noder. Foretar en start i hver av nodene og benytter dybde først gjennomløp. Strongly connected hvis hvert gjennomløp besøker alle nodene i grafen.

118 DigraphAsMatrix isCyclic

119 DigraphAsList DigraphAsList - addEdge - isDirected

120 DigraphAsList topologicalOrderTraversal (1/2) A B C D E F S = {A,B,C,D,E,F} S = {A,C,B,E,F,D}

121 DigraphAsList topologicalOrderTraversal (2/2) A B C D E F S = {A,B,C,D,E,F} S = {A,C,B,E,F,D}

122 DigraphAsList isStronglyConnected

123 DigraphAsList isCyclic

124 Test_GraphAsMatrix (1/2)

125 Test_GraphAsMatrix (2/2)

126 Test_GraphAsList (1/5)

127 Test_GraphAsList (2/5)

128 Test_GraphAsList (3/5)

129 Test_GraphAsList (4/5)

130 Test_GraphAsList (5/5)

131 Test_DigraphAsMatrix (1/2)

132 Test_DigraphAsMatrix (2/2)

133 Test_DigraphAsList (1/2)

134 Test_DigraphAsList (2/2)

135 Kritisk vei-analyse A3 B1 C4 E9 D1 F5 G2 Aktivitets-node-graf (node-vektet graf) Event-node-graf (kant-vektet graf) A3 B1 C4 E9 D1 F5 G Sett inn dummy-kant / dummy-node når en aktivitet avhenger av mer enn en forgjenger. TidligstSenestSlakk A000 B363 C330 D770 E880 F8124 G Minimum tid for gjennomføring av hele prosjektet. 2.Aktivitets-slakk uten endring av total tid.

136 Kritisk vei-analyse Event-node-graf (kant-vektet graf) A3 B1 C4 E9 D1 F5 G TidligstSenestSlakk Minimum tid for gjennomføring av hele prosjektet. 2.Aktivitets-slakk uten endring av total tid. Kritisk vei A3 B1 C4 E9 D1 F5 G

137 Kritisk vei-analyse Earliest time: Latest time: topologicalOrderTraversal med EarliestTimeVisitor reverse topologicalOrder: depthFirstTraversal med PostOrden LatestTimeVisitor Slack time: A3 B1 C4 E9 D1 F5 G C(v1,w) EwEw E vn E v1 C(vn,w) C(v1,w) LwLw L vn L v1 C(vn,w)

138 ENDEND


Laste ned ppt "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."

Liknende presentasjoner


Annonser fra Google