Entwickler-Ecke
Algorithmen, Optimierung und Assembler - kürzesten weg berechnen
missy - Sa 09.04.05 17:03
Titel: kürzesten weg berechnen
hallo, ich will den kürzesten Weg berechnen, weiß nich so recht wie ich das anstellen soll, könntet ihr mir vllt tipps geben?? der erklären wie ich das machen soll?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
| procedure versuch(x,y:Integer); var neuesx, neuesy, z: Integer; Nachbarpunkte: Array[1..4] of TPunkt;
begin z:=1; Nachbarpunkte[1].xKo:=x; Nachbarpunkte[1].yKo:=y-1; Nachbarpunkte[2].xKo:=x-1; Nachbarpunkte[2].yKo:=y; Nachbarpunkte[3].xKo:=x; Nachbarpunkte[3].yKo:=y+1; Nachbarpunkte[4].xKo:=x+1; Nachbarpunkte[4].yKo:=y; repeat neuesx:=Nachbarpunkte[z].xKo; neuesy:=Nachbarpunkte[z].yKo; if (StringGrid1.cells[neuesx,neuesy] <> 'Schildk.') and (StringGrid1.cells[neuesx,neuesy] <> 'Wand') and (StringGrid1.cells[neuesx,neuesy] <> 'X') then begin If StringGrid1.cells[neuesx,neuesy] = 'Apfel' then begin ShowMessage('Lösung gefunden'); anzahl := anzahl + 1; edit1.text := inttostr(anzahl); end else begin StringGrid1.cells[neuesx,neuesy] := 'X'; delay(200); versuch(neuesx, neuesy); StringGrid1.cells[neuesx,neuesy] := ' '; delay(200); end; end; z := z + 1; until (z = 5); end; |
Moderiert von
Christian S.: Topic aus Multimedia / Spiele / Grafik verschoben am So 10.04.2005 um 00:33
Leto - Sa 09.04.05 22:58
ich gebe zu mich nicht tiefer in den Coide hineingelesen zu haben... Willst du den kürzesten Weg in einem Wegeenetz (Knoten & Kanten) suchen?
Dann würd ich sagen: Entfernungsmatrix erstellen und Dijkstra oder Nichelson-Algorithmus rüberprügeln lassen.
missy - Sa 09.04.05 23:44
ich freu mich über eine antwort !!! =) ohjee aber was bidde?? hmm also entweder du bist so nett und liest denn code dochma durch, oder überfliegst ihn ;o) oder hmm erläutern? oder ich mach mich mit deinen vorschägen shclau bei google oder so..
is momentan etwas späd muss noch lernen, schaue morgen.... ich muss das hier bis dienstag fertig machen,also binw irklich über jede hilfe dankbar!!
Leto - So 10.04.05 00:17
Au... ich hätt den Code wirklich erstmal angucken sollen. Sieht mir also ja eher danach aus, als ob dein "Wegenetz" nicht wirklich aus Knoten und Kanten besteht, sondern du eher eine Art StringGitter als Karte benutzt mit einzelnen String als Kartenobjekte. Jetzt verstehe ich also richtig, dass du von einem gegeben Startpunkt aus (also ein bestimmtes feld im Gitter) den küresten Weg zu einem anderen Feld suchst (durch X kann man durchgehen, durch alles andere nicht, zum Apfel will man...)?
Prinzipiell ist der Dikstra immer noch möglich, aber vielleicht nicht unbedingt optimal, eine Entfernungsmtarix aufzustellen.
Da wirst du bei der Rekusrion bleiben müssen, dnke ich. Hiermal ein Schnellschuss:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Bewertungsfunktion(newX, newY, oldX, oldY): Integer; begin end; |
Die Bewertungsfunktion prüft also für jedes feld die Wegstrecken zum Ziel. Der Startaufruf wäre also GesamtLangeZumZiel := Bewertungsfunktion(PosX, PosY, -1, -1), wobei die -1 nur bedeutet, dass beim ersten Mal alle Nachbarn geprüft werden müssen. Das gibt dir also die Länge zum Ziel zurück. Wenn du den Weg auch noch brauchst, müsst du dir bei jeweilgen günstigsten Pfad die entsprechende Position in einer Liste merken, so dass ma Ende eine List mit den entsprechenden Pfadpositionen der Reihenfolge nach entsteht.
Es ist spät, kann sein, dass ich grad nen Denkfehler habe...
Moderiert von
raziel: Delphi-Tags hinzugefügt.
missy - Mo 11.04.05 15:38
hmmm :?: ob das hinkrieg :oops:
Leto - Do 14.04.05 18:42
Nach dem ich heute meinen eigenen Post nochmal durchgelesen habe, muss ich feststellen, das dein problem NICHT durch einfaches Backtracking gelöst werden kann, weil die Rekusrion nicht zielgerichtet ist, sondern unedlich verlaufen kann.
Daher ist der Dijkstra wohl eine bessere Wahl als zuerst angenommen.
Andernfalls (was wieder mal stark in die Richtung von Rekursion geht), solltest du dir die Idee der Spannbäume mal anschauen, mir deren Hilfo soetwas sicherlich gut gelöst werden kann.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!