Föreläsning 10. Grafer, Dijkstra och Prim

Relevanta dokument
Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 10. Grafer, Dijkstra och Prim

Föreläsning 6. Slumptal Testa slumptal Slumptal för olika fördelningar Grafer Datastrukturen graf

TNK049 Optimeringslära

Föreläsning 7 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT036)

Föreläsning 6 Datastrukturer (DAT037)

Grafer, allmänt. Med datastrukturen graf menas vanligen: en mängd av noder (vertices) och en mängd av bågar (edges).

Föreläsning Datastrukturer (DAT037)

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037)

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Datastrukturer och Algoritmer D0041D

FÖRELÄSNING 11 DATALOGI I

Föreläsning Datastrukturer (DAT036)

Trädstrukturer och grafer

Föreläsning 5: Grafer Del 1

Graphs (chapter 14) 1

Föreläsning Datastrukturer (DAT036)

Föreläsning 6 Datastrukturer (DAT037)

Föreläsningsanteckningar F6

Tentamen Datastrukturer, DAT037 (DAT036)

Datastrukturer. föreläsning 8. Lecture 6 1

Näst nästa gång: Nästa gång: mer grafer (kap 10) Grafer 1 1. ! uppspännande träd. ! minimala uppspännande träd. ! Prims algoritm. !

Kaliningrad) låg vid bägge sidor av floden Pregel samt på

MA2047 Algebra och diskret matematik

Grafer MST Top. sortering Starkt samm. komponenter Kortaste avstånd. Grafalgoritmer 1. Douglas Wikström KTH Stockholm

träd dag graf båge och vikt Grafer definitioner och terminologi

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Lösningar Datastrukturer TDA

Optimering Kruskal s algoritm Prim-Jarník s algoritm

Föreläsning 13. Dynamisk programmering

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Föreläsning 11. Giriga algoritmer

Uppgifter föreslagna från vår kursbok markeras med avsnitt och sedan: SC Self Check, P Programing, PP Programing Projects.

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 5: Giriga algoritmer. Kruskals och Prims algoritmer

Tentamen Datastrukturer (DAT037)

N = {i}: noder (hörn) Graf: G = (N, B) Definitioner. Väg: Sekvens av angränsande bågar. Cykel: Väg som startar och slutar i samma nod.

Föreläsning Datastrukturer (DAT036)

Föreläsning 7. Träd och binära sökträd

Föreläsning 2. Länkad lista och iterator

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning 12. Söndra och härska

Föreläsning 11. Giriga algoritmer

Tentamen TEN1 HI

Föreläsning 2: Grafer. Exempel på graf

729G04 - Diskret matematik. Lektion 4

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 09:00 14:00

Föreläsning 7. Träd och binära sökträd

Övningsuppgifter. Uppgifter föreslagna från vår kursbok markeras med avsnitt och sedan: SC Self Check, P Programing, PP Programing Projects.

729G04 - Diskret matematik. Lektion 4

Datastrukturer. föreläsning 9. Maps 1

Föreläsning 9. Sortering

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Grafer. 1 Grafer. Grunder i matematik och logik (2015) 1.1 Oriktade grafer. Marco Kuhlmann

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Träd. Sats. Grafer. Definition. En fullständig graf har en båge mellan varje par av noder. Definition

Träd. Sats. Grafer. Definition. En fullständig graf har en båge mellan varje par av noder. Definition

Lösningsförslag till tentamen Datastrukturer, DAT037 (DAT036), Tiden det tar att utföra en iteration av loopen är oberoende av värdet på

Föreläsningsanteckningar S6 Grafteori

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

Prov i DAT 312: Algoritmer och datastrukturer för systemvetare

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

Föreläsning 2. Länkad lista och iterator

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Uppgifter 6: Grafteori

ORDINARIE TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15 13:15

Föreläsning 4 Datastrukturer (DAT037)

Kap.6 Grafer. Egenskaper: Handskakningslemmat och Eulers formel Sats om eulerkrets/väg Isomorfi och representation av grafer Graffärgning

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning 13 Datastrukturer (DAT037)

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 9 Innehåll

Föreläsning 6. Rekursion och backtracking

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 1. Introduktion och sökning i graf. Vad är en algoritm?

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

Inlämningsuppgift, EDAF30, 2018

Föreläsning 13. Dynamisk programmering

Föreläsning 10. ADT:er och datastrukturer

Algoritmer och datastrukturer, föreläsning 11

OMTENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 08:15-13:15

Föreläsning 5: Dynamisk programmering

Föreläsning 6. Rekursion och backtracking

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 9 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Föreläsning 1. Abstrakta datatyper, listor och effektivitet

Tentamen TEN1 HI

Föreläsning 2. Kortaste vägar i grafer.

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Sökning och sortering

Transkript:

Föreläsning 10 Grafer, Dijkstra och Prim

Föreläsning 10 Grafer Representation av grafer Dijkstras algoritm Implementation av Dijkstras algoritm Minimium spanning tree Läsanvisning och uppgifter

Broarna i Königsberg, Euler, 173 Grafer Grafteori är en gren inom matematiken som är mycket användbar inom datalogi. Vi ska istället för att gå igenom boken ge en kort översikt. Se till att själv läsa kapitel 10 och göra uppgifter. Graf (graph) - En mängd V av noder (hörn, vertices) och en mängd E av bågar (kanter, edges) sådan att ändpunkterna på varje båge i E finns i V. En graf skrivs G = (V, E). Ett exempel: G = ({A, B, C, D}, {(A, C), (A, D), (B, C), (B, D)})

Terminologi Riktad graf (digraf) en graf där varje båge är riktad Viktad graf (weighted graph) en graf där varje båge tilldelats ett tal som kallas för vikten, kostnaden eller avståndet. Angränsande (adjacent) Nod A är angränsande till nod B om det finns en båge från B till A. Väg (path), en sekvens av bågar som knyter samman en sekvens av noder där varje nod är angränsande till noden före. Enkel väg (simple path) en väg där varje båge och nod är unik utom den första och sista noden som får vara samma. Cykel (cycle) En enkel väg där första och sista noden är samma. Sammanhängande graf (connected graph) betyder i en icke riktad graf att det finns en väg mellan alla par av noder. Brygga (bridge) är en båge, sådan om den tas bort så är inte längre grafen sammanhängande. Komplett graf (complete graph) en graf där varje par av noder har en gemensam båge.

Isomorfi (isomorphic) Två grafer med samma matematiska struktur (samma förbindelsematris). Ordning (order) antal noder i grafen Gradtal (degree) Givet en nod v, säger vi att deg(v) är antalet bågar som är anslutna till denna nod v. Avstånd (distance) Givet två noder v och w den kortaste vägen d(v,w) mellan dessa noder. Diameter (diameter) Det största avståndet d(v,w) som finns i en sammanhängande graf. Eulerväg (Eulerian path) En väg som går genom samtliga grafens bågar precis en gång. Hamilton cykel (Hamilton cycle) En cykel som besöker samtliga grafens noder precis en gång. Träd En sammanhängande graf utan cykler Skog (forest) en graf utan cykler (slutna vägar)

Exempel på tillämpningar Födesscheman Sociala nätverk Vägnät Datornätverk Transporter Kartografi - att måla kartor. Noderna är länder och bågarna är gränser. Binära sökträd (ett träd är en sammanhängande graf utan cykler)

Implementering - representation Vilka operationer en graf ADT behöver ha är starkt beroende på vad man ska ha grafen till. Boken går igenom ett ganska generellt exempel. Oftast designar man dock grafen efter vad man ska använda den till (Java tillhandahåller ingen generell). Oberoende av operationer behöver vi representera grafen. Det finns då två vanliga val: Förbindelselista (adjacency list) En lista över listor på varje nods grannar Förbindelsematris (adjacency matrix) Varje rad/kolumn representerar en nod och skärningen representerar bågen (avståndstabell)

Förbindelselista Grundiden att ha en lista av listor över varje nods grannar kan implementeras på många sätt. Om det är en viktad graf måste den också hålla reda på vikten för varje båge. I jämförelse med en förbindelsematris spar den oftast mycket utrymme då de flesta noder normalt inte har en förbindelse. Den är snabbare om man vill lista en nods grannar men långsammare om man vill veta om två specifika noder är grannar. Vi visar här ett enkelt exempel med en riktad graf. A representeras av 0, B av 1 osv. Node [ ] [0] [1] [2] null [3] Node next value = 2 Node next = value = 0 Node next = null value = 3 Node next = null value = 3 Node next = null value = 0

Förbindelsematris En förbindelsematris har lika många rader och kolumner som antalet noder i grafen. Skärningen representerar bågen (0 ingen båge och 1 båge). I stora grafer har oftast de flesta noder ingen båge så matrisen som blir antal noder i kvadrat stor kommer att slösa mycket utrymme. Detta kan avhjälpas med olika tekniker för att spara glesa matriser. I en viktad graf spar man helt enkelt vikten istället för ett i matrisen och Double.POSITIVE_INFINITY istället för 0.

Dijkstras algoritm Problem: Hitta den kortaste vägen från en given nod till alla andra noder i en viktad sammanhängande graf (med positiva vikter).

