Løsningsforslag - Korteste vei

Størrelse: px
Begynne med side:

Download "Løsningsforslag - Korteste vei"

Transkript

1 Sist endret: Hovedside FAQ Beskjeder Timeplan Ukeplan Øvinger Gruppeøving Eksamensoppgaver Pensum Løsningsforslag - Korteste vei [Oppgave] [Levering] [Løsningsforslag] Innleveringsfrist: :00 Du er logget inn og får derfor se om du har svart riktig/feil på de enkelte oppgavene. LF-svar er markert med grønt og feil svar er markert med rødt. Hvis dere er uenige i fasit, oppfordres dere til å diskutere dette på algdats nyhetsgruppe. Denne nyhetsgruppen har også et webgrensesnitt. Oppgave 1 Notater Kode/koding Ordliste Kontakt a) Hvis jeg i en graf G har funnet en korteste vei fra node A til node F, har jeg også en korteste vei fra node F til node A? (2.5 %) Uansett om G er rettet eller urettet Hvis G er rettet Hvis G er urettet Nei Eksterne ressurser IDI NTNU Utskriftsversjon Dersom G er urettet vil F til A også være korteste vei, for om den ikke var det, kunne man snu den korteste veien F til A, og få en kortere vei mellom A og F. Om G er rettet kan vi ikke si noe om andre retningen, det f.eks være en lenket liste. martme logget inn Poengoversikt b) Jeg har i en graf G funnet en korteste vei fra node A til node F, og denne går via node D. Har jeg også funnet en korteste vei fra A til D, og D til F? (2.5 %) Uansett om G er rettet eller urettet Hvis G er rettet Hvis G er urettet Nei Om delveiene ikke var en korteste vei, kunne vi velge den korteste veien, og dermed få en bedre korteste vei fra A til F c) Jeg har i en graf G funnet en korteste vei fra node A til node D, og fra node D til node F. Har jeg også funnet en korteste vei fra A til F? (2.5 %) Hvis G er rettet Hvis G er urettet Uansett om G er rettet eller urettet Nei Det er ikke sikkert node D ligger på en korteste vei fra A til F d) Dersom alle kanter i en graf har kantvekt = 5, er det mest effektivt å bruke hvilken 1 of 7 12/9/11 6:41 PM

2 algoritme for å finne en korteste vei? (2.5 %) BFS DAG shortest path Dijkstra Alle er like gode Ingen vil finne en korteste vei Når alle kantvekter er like er korteste vei veien med færrest kanter, og dette finner BFS raskere enn de andre algoritmene. e) Dersom alle kanter i en strongly-connected graf har kantvekt = -5, er det mest effektivt å bruke hvilken algoritme for å finne en korteste vei? (2.5 %) BFS DAG shortest path Dijkstra Alle er like gode Ingen vil finne en korteste vei I en strongly-connected graf hvor alle kantene har negativ kantvekt vil det eksistere en negativ sykel. Oppgave 2 a) Vi skal finne korteste vei fra én node til alle de andre i en asyklisk graf uten negative kanter, og vi vet at E = O (V 2 / lg V). Hvilken algoritme bør vi bruke? (5 %) Dijkstra med heap Dijkstra med lineært array Dag-Shortest-Paths Dag-Shorthest-Path gir oss en kjøretid på O (E + V) som er bedre enn alle de andre alternativene b) Vi skal finne korteste vei fra én node til alle de andre i en graf uten negative kanter, og vi vet at E = ω (V 2 / lg V). Hvilken algoritme bør vi bruke? (5 %) Dijkstra med heap Dijkstra med lineært array Når E = ω(v 2 / lg V), er O(V 2 ) bedre enn O(E lg V) (Dijkstra med heap). c) Vi skal finne korteste vei alle-til-alle i en graf uten negative kanter, og vi vet at E = o (V 2 / lg V). Hvilken algoritme bør vi bruke? (5 %) Dijkstra med heap, kjørt fra hver node i grafen 2 of 7 12/9/11 6:41 PM

