Avatar billede casualty Nybegynder
13. februar 2004 - 22:13 Der er 10 kommentarer og
1 løsning

Foklaring af Dijkstra's shortest path algoritme

Hej. Er der nogen der i pseudokode vil prøve at forklare Dijkstra's shortest path algoritme...

Jeg har set og prøvet at forstå den en del steder, men det ville være rart om der var en som havde styr på den, og kunne svare på eventuelle spørgsmål til pseudokoden...

Jeg skal bruge det i forbindelse med grafer i java, min graf er en list graf og ikke matrix implementeret.

Mvh Casualty
Avatar billede janl2000 Nybegynder
13. februar 2004 - 22:47 #1
Dijkstra’s algoritme (Korteste vej fra én knude til alle andre)
//pre: der forefindes ikke negative vægte
Placer alle knuderne i en liste og afstanden til disse som værende uendelig
Marker afstand til startknude som værende ”0” og dens forgænger som null

Sålænge der er knuder i listen
    Iterer liste med knuder igennem og udtræk den med mindste vægt som ikke har været besøgt
        Marker den udtrukne knude som besægt
        for alle naboknuder til den udtrukne knude
            opdater afstanden til disse i listen
            marker aktuel knude som værende forgænger til naboknuderne

Tidskompleksitet:
Hvis vi sekventielt leder listen igennem efter den knude med den mindste afstand tager dette O(|V|2). Dette gøres |V| gange. I tillæg sker der maksimalt en opdatering pr. kant O(|E|). Den totale tid bliver således O(|E| + |V|2) = O(|V|2).
Vælger man at bruge en prioritetskø til at holde styr på de ikke besøgte knuder kan tidskompleksiteten reduceres til O(|E| + |logV|)

Anvendelighed: reachability.
Avatar billede janl2000 Nybegynder
13. februar 2004 - 22:50 #2
Pseudokode (retningsgraf):

knude = startknude
KA_SK = (0,null)

1  LOOP
2    hvis knude ikke i resultatsæt
3    Put knude + KA_SK i resultatsæt
4    For hver naboknude
5        SK =  (knude, naboknude)
6        KA = KA(knude) + vægt(SK)
7        Gem KA_SK i prioritetskø (prioriteret efter KA)
8    hvis prioritetskø ikke tom
9        læs og fjern KA_SK i prioritetskø (forreste element)
10        knude lig til-knude i SK
11    Ellers exit loop
12  LOOP END
Avatar billede janl2000 Nybegynder
13. februar 2004 - 22:52 #3
Jeg har lavet en note på 10 sider omkring dijkstra, hvis du giver mig din mail, kan jeg sende den, der er også forklaring på hvordan den bruges
Avatar billede janl2000 Nybegynder
13. februar 2004 - 22:52 #4
KA: (korteste afstand)
SK: (sidste kant)
Avatar billede ulrikm Nybegynder
14. februar 2004 - 12:41 #5
Måske kan det bedre forklares med et eksempel:

Problem: Danmark-Finland

Knuder:

  I udgangspunktet er der uendeligt langt til alle
  lande, bortset fra Danmark, som der er 0km til.
  Ingen knuder har en pred, da denne skal indholde
  det land som den korteste sti til destinationen
  går igennem:

  Danmark{d=0km,pred=[]},
  Finland{d=oo,pred=[]},
  England{d=oo,pred=[]},
  Norge{d=oo,pred=[]}

Kanter: (Jeg er ikke så god til geografi ;-) )

  Danmark-England: 100km
  England-Finland: 250km
  Danmark-Norge: 100km
  Norge-Finland:100km

Eksekvering af dijkstra:

1: Danmark udtages (mindste d som ikke er besøgt):

  Naboer: England,Norge

  Beregninger (korteste sti til England og Norge er kantens
      længde + mindste afstand til naboen Danmark fra
      udgangspunktet (dvs 0) ):

    Danmark(0km) + Danmark-England(100km) < England(oo)
        => England.d = 0+100
      Danmark(0km) + Danmark-Norge(100km) < Norge(oo)
        => Norge.d = 0km+100km

  Resultat:
      Danmark{d=100km,pred=[]},
      Finland{d=oo,pred=[]},
      England{d=100km,pred=[Danmark]},
      Norge{d=100km,pred=[Danmark]}

2: England udtages (mindste d som ikke er besøgt):

  Naboer: Finland

  Beregninger:
      England(100km) + England-Finland(250km) < Finland(oo)
        => Finland.d = 100km+250km og Finland.pred=England

  Resultat:
      Danmark{d=0km,pred=[]},
      Finland{d=350km,pred=[England]},
      England{d=100km,pred=[Danmark]},
      Norge{d=100km,pred=[Danmark]}

3: Norge udtages (mindste d som ikke er besøgt):

  Naboer: Finland

  Beregninger:

      Norge(100km) + Norge-Finland(100km) < Finland(350km)
        => Finland.d = 100km + 100km

  Resultat:
      Danmark{d=0km,pred=[]},
      Finland{d=200km,pred=[Norge]},
      England{d=100km,pred=[Danmark]},
      Norge{d=100km,pred=[Danmark]}

4: Finland udtages (mindste d som ikke er besøgt):

  - ingen naboer


Færdig:
  Korteste sti til Finland fra Danmark:
      200km gennem Norge (Norge pred til Danmark, Danmark pred til Norge)

  Korteste sti til England fra Danmark: 100km direkte
  etc
Avatar billede ulrikm Nybegynder
14. februar 2004 - 12:43 #6
Der skulle have stået:

Færdig:
  Korteste sti til Finland fra Danmark:
      200km gennem Norge (Norge pred til _Finland_, Danmark pred til Norge)
Avatar billede casualty Nybegynder
15. februar 2004 - 18:35 #7
Hej...Tak for svar...Jeg har lige haft et par travle dage og har derfor ikke fået kigget på det, men jeg sætter mig til tasterne nu i aften og forsøger at implementere..

Mvh Casualty
Avatar billede casualty Nybegynder
15. februar 2004 - 18:51 #8
janl2000 >> Min mail er anders@bluepage.dk du må meget gerne sende mig din note
Avatar billede janl2000 Nybegynder
16. februar 2004 - 17:06 #9
Hej igen, jeg har sendt en note om Dijkstra til dig + et lille kode eksempel, der viser hvordan teorien kan bruges. Håber det kan bruges
Avatar billede casualty Nybegynder
17. februar 2004 - 23:26 #10
Tak for hjælpen :)
Avatar billede tigertool Nybegynder
05. december 2005 - 13:35 #11
Er det muligt at få en kopi af den meget omtalte note?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester