Problem mit A-Star-Algorithmus
Übersicht

![]() |
SkabusBetreff: Problem mit A-Star-Algorithmus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo Community,
Ich arbeite seit mehreren Tagen daran meinen A-Star-Algorithmus für das Aves Certim-Kampfsystem zu schreiben.Anfangs lief es auch wie geschmiert und mittlerweile funktioniert mein A-Star-Algorithmus auch problemlos, allerdings scheint meine Implementation einen entscheidenen Fehler zu haben... Zunächst mal nen Beispiel für das Problem.Ich habe als Test eine 30*30-Matrix eingerichtet, die an den Positionen: [15,15] [15,16] [15,17] [15,18] [15,19] [15,20] jeweils ein unbegehbares Tile besitzt.Die Startposition des Suchalgorithmus ist an der Position [5,15] und die Zielkoordinate an der Position [20,18]. Mein Algorithmus funktioniert tadellos, er findet egal welche Versuchsanordnung ich wähle problemlos. Allerdings findet er einen Pfad den man nicht als Optimalen Pfad ansehen kann.Der Optimale Pfad müsste sein: Code: [AUSKLAPPEN] [5,15] [6,15] [7,15] [8,15] [9,15] [10,15] [11,15] [12,15] [13,15] [14,15] [14,16] [14,17] [14,18] [14,19] [14,20] [14,21] [15,21] [16,21] [17,21] [18,21] [19,21] [20,21] [20,20] [20,19] [20,18] Er findet auch folgerichtig alle diese Positionen, nur das er zwischendurch auf Stellen trifft an denen er absurde Positionen bevorzugt.Meine aktuelle Ausgabe zu dieser Versuchsanordnung sieht etwa folgendermaßen aus: Code: [AUSKLAPPEN] [5,15] [6,15] [7,15] [8,15] [9,15] [10,15] [11,15] [12,15] [13,15] [14,15] [14,16] [14,17] [14,18] [13,18] [14,19] [13,17] [12,18] . . . . . [20,18] Wie ihr unschwer erkennen könnt, macht er ne Menge Bewegungen die gar nicht zulässig sind. Außerdem geht er an manchen Stellen einen oder Zwei Schritte zurück, wärend er dann wieder 2 Schritte nach unten und dann wieder nach vorne geht.Das ist alles in allem weder befriedigend noch richtig.Ich sitze jetzt bereits mehr als 5 Stunden an diesem Problem und finde einfach keinen Fehler... Hier mal mein aktueller Code(bei Unklarheiten, sagt einfach Bescheid, ich habs so gut kommentiert wie es ging) BlitzMax: [AUSKLAPPEN]
Und wer sich dazu mal die compilierte Version anschauen mag, der kann die hier ziehen: DOWNLOAD Ich hab bereits herausgefunden, dass dieser Murks bei Stellen passiert andem die berechneten Kosten + der Heueristik exakt gleich sind.Das passiert z.B. an der Stelle [14,18] die Bewegung von auf [14,19] hat einen Kostenwert von 18 ebenso die Position [13,18] die ebenfalls 18 als Kostenwert aufweist. Das kann aber doch eigentlich gar nicht sein oder?Oder fehlt mir ne Beschreibung die solche Ausnahmen abfängt?Ich bin momentan ziemlich verzweifelt.Ich saß gestern 8 Stunden dran.Heute 5 Stunden. Ich find einfach keine Lösung für das Problem... Würd mich sehr freuen, wenn mir jemand helfen könnte der bereits in BMax einen A-Star-Algorithmus geproggt hat oder Ahnung davon hat. Vielen Dank im vorraus! MfG Ska |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
hast du denn schon eine funktion eingebaut, die mehrere pfad varianten prüft und dann die beste auswählt?
wie beim schach, wo man ja auch ein paar züge im vorraus prüfen sollte, bevor man sich zu schritt 1 entscheidet. |
||
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Midimaster hat Folgendes geschrieben: hast du denn schon eine funktion eingebaut, die mehrere pfad varianten prüft und dann die beste auswählt?
wie beim schach, wo man ja auch ein paar züge im vorraus prüfen sollte, bevor man sich zu schritt 1 entscheidet. Hm, laut den Aufzeichnungen über den A*-Algorithmus reicht es aus, vom Ende den Vorgänger zurückzuverfolgen.Was aber aus genannten Gründen nicht geht. Ne Funktion die den günstigsten Pfad durch prüfen mehrerer Pfadvarianten herausfindet wäre ne Idee. Frage wäre dann nur, wie genau ich mehrere Pfade prüfen soll...? Hab ich den A*-Algorithmus falsch verstanden?Weil ich bissher davon ausging, dass er am Ende immer nur einen, eben den günstigsten Pfad, findet.Und nicht mehrere Varianten... MfG Ska |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
da hab ich keine Ahnung von ACBS... aber ich habe mir den Code angesehen und sehe da keine Optimierung, die über den nächsten Stein hinausgeht. scheint auch keine Rekursion drin zu sein, oder?
Ich hab das früher mal gemacht und dann ist man da immer jeden möglichen Stein (Knoten) durchgegangen und von dort aus wieder jede Möglichkeit, eben durch Rekursion. immer tiefer. Dann sind die ersten Äste und damit Knoten ausgeschieden, weil alle 3 Fortsetzungen nicht zum Ziel geführt haben. Irgendwann wird die Rekursion dann wieder kleiner und am Ende kann eigentlich nur ein möglicher Weg übrig bleiben. Erschwerend kommt bei deinem Beispiel dazu, dass es auch noch "Kosten" gibt. Hier können man ja bei jedem erfolgreichen Pfad vergleichen, ob er mit den Kosten nierdiger bleibt, als der bisher beste Pfad. Dann verwerf ich den bisher besten am nähesten Knoten. Wenn nicht, behandlte ich diesen Ast wie "führt nicht zum Ziel". |
||
![]() |
ComNik |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja der A* macht das ja eigentlich schon an der Wurzel des neuen "Asts". Er prüft alle umliegenden Felder indem er deren Kosten bildet. Welche Heuristik verwendest du?
Das beste Feld wird für den Weg zum Ziel benutzt. Aber A* findet nicht immer den optimalen Weg! Ich hab gerade keine Zeit deinen Code anzuschauen aber ich werds nachher mal tun, viel Glück! lg ComNik |
||
WIP: Vorx.Engine |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du kannst Dir meinen Kram mal im Codearchiv angucken. Wenn es nur eine Pfaddivergenz ist könnte es sein dass die Diagonalen fehlerhaft bewertet werden, Du könntest hier die Kosten geringfügig erhöhen.
A* gibt wie Du schon sagtest nur einen Pfad zurück, nämlich den billigsten. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
BladeRunner hat Folgendes geschrieben: Du kannst Dir meinen Kram mal im Codearchiv angucken. Wenn es nur eine Pfaddivergenz ist könnte es sein dass die Diagonalen fehlerhaft bewertet werden, Du könntest hier die Kosten geringfügig erhöhen.
A* gibt wie Du schon sagtest nur einen Pfad zurück, nämlich den billigsten. Danke dir^^ Hab deinen Code bereits betrachtet. Ich glaube das Problem ist, dass ich keine Diagonalen habe. Bewegungen in Aves Certim laufen stehts nach dem alten Prinzip Hoch,Runter,Links,Rechts. Und will man diagonal so muss man eben rechts-hoch,links-hoch etc. Ich glaube das ist auch der Grund warum ich Stellen habe an denen für 3 umliegenden Felder die Kosten exakt gleich sind.Aber bissher funktionierte das auch.Ich habe den Code ja soweit angepasst, dass man eben nur in 4 Himmelsrichtungen gehen kann. Allersdings hab ich keine Lösung gefunden wie ich an den Stellen verfahren soll, an dem 3 oder 4 Felder die gleichen Kosten haben. @ComNik: Ich nutze die Manhatten-Methode...also Distanz vom aktuellen Feld zum Zielfeld. Würd mich freuen wenn du dir das mal anschauen könntest^^ Vielen Dank schonmal! MfG Ska |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
hm, also bei mir funktioniert auch die 4-Weg-Suche Fehlerfrei.
Du könntest die Kostenrechnung mal auf Float umstellen, um genauer zu werden. Das könnte helfen. Int ist ja doch sehr grob. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
BladeRunner hat Folgendes geschrieben: hm, also bei mir funktioniert auch die 4-Weg-Suche Fehlerfrei.
Du könntest die Kostenrechnung mal auf Float umstellen, um genauer zu werden. Das könnte helfen. Int ist ja doch sehr grob. In wie fern auf Float umsteigen?Die Kosten pro Bewegung sind ja von Feld x zu Feld y immer 1. Oder soll ich die Kostenverteilung für einzelne Felder verändern? MfG Ska |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also, ein einzelner Schritt kostet immer eins, das stimmt.
Aber Du schätzt ja die Kosten vom aktuellen Punkt zum Ziel, und das per Pythagoras. Und dabei komen ja durchaus sehr ungrade Werte raus. Beispiel: Du stehst an 0|0 und Ziel ist 7|6. Deine bisherigen Laufkosten sind 0, dazu Heuristik: sqr(7²+6²)= 9.22 von 1|0: Kosten 1 + Heuristik sqr(6²+6²) = 9.48 von 0|1: kosten 1 + Heuristik sqr(7²+5²) = 9.60 Also ist - obwohl beide Schritte rechnerisch ungünstiger als der Startschritt sind, der Schritt zu 1|0 der günstigere noch unbekannte schritt und wird daher gewählt werden. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Achso...
Ich hatte son Dokument im Inet gefunden, das A* erklärt hat und aus dem was dort stand hab ich folgendes interpretiert: BlitzMax: [AUSKLAPPEN]
Dann probier ich gleich mal ob das per Pythagoras genauer wird.Danke^^ MfG Ska EDIT: Klasse, jetzt funktioniert es richtig.Vielen vielen Dank! Die Manhatten-Methode ist für den 4-Wege Suchalgorithmus anscheinend zu ungenau!Mit Pythagoras und Float-Genauigkeit gehts!Vielen Dank! ![]() |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aber funktioniert so eine Methode denn noch, wenn man eine Mauer im Weg hat?
Beispiel: Z=Ziel A=Ausgangspunkt x=Mauer Code: [AUSKLAPPEN] xxxxxxxxxxxxxxxxxxxxxx x x x z x x x x xxxxxxxx x x x x x x A x x x xxxxxxxxxxxxxxxxxxxxxx |
||
![]() |
Firstdeathmaker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mal ne dumme Frage, aber wieso wollt ihr da überhaupt den Pythagoras benutzen? x + y Differenz reicht doch aus wenn es nur rechts links runter rauf Bewegung gibt. | ||
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon Gewinner des BCC #57 User posted image |
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Firstdeathmaker hat Folgendes geschrieben: Mal ne dumme Frage, aber wieso wollt ihr da überhaupt den Pythagoras benutzen? x + y Differenz reicht doch aus wenn es nur rechts links runter rauf Bewegung gibt.
Nein das reicht eben nicht.Das hatte ich ja vorher versucht.Aber an einigen Stellen führt das dazu, dass die Summe aus Kosten und Heueristik an 3 oder 4 Feldern gleich ist und der Suchalgorithmus willkürlich einen davon auswählt.In meinem Fall führte das zu sehr seltsamen Bewegungsverhalten... Mit Pythagoras funktioniert es so wie es soll. Midimaster: Keine Ahnung ob es für so einen Fall funktioniert.Für solche Fälle brauche in zum Glück keinen Algorithmus.Außerdem ist ihm die Mauer sicherlich vollkommen schnuppe.Denn solange sich der Start und Zielbereich innerhalb des Mauerquadrats befindet, ist es vollkommen egal ob da noch Mauern drum rum sind. Dann verkleinert sich eben der Suchbereich entsprechend.Die Mapgrenzen sind quasi ja auch Mauern... Aber es könnte evtl. sein dass er in Extremfällen keinen Weg findet oder keinen optimalen. MfG Ska |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
![]() |
Midimaster |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich meine doch nicht die mauer drumrum, sonder die zwischen den objekten. euer algo würde direkt auf die mauer zuhalten, oder? | ||
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Algorithmus würde direkt auf die Mauer zusteuern, merken, dass da ein Hindernis ist und es nachher umschiffen (da die Wegkosten für durch die Mauer auf unendlich gesetzt werden).
Falls Diagonalen erlaubt sind, wird er irgendwann abbrechen, da er merkt, dass der diagonale Weg weniger kostspielig ist und den Diagonalen weiter untersuchen. |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
n-Halbleiter |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Mit der Pythagoras-Distanz-Heuristik schon. Es gibt verschiedene andere Heuristiken, die dann vor der Mauer schon die Richtung ändern lassen, aber das ist an sich egal. xD
Auf jeden Fall wird dann spätestens bei der Mauer um die Mauer "gefahren", sofern die Hindernis-Erkennung drin ist. ![]() EDIT: Too late... |
||
mfg, Calvin
Maschine: Intel Core2 Duo E6750, 4GB DDR2-Ram, ATI Radeon HD4850, Win 7 x64 und Ubuntu 12.04 64-Bit Ploing! Blog "Die Seele einer jeden Ordnung ist ein großer Papierkorb." - Kurt Tucholsky (09.01.1890 - 21.12.1935) |
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
n-Halbleiter hat Folgendes geschrieben: Auf jeden Fall wird dann spätestens bei der Mauer um die Mauer "gefahren", sofern die Hindernis-Erkennung drin ist. ![]() Naja wenn keine Hinderniserkennung drin ist, ist A* ja auch nen bissle für den A...rm, oder? ![]() MfG Ska |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group