3 Dijkstra med lineært array, kjørt fra hver node i grafeny, kjørt fra hver node i grafen Når E = o (V 2 / lg V), er O(VE lg V) bedre enn O(V 3 ) ()). d) Vi skal finne korteste vei alle-til-alle i en graf uten negative kanter, og vi vet at E = Θ (V 2 ). Hvilken algoritme bør vi bruke? (NB! Merk at oppgaveteksten er blitt endret, det finnes ingen grafer av den typen det stod før, dvs hvor E = ω(v 2 )) (5 %) Dijkstra med heap, kjørt fra hver node i grafen Faster-All-Pairs-Shorthest-Paths (s.691 i Cormen), kjørt fra hver node i grafen Når E = Θ (V 2 ), er O(V 3 ) bedre enn O(V 3 lg V) (Dijkstra og Faster- All-Pairs-...)). Oppgave 3 Det er litt kjedelig at Dijkstras algoritme ikke fungerer på grafer med negative kanter. Her er noen forslag for å løse dette problemet i visse tilfeller. a) Vi kan finne den miste kantvekten, og legge til en konstant til alle kantvektene slik at den minste blir lik 1. (5 %) Dette funker i alle tilfeller Dette fungerer i visse tilfeller, men ikke generelt Dette fungerer dersom konstanten er lavere enn største kantvekt Dette fungerer dersom konstanten er lavere enn minste positive kantvekt Dette vil aldri fungere Vekten til en korteste vei blir med denne metoden avhengig av antall kanter i løsningen, dvs korteste veier med få kanter vil få en fordel b) Dersom grafen kun inneholder negative kanter, kan vi ganske enkelt ta absoluttverdien, og deretter velge noder med lengst vei istedetfor kortest. (5 %) Dette funker i alle tilfeller Dette fungerer i visse tilfeller, men ikke generelt Dette fungerer dersom det ikke er negative sykler i den opprinnelige grafen Dette vil aldri fungere Metoden vil velge lengste først, men man kan finne en omvei som er lengere på et senere tidspunkt, og veiene vil ikke da bli oppdatert c) Vi kan for hver kantvekt w sette ny kantvekt 2 w (5 %) Dette funker i alle tilfeller 3 of 7 12/9/11 6:41 PM

4 Dette fungerer i visse tilfeller, men ikke generelt Dette fungerer dersom det ikke er negative sykler i den opprinnelige grafen Dette vil aldri fungere Summering blir galt. Om vi hadde multiplisert hadde forholdet stemt, men vi får den generelle problemstillingen med valg av negative kanter(vi kan finne en billigere vei senere) Oppgave 4 Figuren over viser en rettet graf med kantvekter. a) Bruk en algoritme på grafen for å finne korteste avstand fra A til alle andre noder, da blir de endelige avstandene?(a er plass 0, B plass 1, osv.) (5 %) [0,8,6,1,5,3,3] [0,11,9,1,9,3,5] [0,8,6,1,5,2,3] [0,11,9,1,5,2,3] b) I hvilken rekkefølge velges noder hvis Dijkstra brukes? (5 %) A, D, G, F, E, C, B A, D, G, E, F, C, B A, D, G, E, C, F, B A, D, F, G, E, C, B 4 of 7 12/9/11 6:41 PM

5 Figuren over viser en rettet graf med kantvekter. c) Bruk en algortime, Dijkstra eller, som beskrevet i Cormen, på grafen for å finne korteste avstand fra A til alle andre noder, da blir de endelige avstandene?(a er plass 0, B plass 1, osv.) (5 %) [0,-1,6,1,5,2,3] [0,-4,6,1,5,2,3] [0,-1,9,1,5,2,3], men man må bruke [0,-4,6,1,5,2,3], men man må bruke Man kan ikke finne korteste vei ettersom grafen inneholder negative sykler Dijkstra klarer ikke negative kanter, men fungerer ettersom det ikke er negative sykler. Figuren over viser en rettet graf med kantvekter. d) Bruk en algortime, Dijkstra eller, som beskrevet i Cormen, på grafen for å finne korteste avstand fra A til alle andre noder, da blir de endelige avstandene?(a er plass 0, B plass 1, osv.) (5 %) [0,2,0,-1,-1,-3,-1] [0,0,-2,-1,-3,-3,-1] [0,2,0,-1,-1,-3,-1], men man må bruke [0,0,-2,-1,-3,-3,-1], men man må bruke 5 of 7 12/9/11 6:41 PM