Dijkstras algoritm Input: V mängden av noder, s startnoden w(i,j) vikt för båge från nod i till nod j Output: p(v) noden före v i vägen från s till v d(v) kortaste vägen från s till v Sätt T = V För alla v T sätt d(v) = Sätt d(s) = 0 Medans T Sätt u till en av noderna i T med minst d(u) T = T {u} För alla v angränsande till u Om d(v)>d(u)+w(u,v) sätt d(v) = d(u)+w(u,v) sätt p(v) = u

Sätt T = V För alla v T sätt d(v) = Sätt d(s) = 0 Medans T Sätt u till en av noderna i T med minst d(u) T = T {u} För alla v angränsande till u Om d(v)>d(u)+w(u,v) sätt d(v) = d(u)+w(u,v) sätt p(v) = u 0

2 Sätt T = V För alla v T sätt d(v) = Sätt d(s) = 0 Medans T Sätt u till en av noderna i T med minst d(u) T = T {u} För alla v angränsande till u Om d(v)>d(u)+w(u,v) sätt d(v) = d(u)+w(u,v) sätt p(v) = u 0 1

2 Sätt T = V För alla v T sätt d(v) = Sätt d(s) = 0 Medans T Sätt u till en av noderna i T med minst d(u) T = T {u} För alla v angränsande till u Om d(v)>d(u)+w(u,v) sätt d(v) = d(u)+w(u,v) sätt p(v) = u 0 2 1

2 4 Sätt T = V För alla v T sätt d(v) = Sätt d(s) = 0 Medans T Sätt u till en av noderna i T med minst d(u) T = T {u} För alla v angränsande till u Om d(v)>d(u)+w(u,v) sätt d(v) = d(u)+w(u,v) sätt p(v) = u 0 2 1

2 4 Sätt T = V För alla v T sätt d(v) = Sätt d(s) = 0 Medans T Sätt u till en av noderna i T med minst d(u) T = T {u} För alla v angränsande till u Om d(v)>d(u)+w(u,v) sätt d(v) = d(u)+w(u,v) sätt p(v) = u 0 2 1

2 4 Sätt T = V För alla v T sätt d(v) = Sätt d(s) = 0 Medans T Sätt u till en av noderna i T med minst d(u) T = T {u} För alla v angränsande till u Om d(v)>d(u)+w(u,v) sätt d(v) = d(u)+w(u,v) sätt p(v) = u 0 2 5 1

2 4 Sätt T = V För alla v T sätt d(v) = Sätt d(s) = 0 Medans T Sätt u till en av noderna i T med minst d(u) T = T {u} För alla v angränsande till u Om d(v)>d(u)+w(u,v) sätt d(v) = d(u)+w(u,v) sätt p(v) = u 0 2 5 1

2 4 Sätt T = V För alla v T sätt d(v) = Sätt d(s) = 0 Medans T Sätt u till en av noderna i T med minst d(u) T = T {u} För alla v angränsande till u Om d(v)>d(u)+w(u,v) sätt d(v) = d(u)+w(u,v) sätt p(v) = u 0 2 5 1 Loopen kommer att exekvera V gånger och gå igenom alla element i T varje gång för att hitta det minsta. Detta gör att algoritmen blir O( V 2 ).

Implementering För att snabbt komma igång med själva algoritmen skriver vi ett enkelt hårdkodat program med förbindelsematris som löser vårt exempel: int X = Integer.MAX_VALUE; int[][] w = { {X, 2, X, X, X, 1, X, X}, {2, X, 2, 2, 4, X, X, X}, {X, 2, X, X, 3, X, X, 1}, {X, 2, X, X, 4, 1, X, X}, {X, 4, 3, 4, X, X, 7, X}, {1, X, X, 1, X, X, 5, X}, {X, X, X, X, 7, 5, X, }, {X, X, 1, X, X, X,, X}}; Input: V mängden av noder, s startnoden w(i,j) vikt för båge från nod i till nod j Här har vi då valt heltal som interna nodnamn: A 0, B 1, C 2 osv Fundera på hur du ska representera de övriga data vår algoritm behöver.

Val av representation För att vi ska kunna diskutera vidare föreslår jag att vi alla använder följande val: int d[] = {0, X, X, X, X, X, X, X}; int p[] = new int [8]; boolean[] taken = new boolean[8]; for(int i=0;i<taken.length;i++) taken[i] = false; Output: p(v) noden före v i vägen från s till v d(v) kortaste vägen från s till v Sätt T = V För alla v T sätt d(v) = Sätt d(s) = 0 Utgå nu från algoritmen och försök koda så nära denna som möjligt.

Mitt förslag på kod for(int i= 0;i<d.length;i++){ int u = next(d,taken); taken[u]=true; for(int v=0;v<w[u].length;v++) if(w[u][v]<x && d[v]>d[u]+w[u][v]){ d[v]=d[u]+w[u][v]; p[v] = u; } } Medans T Sätt u till en av noderna i T med minst d(u) T = T {u} För alla v angränsande till u Om d(v)>d(u)+w(u,v) sätt d(v) = d(u)+w(u,v) sätt p(v) = u next ska då leverera den nod (det index) som har minst värde på d och inte är tagen.

next static int next(int[] d, boolean[] taken){ int dmin=integer.max_value; int minindex=0; for(int i=0;i<d.length;i++) if(d[i]<dmin&&!taken[i]){ dmin = d[i]; minindex = i; } return minindex; }

Resultat for(int i=1; i<d.length;i++) System.out.println("Nod "+(char)(i+'a')+" har avstånd "+d[i]+" till nod A via: "+(char)(p[i]+'a')); Nod B har avstånd 2 till nod A via: A Nod C har avstånd 4 till nod A via: B Nod D har avstånd 2 till nod A via: F Nod E har avstånd till nod A via: B Nod F har avstånd 1 till nod A via: A Nod G har avstånd till nod A via: F Nod H har avstånd 5 till nod A via: C Nod E kunde ha gått A-F-D-E istället. Kan vi förstå från vår kod varför den inte gjorde det? Ger redan algoritmen detta resultat?

Minsta uppspännande träd (Minimum Spanning Tree) Ett uppspännande träd är en delmängd av bågarna till en sammanhängande graf sådan att det saknas cykler (träd) och inkluderar alla noder (uppspännande). Problemet vi nu ska studera innebär att man i en viktad graf hittar det uppspännande träd som har minst total vikt på bågarna. I verklighetens ord kan man tänka att man givet ett antal städer ska hitta det vägnät som ansluter alla städer för minsta möjliga kostnad.

En girig algoritm En grupp algoritmer kallas giriga. En girig algoritm väljer den lokalt bästa lösningen i varje steg (den tar girigt vad den kan just nu). Sådana algoritmer hittar inte den bästa (korrekta) lösningen till alla problem men gör det till bland annat problemet ovan. Fundera på hur du skulle lösa problemet att bygga minsta möjliga vägnät mellan ett antal städer med hjälp av en girig algoritm. 3 4 5 5 3 2 4

En girig algoritm Välj godtycklig stad A Förbind stad A med närmaste stad B Sök upp den stad C som är närmast någon av städerna A och B Förbind C med den stad A eller B som är närmast Sök upp den stad D som är närmast någon av A, B eller C osv

Ett exempel 3 5 5 4 3 2 4

Ett exempel 3 5 5 4 3 2 4

Ett exempel 3 5 5 4 3 2 4

Ett exempel 3 5 5 4 3 2 4

Prims algoritm Prims är en girig algoritm som hittar ett minsta uppspännande träd till en viktad sammanhängande graf. 1. Välj en godtycklig nod och låt denna utgöra ett träd 2. Så länge det finns noder kvar att ansluta: Anslut en av de noder ännu inte ansluten som har kortast båge till trädet

Läsanvisning och uppgifter KW 10.1-10.3, 10. Uppgifter NB 40 (2p), 41 (3p)

Uppgifter NB 40 (2p) Skriv en static metod som hittar det minsta uppspända trädet för en graf representerad med en förbindelsematris med hjälp av Prims algoritm. Funktionen skall ta en förbindelsematris som input och returnera en int-array p, där p[v] anger den nod som noden v anslöts till enligt algoritmen. Skriv också en main där du använder den hårdkodade matrisen från föreläsningen och anropar din funktion (funktionen skall fungera för godtycklig förbindelsematris av godtycklig dimension). Skriv ut resultatet i main på formatet: Nod A var startnod Nod B anslöts till A Nod C anslöts till B Nod D anslöts till F Nod E anslöts till C Nod F anslöts till A Nod G anslöts till F (obs att det finns fler korrekta lösningar)

NB 41 (3p) Skriv en klass som använder en förbindelselista för att representera en graf Skriv en metod (i mainklassen) som läser data från en textfil och skapar ett objekt av din klass som representerar den inlästa grafen. Du väljer själv hur du organiserar textfilen för att representera grafen. Det ska dock vara relativt enkelt att skriva en textfil för att representera en godtycklig graf. Skapa en textfil som representerar grafen från föreläsningen. Skriv en metod (i mainklassen) som tar en förbindelselista och två heltal som representerar två noder i grafen. Den ska sedan returnera närmsta vägen mellan noderna. Anropa metoden med den inlästa grafen från föreläsningen och ange nod B och nod G. Skriv ut den returnerade sträckan.