Shortest Pth Algorithmus von Esger Dijkstr Mihel Dienert 16. Dezemer 2010 Inhltsverzeihnis 1 Shortest Pth Algorithmus 1 1.1 Grphen................................. 1 1.2 Knoten.................................. 2 1.3 Pseuooe............................... 2 2 Progrmmierung 3 2.1 Aufu er Link-Sttes-Mtrix..................... 3 A Progrmmierufge 5 B Klssenigrmme un Coegerüst 5 B.1 Klssse KnotenZustn......................... 5 B.2 Klsse Dijkstr............................. 5 B.3 Coe-Gerüst............................... 5 C Beispiel eines Progrmmlufs 9 D Üung zum Dijkstr-Algorithmus 10 1 Shortest Pth Algorithmus 1.1 Grphen Der Shortest Pth Algorithmus von Esger Dijkstr suht in einem gewihteten Grphen (= Netz, estehen us Knoten un Verinungen mit Kosten) nh en günstigsten Pfen von einem Strtknoten zu llen neren Knoten. Ds Beispielnetz in iesem Dokument sieht so us: Es enthält ie vier Knoten,,,. Die Ziffern stellen ie Kosten er Verinung r. In er Netzwerktehnik weren ie Kosten us er Bnreite rehnet, verwenet mn en Dijkstr-Algorithmus um Wegstreken zu opimieren, entsprehen ie Kosten er Entfernung zwishen en Knoten. 1
4 1 3 1 2 5 Ailung 1: Ein Beispielnetz mit 5 Knoten 1.2 Knoten Jeer Knoten es Grphen ht folgene Eigenshften: Distnz: Die este ngenommene Distnz eines Knoten zum Strtpunkt Vorgänger: Der Nme es Vorgängerknotens uf em islng esten Pf zum Strtort Offen/Erleigt: Diese Eigenshft (im Folgenen Vrile qs) eines Knotens knn 3 Werte nnehmen: - er Knoten wure noh niht esuht q er Knoten wure esuht, seine kürzeste Distnz zum Strtort ist er noh niht eknnt s er Knoten ist erleigt (settle),.h. seine kürzeste Distnz zum Strt ist eknnt. 1.3 Pseuooe //initilisieren setze ie Distnzen ller Knoten uf unenlih: z.b. $ist = 1000000$ setze en Vorgengerknoten ller Knoten uf "" (leerer String) setze ie offen/erleigt-eigenshft (qs) ller Knoten uf "-" setze qs es Strtknotens uf "q" setze ie Distnz ist es Strtknotens uf ist=0 while( es git noh knoten, ei enen qs=="q" ist ){ knoten u = extrtminimum(); relxneighors(u); Methoe extrtminimum(): 2
extrtminimum(){ fine en Knoten u mit minimler Distnz ist us er Menge ller Knoten, ei enen qs=="q" ist ; u.setqs("s"); return u; Methoe relxneighors(u): relxneighors(knoten u){ foreh Knoten v, v.getqs() ist niht "s" && v ist nhr von u{ if (v.getdist() > u.getdist() + getdistnz( u,v) ){ v.setdist( u.getdist() + getdistnz(u,v) ); v.setpre(u); v.setqs("q"); Für ie Relisierung ls Jv-Progrmm knn mn u un v ls Ojekte er Klsse KnotenZustn rstellen. Ds Klssenigrmm von KnotenZustn ist in A. 2 (Angng) gezeigt. Die eien Methoen relxneighors(string u) un extrtminimum() sin in er Klsse Dijkstr relisiert. Die A. 3 zeigt eren Klssenigrmm un ist eenflls im Anhng. 2 Progrmmierung 2.1 Aufu er Link-Sttes-Mtrix Die Link-Sttes-Mtrix esteht us einer Hsh-Mp, eren Shlüssel ie Knotennmen ilen (String) un eren zugeornete Werte wieer eine Hsh-Mp sin (Zeilen T. 1). Die Shlüssel-Werte-Pre er Hsh-Mps, ie ie Zeilen er folgenen Telle (T. 1) ilen, enthlten einen Zielknoten (Shlüssel) mit seiner Entfernung (Wert). Die eien Ailungen in Telle 1 sin gleihwertig: Die inneren Hsh-Mps wuren zunähst ls Tellen (links) un nn vereinfht ls Menge von Wertepren rgestellt (rehts). 3
String Hsh-Mp 4 2 4 3 1 2 1 5 1 5 String Hsh-Mp (,4) (,2) (,4) (,3) (,1) (,2) (,1) (,5) (,1) (,5) Telle 1: Link-Sttes-Mtrix mit Hsh-Mps 4
A Progrmmierufge Die eien Klssenigrmme un s Coegerüst sollen unter Einhltung er Vorgen (Klssen, Bezeihner) usprogrmmiert weren, so ss s Beispielnetz geroutet wir. Die mit tr 1 (un nur mit tr un nihts usser tr un keinesflls irgen ws nerem) rhivierten NB-Projektverzeihnisse sin per e-mil n ienert@wr.e noh ieses Jhr einzureihen. Die Projektverzeihnisse müssen eine irekt usführre jr-dtei enthlten (Buil Projet niht vergessen). Un wehe, ie geshweiften Klmmern sin, wo sie niht hingehören!!!! B Klssenigrmme un Coegerüst B.1 Klssse KnotenZustn B.2 Klsse Dijkstr B.3 Coe-Gerüst 1 Für winteno-spieler git es izr oer tugzip 5
KnotenZustn ist: int pre: StringBuffer qs: StringBuffer + KnotenZustn( ist: int, pre: String, qs: String ) + setdist(ist: int) : voi + setpre(pre: String) : voi + setqs(qs: String): voi + getdist(): int + getpre(): String + getqs(): String Ailung 2: Klssenigrmm 6
Dijkstr ijkstr: HshMp<String, KnotenZustn linksttes: LinkSttes knotenset: Set<String> + Dijkstr() + rukezustene(): voi + nihtalleknotensettle(): oolen + extrtminimum(): String + relxneighors(u: String): voi Ailung 3: Klssenigrmm 7
/** * linksttes-ojekte speihern in einer hshmp zu jeem knoten eine * hshmp, ie zu jeem knoten ie istnz enthelt * etw so: *, ( (,0), (,4), (,2), (,1000000) ) *, ( (,4), (,0), (,3), (,1) ) * usw. **/ pkge ijkstr; import jv.util.hshmp; import jv.util.set; lss LinkSttes{ HshMp<String, HshMp> mtrix; HshMp<String, Integer> zeile; //link-stte hinzufuegen: puli voi LinkStte(String strtknoten, String nhr, int istnz){ // vervollstenigen puli Set<String> getnhrn(string knoten){ //vervollstenigen puli Set<String> getalleknoten(){ //vervollstenigen puli int getdistnz(string u, String v){ //vervollstenigen puli voi mtrixdruken(){ //vervollstenigen puli LinkSttes(){ this.linkstte("","",4); this.linkstte("","",4); this.linkstte("","",3); this.linkstte("","",1); this.linkstte("","",2); this.linkstte("","",2); this.linkstte("","",1); this.linkstte("","",5); this.linkstte("","",1); this.linkstte("","",5); //this.mtrixdruken(); puli stti voi min(string[] rgs){ new LinkSttes(); 8
C Beispiel eines Progrmmlufs ijkstr: :( ist=1000000, vorgenger=, qs=- ) ijkstr: :( ist=1000000, vorgenger=, qs=- ) ijkstr: :( ist=1000000, vorgenger=, qs=- ) ijkstr: :( ist=1000000, vorgenger=, qs=- ) ******************************************************** knoten u ist er knoten: essen zustn ist: ( ist=0, vorgenger=, qs=s ) ie hshmp mit en nhrn von : {=4, =2 ijkstr: :( ist=1000000, vorgenger=, qs=- ) ijkstr: :( ist=4, vorgenger=, qs=q ) ijkstr: :( ist=2, vorgenger=, qs=q ) ijkstr: :( ist=0, vorgenger=, qs=s ) ******************************************************** knoten u ist er knoten: essen zustn ist: ( ist=2, vorgenger=, qs=s ) ie hshmp mit en nhrn von : {=5, =1, =2 ijkstr: :( ist=7, vorgenger=, qs=q ) ijkstr: :( ist=3, vorgenger=, qs=q ) ijkstr: :( ist=2, vorgenger=, qs=s ) ijkstr: :( ist=0, vorgenger=, qs=s ) ******************************************************** knoten u ist er knoten: essen zustn ist: ( ist=3, vorgenger=, qs=s ) ie hshmp mit en nhrn von : {=1, =3, =4 ijkstr: :( ist=4, vorgenger=, qs=q ) ijkstr: :( ist=3, vorgenger=, qs=s ) ijkstr: :( ist=2, vorgenger=, qs=s ) ijkstr: :( ist=0, vorgenger=, qs=s ) ******************************************************** knoten u ist er knoten: essen zustn ist: ( ist=4, vorgenger=, qs=s ) ie hshmp mit en nhrn von : {=1, =5 ijkstr: :( ist=4, vorgenger=, qs=s ) ijkstr: :( ist=3, vorgenger=, qs=s ) ijkstr: :( ist=2, vorgenger=, qs=s ) ijkstr: :( ist=0, vorgenger=, qs=s ) 9
D Üung zum Dijkstr-Algorithmus Vervollstänige ie Tellen nhn es Pseuo-Coes: getdistnz(u,v)= knoten ist pre qs getdistnz(u,v)= knoten ist pre qs getdistnz(u,v)= knoten ist pre qs getdistnz(u,v)= knoten ist pre qs getdistnz(u,v)= knoten ist pre qs getdistnz(u,v)= knoten ist pre qs getdistnz(u,v)= knoten ist pre qs getdistnz(u,v)= knoten ist pre qs getdistnz(u,v)= knoten ist pre qs getdistnz(u,v)= knoten ist pre qs getdistnz(u,v)= knoten ist pre qs getdistnz(u,v)= knoten ist pre qs 10