6 Man kan ikke finne korteste vei ettersom grafen inneholder negative sykler Grafen har en negativ sykel: ADFA. Oppgave 5 a) Hva skjer dersom man bytter ut linje 4 i Dijkstras algoritme: while Q!=Ø med: while Q > 1 (altså at løkka kjører så lenge køen inneholder mer enn ett element)? (10 %) Dijkstras vil ikke gi rett svar lenger da Relax ikke vil kjøres på den siste noden og man kan ikke være sikker på at løsningen er korrekt! Dijkstras vil gi rett svar da siste element i køen umulig kan være forbedre den foreløpige løsningen. Dijkstras vil ikke gi rett svar da det alltid vil finnes en node i en graf hvor den korteste veien fra source til denne noden går via det siste elementet. b) Hva gjør 'Dijkstras(G,w,s)' dersom man bytter ut min-prioritetskøen med en max-prioritetskø (og dermed bytter ut kallet til Extract-Min med Extract-Max) og forandrer Relax-subrutinen til følgende: Relax(u,v,w): 1. if v.d < u.d + w(u,v) 2. then v.d = u.d + w(u,v) 3. v.π = u (7.5 %) Finner korteste veier fra én startnode til alle andre noder Finner lengste veier fra én startnode til alle andre noder Finner veiene fra én node til alle andre der maksimalavstanden mellom to noder er minimal Finner korteste veier fra alle noder til alle noder Finner veiene fra én node til alle andre der man besøker færrest mulig noder Det er et forsøk på å gjøre en av disse tingene, men det vil ikke fungere Dette er et forsøk på å finne lengste vei fra én node til alle andre, men det vil ikke fungere fordi den lengste (sykelfrie) veien mellom to noder ikke nødvendigvis består av flere andre lengste veier. Lengste-vei-problemet har faktisk vist seg å være meget vanskelig å løse, og ligger i en problemklasse som kalles NP-komplett. Dette vil dere lære mer om senere. Relax-subrutine for c): 6 of 7 12/9/11 6:41 PM

7 1. if v.d > w(u,v) 2. then v.d = w(u,v) 3. v.π = u c) Anta vi nå ser på Dijkstra på en urettet sammenhengende graf, Hva gjør 'Dijkstras(G,w,s)'(Dijkstra's algoritme) dersom man forandrer Relax-subrutinen som over og legger inn en linje 9 i Dijkstra som setter u.d = - etter at alle kantene ut fra node u er relaxed. (7.5 %) Den finner et minimalt spenntre Den finner korteste veier fra én startnode til de andre nodene, der den største kanten er minimal Den finner korteste veier fra én startnode til alle andre noder, der antall kanter er minimalt Den finner korteste veier fra én startnode til alle andre noder, men ingen av alternativene over er korrekte. Det er et forsøk på å gjøre en av disse tingene, men det vil ikke fungere Med den nye relax rutinen vil avstandsestimatene alltid gi billigste kant fra det delvis bygde spenntreet til noden. Man må sette avstandsestimatet til hver node til -, etter kantene er relaxed, for å unngå at man oppdaterer forgjengeren til en node som allerede er i treet. Dette gir gir mer eller mindre Prims algoritme, verdien til spenntreet kan finnes fra forgjengergrafen. d) Anta vi har en graf med kantvekter som er positive heltall og anta E er antall kanter og V er antall noder. Hva gjør 'Dijkstras(G,w,s)'(Dijkstra's algoritme) dersom man forandrer alle kantvektene til w'(u,v) = (E + Floor(V lg V))*w(u,v) + 1?. (7.5 %) Den finner korteste veier fra én startnode til de andre nodene, der den største kanten er minimal Den finner korteste veier fra én startnode til alle andre noder, der antall kanter er minimalt Den finner korteste veier fra én startnode til alle andre noder, men ingen av alternativene over er korrekte. Den finner et minimalt spenntre Det er et forsøk på å gjøre en av disse tingene, men det vil ikke fungere Multiplikasjon med a > E forandrer ikke resultatet av algoritmen ettersom alle vektene er posistive. Etter denne multiplikasjonen kan vi være sikre på at forskjellen mellom to valgte kantvekter enten er null eller har et avvik større eller lik E. Anta nå at du har to forskjellige korteste veier med antall kanter k_1 og k_2, hvis 1 legges til på hver kant, vil den totale kostnaden øke med k_1 for den første og k_2 for den andre. Slik at den som har færrest antall kanter vil bli prioritert over den med flere. Det er viktig å gange med faktoren a, ellers kan det for eksempel bli bedre å følge en kant på 4+1=5 enn tre på (1+1)+(1+1)+(1+1) = 6, dvs. ikke en korteste vei i det orginale problemet. 7 of 7 12/9/11 6:41 PM