A* 3D Umgebung Heuristic

Zespire

Lieutenant
Registriert
März 2007
Beiträge
857
Grüße habe meinen A* Algorithmus erfolgreich in eine 3d Umgebung implementiert, das Problem dabei ist die Heuristic in 2d Umgebungen habe ich bis jetzt die manhattan oder euklidischen Entfernung genutzt.
In der 3d Umgebung scheinen beide wenig Aussagekraft zu haben da selbst bei einer Distanz von 2 Feldern die Distanz tausende Felder betragen kann.

Wie zb auf dem Bild wen das Ziel gegenüber Punkt A liegt und der Weg Links Rechts und Unten blockiert ist werden die Entfernungskosten zu 50% unterschätzt.

20180629_143517.jpg

Jetzt gibt es dutzende Szenarien mit ähnlichen Bedingung und ich frage mich ob es eine bessere Heuristic gibt oder ob ein einfacher flood fill hier nicht sogar effektiver wäre.

Freue mich über Ideen und Meinungen
 
Welche Heuristic verwendest du denn für deinen 3D-Algorithmus? Dieser sollte entsprechend auch für den 3D-Raum ausgelegt sein. Wenn die Kosten unterschätzt werden,, weißt du direkt dass etwas mit deiner Heuristic eigentlich nicht stimmen kann.
Manhattan 2D: |x1-x2| + |y1-y2|
Manhatten 3D: |x1-x2| + |y1-y2| + |z1-z2|
 
Nutze die Euklidische Entfernung wobei das grundlegende Problem ist das Entfernung halt fast nichts über die tatsächliche Strecke aussagt.

Hier nochmal ein Bild hoffe das zeigt besser was ich meine Entfernung vom roten zum blaun Würfel ist 2 die länge der Strecke = 14.

Untilted.png

Und genau das ist halt sehr häufig der Fall oder anders gesagt die Entfernung greift in der Regel erst wen A* das Ziel eh schon fast gefunden hat.

Also eine Alternative nehmen falls vorhanden oder gleich weg lassen ?
 
Zuletzt bearbeitet:
Dass die Entfernung 2 ist, sieht man da sehr gut, nur was soll die Strecke sein? Ich nehme an, dass das schwarze und durchsichtige nicht überwindbar sind? Und was sind die erlaubten Bewegungen (nur in 90°-Winkeln,, oder auch diagonal)?
Ich sehe so direkt kein Problem für die Verwendung von A*, wenn dieses korrekt implementiert wird.
Wenn du etwas mehr Details preisgeben würdest, könnte man auch besser helfen.
 
Er kann bei den weisen Würfeln alle 6 Seiten ansteuern keine Ecken unter bestimmten Bedingungen auch die Kanten.

In 2D würde diese Situation in etwa so aussehen.
2D.png
 
Hier nochmal ein Bild hoffe das zeigt besser was ich meine Entfernung vom roten zum blaun Würfel ist 2 die länge der Strecke = 14.
Die Entfernung soll dem A* Algorithmus ja nur eine Richtung geben, in welche er suchen soll. Ohne dies würde er nämlich in alle Richtungen gleichmäßig suchen.
Dafür ist es doch egal wieviel die Entfernung mit der tatsächlichen Strecke zu tun hat. Um diese zu bestimmen brauchst du erst den kürzesten Weg ;)

Verstehe dein Problem nicht.
 
Ist eher eine Frage ob ich die Entfernung nicht einfach weglassen sollte wen sie eh fast immer in die falsche Richtung zeigt oder es etwas anderes gibt mit mehr Aussagekraft.
 
Wenn viele deiner Szenarien so aussehen, kann es aus Performancesicht besser sein einen naiveren Algorithmus zu nehmen, da A* doch einige Berechnung durchführt, um die nächsten Schritte zu berechnen. Bei einem naiveren Algorithmus hast du einfache Berechnungen, kommst aber nicht drum rum vermutlich mehr Felder zu analysieren.
Oder du nimmst einen optimierteren Algorithmus.

Was bei dir helfen kann ist eine geeignetere Heuristik zu verwenden, beachte aber, diese sollte die Kosten nie überschätzen, wenn das passiert geht dir der Nutzen der Heuristik verloren. Manhattan und Euklid sind in deinem Einsatzszenario nicht wirklich geeignet. Außer du verarbeitest deine 3D-Landschaft in eine 2D-Karte, nur hier besteht das Problem, dass du eine korrekte Umsetzung davon erstellst.

Wenn ich das jetzt richtig verstehe, hast du zwei Objekte an einem größeren Objekt, welche sich auch nur an diesem entlang bewegen können und nicht im freien Raum?

@new Account():
Ich denke es geht ihm darum, die Rate für die korrekte Schätzung zu erhöhen. Aber ohne eine deutlich aufgebohrte Heuristik, wird das kaum machbar sein.
 
  • Gefällt mir
Reaktionen: Zespire
Die 2 Würfel sollen bloß Start und Ziel zeigen und ja man bewegt sich nur auf der Oberfläche eines Objektes.

geollum schrieb:
Ich denke es geht ihm darum, die Rate für die korrekte Schätzung zu erhöhen. Aber ohne eine deutlich aufgebohrte Heuristik, wird das kaum machbar sein.

Genau das.
Oder halt weg lassen und die Kosten pro schritt einfach um 1 erhöhen.
 
Normal sollte das Berechnen der euklidischen Distanz nicht allzu teuer sein, als dass sich das Weglassen lohnt.

Ansonsten, mach einen Benchmark und schau was rauskommt ;)
 
@new Account():
Nicht nur die Berechnung der Heuristik, sondern auch die Findung des "optimalen" nächsten Schrittes und weitere Kleinigkeiten von A*.

@Zespire:
Stellen die schwarzen Würfel das Ende der begehbaren Fläche dar? Wenn ja ließe sich dein Objekt als 2D-Karte darstellen und du hättest weniger Probleme mit der Pfadfindung.
 

Anhänge

  • Unbenannt0001.png
    Unbenannt0001.png
    201,8 KB · Aufrufe: 390
  • Unbenannt0002.png
    Unbenannt0002.png
    14,4 KB · Aufrufe: 370
  • Gefällt mir
Reaktionen: Zespire
Stimmt die Idee finde ich super „einfach“ aufklappen das ganze.

Muss ich mir mal Gedanken drüber machen aber auf den ersten Blick ...
 
Dein Problem hat überhaupt nichts mit 2D / 3D zu tun.
zB das hier
"Heuristic in 2d Umgebungen habe ich bis jetzt die manhattan oder euklidischen Entfernung genutzt.
In der 3d Umgebung scheinen beide wenig Aussagekraft zu haben da selbst bei einer Distanz von 2 Feldern die Distanz tausende Felder betragen kann. " ist genau so auch ein problem in 2D.
Nur weil 2 Ort direkt benachbart sind (100 Meter?) kann eine fehlende Brücke einen Umweg von zig Kilometern betragen, wenn die 100m Luftlinue durch einen Fluss blockiert sind.

Die Heuristik muss nur eine Untergrenze sein und das gilt in 2D genau wie in 3D für beide genannten Heuristiken.

Die Geschwindigkeit des Algos verbessert sich, wenn die Heuristik auch mit der realen Entfernung korreliert. Dies ist eben bei beiden Heuristiken auch in 3D 'in der Regel' der Fall. Wobei es eben genau wie auch in 2D in 3D von dir gezeigte Beispiele gibt, wo die Heuristiken komplett versagen.

edit: da du jetzt mit dem Aufklappen überlegst: Was ist denn dein eigentliches Problem? In dieser einfachen Würfelwelt wirst du kaum Performance-Probleme haben...?
 
Ist Teil des Spieles das nahe Objekte durch große strecken getrennt sind sobald ich mehr Level zusammen habe werde ich mal Testen wie Best first gegen A* abschneidet.

Und wie ich das den Kommentaren entnehme gibt es für A* wohl nur Entfernungsfunktionen online konnte ich auch keine alternative finden.

Aufklappen wird wohl nichts weil ich dann mit wrapping arbeiten müsste.
 
Ich glaube dir ermangelt es einfach ganz grundlegend an Grundwissen bzgl. Algorithmik.

Eine Heuristik z.B. ist eine Approximation, ist also niemals optimal. Und eine Heuristik ist generell dann zulässig, wenn sie die tatsächlichen Kosten unterschätzt. Wenn deine Heuristik das nicht tun würde, wäre es keine korrekte Heuristik.


Zespire schrieb:
Best first gegen A* abschneidet

Es gibt keinen konkreten Best-first Suchalgorithmus, da Best-first nur beschreibt anhand einer Heuristik im Suchraum voranzuschreiten. Das ergibt aus diversen Gründen natürlich keinen Sinn. Besonders wenn du eh schon Bedenken hast, dass deine Heuristik nicht die beste für dein Problem ist. Best-first geht ja nur nach Heuristik vor.

Deshalb sieht man Best-first ja auch eigentlich nur als Klasse von Suchalgorithmen, nämlich den informierten Suchalgorithmen, an. Dieser Klasse ordnet man dann andere, wie etwa A*, B*, ... unter.

Insofern wird sich A* natürlich besser verhalten, weil du da die bisherigen Kosten + die heuristischen Kosten ermittelst.

Genauso wie bei den uninformierten Suchen kann eine reine Heuristik selbstverständlich nur dann effizienter sein, wenn das gegebene Problem optimal für sie ist. Das ist es im Regelfall eben nicht. Deshalb verwendet man Algorithmen wie A*, die mehrere Ansätze kombinieren.

A* ist ferner vollständig, optimal & effizient. D.h. A* findet immer eine Lösung, und zwar die optimale Lösung, sofern überhaupt eine existiert. Ferner existiert kein anderer Algorithmus als A*, der unter Verwendung der gleichen Heuristik die Lösung schneller findet, also weniger Suchraum real erkunden müsste.

Da braucht man also gar nicht erst "mal Best-first" ausprobieren. Das ist Quark.


Zespire schrieb:
gibt es für A* wohl nur Entfernungsfunktionen

