[BMax1.34] A-Star Wegfindung multi-Directional Upd:01.10.09
Übersicht

![]() |
BladeRunnerModeratorBetreff: [BMax1.34] A-Star Wegfindung multi-Directional Upd:01.10.09 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Aktuelle Version: 1.12
Der a-star Algo ermöglicht es auf einer vorhandenen Karte Wege zu suchen. Diese sind nicht immer die kürzesten, aber dafür findet A* garantiert einen Weg wenn es einen gibt. Zudem lassen sich Wegekosten berücksichtigen. Der hier ausgearbeitete Algo befindet sich noch im Wachstum, ich freue mich über jeden Verbesserungsvorschlag. Bedienung: die Funktion erwartet (in folgender Reihenfolge) diese Parameter: - startx, starty : Ints mit der Position des Startpunktes - targetx, targety : Ints mit der Zielposition - Map : TGameMap-Instanz welche die Karte enthält. Der Type ist im Quellcode mit enthalten und sollte selbsterklärend sein. - layer : welches Layer der Map enthält die Karteninfos. Default: 0 - block : Welcher Karteninhalt blockiert den Weg. Default: -1 - returnnearest : wenn true wird der dem Ziel am nächsten liegende gefundene Punkt zurückgegeben, sollte das Ziel nicht zu erreichen sein. Default: false - weight : Art der Gewichtung, sowie bei astar8: Diagonalenglättung. Wird per Flag gesteuert. Default: 0 Vorhandene Flags: * ASWEIGHTENED: Die Werte in layer werden als Wegekosten interpretiert * ASHEIGHTENED: Die Werte in hlayer werden als Höhendifferenzen bestraft. * ASCLIMBNFALL: s.o., jedoch wird ein Abstieg nur halb bestraft. * ASSMOOTHENED: (astar8) Diagonalen werden vermieden. - hlayer : Kartenlayer für Höhenbestrafung. Wenn default wird layer verwendet. Default: -1 - mode : (nur astar6) Ausrichtung der Karte. 0: oberste Zeile ist Rechtsbündig, 1: oberste Zeile ist linksbündig. Default: 0 ~Edit~ kleiner Fehler gefixt der zum Absturz führte wenn ausser der Startnode keine begehbar war. Code editiert. ~Edit 2~ v1.03 - TMap umbenannt in TGameMap um Kollisionen mit dem BMax-internen Type zu vermeiden - Richtungsänderungen werden nun "bestraft". ~Edit 3~ v1.04 - Code superstrict-konform umgestaltet. ~big Edit~ v1.09 - nun wird 4,6(hex), sowie 8-directional unterstützt. Dafür gibt es aus Performancegründen jeweils eine eigene Function. Ich habe zwar einen Multiheader integriert, kann den wegen des entstehenden Datenberges aber nicht empfehlen. Achtung: seit v1.04 hat sich der Funktionsheader verändert, d.h. es besteht keine Schnittstellenkompatiblität mehr. - Es wird nun die Möglichkeit verschiedener Wegekosten berücksichtigt. (weight = true). Die neue Demo zeigt dieses Feature. Einfach mal damit rumspielen. - der Hexagonale A*Star lässt per mode eine Umschaltung zu wie die Karte gegliedert ist. Mode 0: die oberste Zeile ist rechts verschoben, 1: die oberste Zeile ist linksbündig. - Kleinere Änderungen an der Demo zur besseren Verständlichkeit. ~Edit 5 ~ (15.08.06) v1.11 - Gewichtung nach verschiedenen Kriterien möglich: reine Wegekosten, Höhendifferenzen, gewichtete Höhendifferenzen. Die Modi sind per bitweisem oder kombinierbar (siehe dazu Beispielcode). Die Schnittstelle musste auch dieses mal angepasst werden und ist nicht mehr kompatibel zu v1.09. - mit der Gewichtung wurde auch die Möglichkeit aufgenommen bei AStar8 Diagonalbewegungen zu vermeiden. Führt zu 'natürlicheren' Wegen. Optional, da rechenzeitintensiv und in Kombi mit Gewichtung nicht immer sinnvoll. Danke an D2006 für die Anregung. - Demo der neuen Funtionalität angepasst. ~Edit 6 ~ (01.10.09) v1.12 - komplett auf OO umgebaut und Listenhandling auf TLink umgestellt, um die Geschwindigkeit weiter zu steigern. ToDo: -Zonenerkennung in TGameMap und Auswertung in AStar. Kurze Anmerkung: Dieser Code ist selbstredend gemäß der Richtlinien dieses Forums Public Domain, d.h. ein jeder möge ihn verändern und nutzen wie er es mag. Ich würde mich jedoch sehr freuen wenn ihr mir Feedback geben würdet, so dass ich ihn gegebenenfalls noch verbessern kann. Auch eine Erwähnung in den Credits, solltet ihr ihn benutzen, würde mich sehr freuen (wie gesagt kein muss, sondern ein kann). BlitzMax: [AUSKLAPPEN] SuperStrict für die Boardsuche: AStar a* A-Star a-Stern astern Wegfinder Wegfindung pathfinding pathfinder algoritmus |
||
- Zuletzt bearbeitet von BladeRunner am Do, Okt 01, 2009 18:09, insgesamt 4-mal bearbeitet
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Absolut brilliant. Ich spiele noch ein wenig damit herum und gebe Dir dann ein wenig mehr Feedback. bekommst von mir als erster den neuen "TimEd" sobald ich Deinen Code angepasst habe ![]() |
||
Farbfinsternis.tv |
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
wenn es aber wirklich nach dem A* Prinzip funktionieren würde, dann MUSS dein Code den kürzesten Weg finden.
anders wäre es nicht der A* Algorithmus |
||
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer: AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t Gewinner: BP Code Compo #2 Π=3.141592653589793238...<--- und das aus dem kopf ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
Byteemoz |
![]() Antworten mit Zitat ![]() |
---|---|---|
StepTiger hat Folgendes geschrieben: wenn es aber wirklich nach dem A* Prinzip funktionieren würde, dann MUSS dein Code den kürzesten Weg finden.
anders wäre es nicht der A* Algorithmus Nein. A* findet den "billigsten" Weg, wobei die Wegekosten oft auch von anderen Faktoren (Richtungswechsel oder Vermeiden/Bevorzugen von bestimmten Abschnitten auf der Karte) beeinflusst werden können. -- Byteemoz |
||
MaxIDE Community Edition: Summary | Bugs | Feature Requests | CVS Repository | Thread |
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
Byteemoz hat Folgendes geschrieben: StepTiger hat Folgendes geschrieben:
wenn es aber wirklich nach dem A* Prinzip funktionieren würde, dann MUSS dein Code den kürzesten Weg finden. anders wäre es nicht der A* Algorithmus Nein. A* findet den "billigsten" Weg, wobei die Wegekosten oft auch von anderen Faktoren (Richtungswechsel oder Vermeiden/Bevorzugen von bestimmten Abschnitten auf der Karte) beeinflusst werden können. -- Byteemoz http://de.wikipedia.org/wiki/A*-Algorithmus hab ich mich verlesen? Steht da etwa in Zeile Nr. 1: "dient in der Informatik der Berechnung eines kürzesten Pfades zwischen zwei Knoten "? war wohl mein Fehler. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Drum merke: Wikipedia ist nützlich für Grundinfos, aber bei weitem nicht perfekt.
A* gibt den günstigsten gefundenen Pfad aus, aber es gibt keine Garantie dafür dass dies auch wirklich der günstigste Pfad ist Dies ist schon dadurch erklärbar das es kein rückwirkendes Löschen nachtraglich als uneffektiv erkannter Nodes gibt. A* findet immer einen Weg (wie du schon schlauerweise in deinem Wegfindethread festgestellt hast), aber es ist nicht zwangsläufig der Kürzeste. |
||
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 |
- Zuletzt bearbeitet von BladeRunner am Do, Aug 10, 2006 17:54, insgesamt einmal bearbeitet
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Der billigste Weg entspricht dem kürzesten, denn die Wegkosten entsprechen eigentlich der Wegdistanz zwischen den zwei Punkten.
So sind die Verbindungen eines Wegnetzes definiert. Solange man sich das im Hinterkopf behält wenn man "Berge schwerer begehbar" macht und so gibts keine Probleme ![]() Supi code übrigens |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
- Zuletzt bearbeitet von Dreamora am Do, Aug 10, 2006 9:52, insgesamt einmal bearbeitet
![]() |
Justus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wow, das ist echt brilliant. | ||
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der A* Algorithmus löscht den Weg, bis zum neuen.
Sonst ist es dein Algorithmus der ähnlich dem A* Algo funktioniert. Aber nicht der A* Algorithmus. der A* Algorithmus sucht, selbst wenn er am Ziel ist, den kürzesten Weg |
||
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer: AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t Gewinner: BP Code Compo #2 Π=3.141592653589793238...<--- und das aus dem kopf ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Wenn er am Ziel ist, ist kein Weg der kürzeste Weg. Jede andere Ausgabe ist einfach nur falsch, denn die erste Abbruchbedingung in jedem Algo ist prinzipiell: "Bin ich am Ziel"
Da du scheinbar noch nicht die Vorlesung Algorithmen & Datenstrukturen an einer wissenschaftlichen Fakultät der Informatikwissenschaften besucht hast, wärs für alle (vor allem den Thread) einfacher, darüber keine Diskussionen mehr zu führen. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Weg ist nach A* ermittelt und der günstigste den der Algo findet. Woher der Knick dann kommt ? Astar arbeitet sich von Node zu Node vor, und die Bewegung diagonal nach unten war die günstigste, also wurde sie übernommen. Nun stösst der Algo auf ein Hindernis und korrigiert seinen Weg indem er den nun günstigsten Knoten sucht. Ergo: A* findet seinen Weg, aber es ist nicht zwangsläufig der kürzeste. Um das Zu Erreichen müsstest Du dann noch ein 2es Mal Astar über den Pfad laufen lassen, wobei Du dann aber die Punkte bei denen Richtungsänderungen stattfanden als Zielpunkte setzen musst. Dann glättet sich der Weg soweit es geht. Ich werde allerdings in der nächsten Version noch das Bestrafen der Richtungsänderung optional machen, sowie eine Höhendistanzbestrafung einführen. Dauert ein paar Tage da ich grade ein Festival betreue. Also: stay tuned. Und herzlichen Dank für das Lob, Leute. Motiviert voll ![]() |
||
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 |
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Viel Spaß beim Festival ... und: Ich freue mich auf eine neue Version ![]() |
||
Farbfinsternis.tv |
![]() |
D2006Administrator |
![]() Antworten mit Zitat ![]() |
---|---|---|
hmm...
Habe mich gestern auch mal selbst an dem Algo probiert, in BB natürlich, hab ja kein BMax. Jedenfalls will ich nicht behaupten die perfekte Umsetzung zu haben, ist sogar ziemlich lahm, allerdings findet er einen besseren Weg als deiner (vom Screen her, kann ja nicht testen) Pic: https://www.blitzforum.de/upload/file.php?id=344 Deswegen behaupte ich nun, dass an deinem Algo was nicht stimmt. Ich schau ihn mir mal ein bisschen an. EDIT: Mit Hilfe von DC bin ich auf den "Fehler" gekommen. Siehe dazu: http://blitzbase.de/artikel/path_4.htm Wenn du Diagonalschritte teurer machst, müsste es klappen. Allerdings wird - wie beschrieben - der Algo dann langsamer. (Also in diesem Fall wäre er schneller - meiner um 6 ms, aber in anderen Fällen bis zu 10 mal langsamer) |
||
Intel Core i5 2500 | 16 GB DDR3 RAM dualchannel | ATI Radeon HD6870 (1024 MB RAM) | Windows 7 Home Premium
Intel Core 2 Duo 2.4 GHz | 2 GB DDR3 RAM dualchannel | Nvidia GeForce 9400M (256 MB shared RAM) | Mac OS X Snow Leopard Intel Pentium Dual-Core 2.4 GHz | 3 GB DDR2 RAM dualchannel | ATI Radeon HD3850 (1024 MB RAM) | Windows 7 Home Premium Chaos Interactive :: GoBang :: BB-Poker :: ChaosBreaker :: Hexagon :: ChaosRacer 2 |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm, die Diagonalen werden schon korrekt berechnet, also mit 2^(1/2).
Werde aber bei Gelegenheit mal 'ne "Sondersteuer" einführen ![]() Näheres demnächst. EDIT: Jop, Glättet die Kurve einwandfrei. Wird bei der nächsten Verbesserung mit gepastet. |
||
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 |
![]() |
StepTiger |
![]() Antworten mit Zitat ![]() |
---|---|---|
probieren jetzt alle den A* Algo aus? ^^ | ||
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer: AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t Gewinner: BP Code Compo #2 Π=3.141592653589793238...<--- und das aus dem kopf ![]() Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser. |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Neue Version 1.11. Siehe erster Post.
Jop, Steptiger, scheint sehr beliebt. Ist ja auch sehr nützlich. |
||
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 |
![]() |
Farbfinsternis |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke, werde ich mir heute mal zu Gemüte führen. | ||
Farbfinsternis.tv |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Habe mich des Codes nochmal angenommen:
Version 1.12 ist nun oben. Hier wurde im Wesentlichen alles was noch an Wrapperfunktionen drin war (ListContains etc.) entfernt. Jugendsünden eben ![]() Ist somit komplett OOP, und dank eines Umstellens der Listenführung auf Entfernen per TLink.remove() sollte auch die Ausführungsgeschwindigkeit nochmal ein wenig gestiegen sein. |
||
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 |
![]() |
Nova |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, ich weiß, dass der Thread alt ist. Ich bin aber der Meinung, dass diese Diskussion noch nicht beendet ist.
Problem dabei: Ich bin auch der Meinung, dass der von BladeRunner auf seinem Bild vorgestellte Algorithmus nicht A* ist. Jede Erklärung, die ich mir im Internet angeguckt habe, sagt über A* aus, dass Sackgassen verworfen und von einem früheren Punkt wieder angefangen wird. Möglicherweise verallgemeinern diese Seiten das ganze aber auch etwas, ich schätze aber mal, dass der Fehler eher hier liegt. Problem dabei: Auf deinem Bild ist nicht der optimale Weg gezeichnet, da der Weg erst in die Sackgasse und dort wieder raus führt. A* aber würde diese Sackgasse als ineffizient verwerfen und an einem vorherigen Punkt weitermachen. Dadurch würde der Algorithmus merken, dass es erst in eine Sackgasse gelaufen ist und dort wieder raus-"laufen". Ich weiß leider nicht genau, ob dieses Problem bereits gelöst wurde, wollte es aber erwähnen. Vielleicht habe ich aber auch irgenwas an der Grafik nicht verstanden. Vielleicht stellen die Schattierungen von Grün ja einen speziellen Kostenfaktor oder so dar. ![]() |
||
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit |
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Dein Einwand ist -zumindest teilweise- berechtigt.
Die verschiedenen Grünstufen sind in der Tat verschieden hohe Wegekosten, was allerdings nichts zur Sache tut da diese für dieses Bild nicht berücksichtigt wurden. Ich stimme dir auch zu dass ein korrekter A* den kostengünstigsten Weg findet, allerdings ist das mit den günstigsten Kosten so eine Sache, denn es gibt manchmal auch mehrere Wege nach Rom, und der kürzeste Pfad ist nicht unbedingt der billigste (was zumindest bei gewichteten Kosten der Fall ist). Im vorliegenden Fall war das Problem aber nur ein Rundungsfehler der der Floatungenauigkeit geschuldet war. Nachdem ich für Diagonalen den Preis minimal über sqr(2) erhöht hatte passte die Route wieder. Der hier umgesetzte Algorithmus ist hundertprozentig ein A-Star, das kann ich dir versichern. (Allerdings würde ich ihn mittlerweile anders umsetzen, da meine Implementierung recht langsam ist (TList ist da nicht so optimal)). |
||
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 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group