Nein. Das gibt es in deiner Domäne nur und zwar aus guten Grund: (1) kannst du bei A* die beiden Kostenfunktionen g und h nicht einfach mit unterschiedlichen Einheiten bemessen und (2) welches Maß würde denn überhaupt Sinn ergeben, wenn du eine Entfernung, also den kürzesten Weg in einem Raum (welcher Dimension auch immer) finden möchtest?

Da bleibt natürlich nur die räumliche Entfernung übrig.


Zespire schrieb:
Aufklappen wird wohl nichts

Man "klappt auch nicht einfach auf", man beschreibt derlei Suchprobleme i.d.R. als Graphen und da gibt es sehr wohl verschiedenste Tricks, wie man derlei Dinge umsetzen kann, genauso wie verschiedenste informierte oder greedy-Algorithmen, die für gegebene Probleme passable Lösungen bereitstellen.
 
Zuletzt bearbeitet:
Zu 1 das habe ich auch nicht in Frage gestellt ist etwas blöd formuliert aber worum es mir geht ist wozu die Entfernung berechnen wen diese keine Aussagekraft hat.

Zu 2 mein Fehler was ich meine ist Dijkstra war fest überzeugt das der Best first heißt.
Edit: Wobei es wohl einfach nur ein floodfill ist wen wie bei mir die Entfernung immer 1 ist...

Zu 3 wen mir da was eingefallen wäre würde ich nicht hier fragen das einzige was mir in den Sinn kam
war die Anzahl der wände die zwischen den Punkten liegen mit ein zu beziehen.

Zu 4 eigentlich schon wäre vom Prinzip her das selbe wie UV Mapping und das einfach stand nicht ohne Grund in Anführungszeichen.
 
Zuletzt bearbeitet:
(1) Die Entfernung hat doch eine Aussagekraft, nur das etwa eine euklidische Distanz selbstverständlich nur eine Approximation ist. Dieser Umstand ist jedoch kein Problem, da die Natur einer jeden Heuristik ja nichts anderes als eine approximative Funktion ist.
Und selbstverständliche sind solche "Schätzfunktionen" nie optimal, sonst wären sie (a) keine Schätzfunktion und (b) deutlich teurer in ihrer Laufzeit.

(2) Das wird dir nicht helfen. Wird eine Heuristik monoton, so kann sie in die Kostenfunktion integriert werden und damit entspricht eine A*-Suche exakt dem Dijkstra Algorithmus.

(3) Das geht selbstverständlich auch nicht, denn Wände überhaupt als Kosten zu betrachten, ergibt ja nur unter der Prämisse Sinn, dass es durchlässige und undurchlässige Wände geben kann, also zwischen zwei Feldern eine Wand oder eben keine.
Aus diesem Zustand folgt dann direkt, dass die Heuristik sämtliche Wände der Umgebung korrekt betrachten muss, d.h. den Suchraum viel stärker "erkunden" muss.
Denn würde die Heuristik einfach von keinen Wänden ausgehen, wäre sie nicht besser als die bisherige Heuristik. Berücksichtigt sie aber Wände, muss sie genau wissen wie viele und wie stark sie die Kosten beeinflussen, denn ansonsten könnte sie die Kosten überschätzen und wäre damit keine zulässige Heuristik mehr.
Das ist dann der klassische Fall, dass man per Optimierung der Heuristik die Situation verschlimmert, weil man meint die Heuristik müsste so gut wie möglich an die optimale Lösung herankommen, dabei aber mehr Laufzeit opfert, als man unterm Strich gewinnt.

(4) Nein, das UV-Mapping kommt ja aus der Texturierung von Objekten, etwa Polygonen. Es geht hierbei also um die Oberfläche. Natürlich wäre die grundlegende Vorgehensweise prinzipbedingt anpassbar, aber die Problematik entsteht ja durch die UV-Map an sich: bei einer Kugel etwa kann man z.B. an den Polen alle benachbarten Punkte (minimale Distanz zueinander) direkt besuchen, würde in einem Graphen also diese Knoten alle untereinander verbinden. In einer UV-Map ist das nicht möglich, hier könnten in 2D prinzipbedingt maximal 8 Nachbarn existieren, in 3D kannst du aber mehr mögliche Pfade haben.

Deshalb als Graph modellieren, nicht per UV-Map.

ascer schrieb:
Ich glaube dir ermangelt es einfach ganz grundlegend an Grundwissen bzgl. Algorithmik.

Das war übrigens mitnichten angreifend, abwertend oder überhaupt irgendwie negativ gemeint, sondern einfach nur eine Feststellung, die sich mir aufdrängte.

Es wirkt so, als wärst du intuitiv unzufrieden mit approximativen Verfahren. Vielfach gibt es aber in der Algorithmik, also der Informatik, nichts besseres. Die Zeitkomplexität von A* ist im worst-case ja schon V^2, also polynomiell, also ziemlich fix im Vergleich zu anderen Lösungen.
Die Problematik von A* ist nebenbei gesagt i.d.R. auch nicht die Laufzeit, sondern die Speicherkomplexität, da ja alle bekannten Knoten in der closed und open List gehalten werden müssen.
 
Zurück
Oben