it-swarm.com.de

PacMan: Welche Arten von Heuristiken werden hauptsächlich verwendet?

Was sind neben A *, BFS, DFS und dergleichen andere gute Algorithmen/Heuristiken für die Wegfindung, die in Pacman im Allgemeinen verwendet werden? Ich glaube nicht, dass die von mir erwähnten funktionieren werden, wenn Pacman mehr als eine Frucht findet.

Ich benötige einige gute Algorithmen zur Wegfindung, mit denen PacMan das Labyrinth mit der geringstmöglichen Schrittzahl fertigstellen kann. Ich habe versucht, nach einem Leitfaden zu suchen, aber bisher kein Glück. Ein * mit Manhattan-Distanz wird überall erwähnt, aber es wird nur mit Labyrinthen funktionieren, bei denen nur eine (oder zwei? Oder vielleicht bis zu ein paar?) Frucht zu bekommen ist.

Übrigens, um die Dinge einfach zu halten, unter der Annahme, dass keine Geister in der Nähe sind.

Einige Beispiele aus den ursprünglichen PacMan-Problemen: Erste , Zweite und Dritte

17
IcySnow

Sie sagen, Sie suchen nach kürzester Pfad. Dieses Problem ist eine Variation von TSP in einem planaren Graphen und ist somit NP-Hard .

Mögliche Heuristik-Funktion für A*, die das Problem lösen kann, aber nicht zulässig [daher ist der gefundene Pfad nicht garantiert optimal]:

Summe der Manhattan-Entfernungen von allen Früchten bis zum Agenten.

Sie können auch eine zulässige Heuristik von #fruits verwenden - dies dauert jedoch sehr lange.

Wenn Sie nach einem Optimum suchen, ist es schwer. Sie können alle Permutationen von Früchten ausprobieren und die Gesamtstrecke prüfen, die Sie benötigen, um zu reisen. Diese Lösung ist Fakultät in der Anzahl der Früchte , und wenn sie größer als 20 ist - mit naiver Bruteforce - wird es zu lange dauern. Sie können es irgendwie verbessern, indem Sie das Problem auf TSP reduzieren, und eine dynamische Programmierlösung verwenden, die ebenfalls exponentiell ist, oder einige heuristische Lösungen für TSP.


Man kann auch die unzulässige heuristische Lösung verbessern, um einen beliebigen Algorithmus bereitzustellen :

iterativ A* mit einer abnehmenden heuristischen Funktion ausführen : h(v) = h'(v) / m, wobei h' die heuristische Funktion bei der letzten Iteration von A * und m > 1 ist. Dies garantiert, dass irgendwann Ihre heuristische Funktion h zulässig ist - und die gefundene Lösung optimal ist. Es wird jedoch erwartet, dass jede Iteration viel länger dauert als die vorherige [exponentiell länger ..]

12
amit

Heuristik, die für mich funktioniert hat, wenn Sie den Labyrinth-Look kennen:

  1. Finde die reale Entfernung zwischen zwei derzeit am weitesten entfernten Früchten im Labyrinth - nennen wir das x.
  2. Finden Sie die reale Entfernung von der aktuellen Pacman-Position bis zum Abschluss der vorherigen beiden Früchte - nennen wir das y.

Die Antwort lautet dann nur: x + y.

Beachten Sie, dass reale Entfernungen keine Manhattan-Entfernungen sind, sondern real Entfernungen im Labyrinth - Sie können dies berechnen (sogar vorausberechnen, wenn Sie möchten), weil Sie das Labyrinth-Aussehen kennen (Sie kennen alle Wände, ...). Diese Informationen (tatsächliche Entfernung zwischen zwei Punkten im Labyrinth) sind statisch, da sich Wände nicht ändern. 

Die Interpretation dieser x + y-Formel könnte folgendermaßen aussehen: 

  • x - In jedem Fall müssen Sie diese Entfernung mindestens am Ende zurücklegen
  • y - Wenn Sie sich an den beiden am weitesten entfernten Früchten befinden, ist es besser, die Lebensmittel zu sammeln, die sich in der Nähe befinden, sodass Sie nicht zurückkehren müssen

Wenn Sie dies als Teil eines Berkeley AI-Klassenprojekts lösen, können Sie zur Berechnung der tatsächlichen Entfernung zwischen zwei Punkten die Funktion mazeDistance(pos1, pos2, gameState) verwenden, die bereits implementiert ist und Ihre Implementierung von bfs verwendet. Auch diese Heuristik ist zulässig und konsistent zumindest für ihre Testfälle. Mit dieser Heuristik konnte ich übrigens nur 376 Knoten im trickySearch-Labyrinth erweitern.

14
Antonio Jurić

Ich fand das nächstgelegene ungefähre Essen (anhand von Manhattan-Entfernungen), aber für meine Heuristik habe ich die tatsächliche Entfernung von meiner Position zum nächstgelegenen Essen verwendet. Dazu habe ich 1 für alle Lebensmittelpunkte hinzugefügt, die keine Reihe oder Spalte enthalten meine Position oder nächste Lebensmittelpunkt.

Weil die Lebensmittelpunkte, die sich in Reihe oder Farbe mit meiner Position oder der nächstgelegenen Lebensmittelposition teilen, von meiner Position zum nächsten Essen gegessen werden würden, und ich habe die Kosten bereits in der tatsächlichen Entfernung gezählt, die ich in der zweiten Zeile erwähnt habe.

Also, kurz: heuristic = mazeDistance (meine Position, geschätztes nächstgelegenes Essen) + Punkte weggelassen

Dies war zulässig und konsistent. Damit erweiterte ich 5500 Knoten und erhielt ein 5/4 für die FoodHeuristic. https://github.com/sukritiverma1996/Intro-to-AI -Kurs

6
Sukriti Verma

Ich weiß, das ist alt, aber es gibt wahrscheinlich viele andere Leute, die dieses Problem lösen wollen (es ist Teil der kostenlosen KI-Klasse von Berkeley). Es gibt eine Menge an Brute-Force-Vorschlägen, also werde ich einen ziemlich einfachen einbringen, der ziemlich nahe kommt IST ZULÄSSIG:

  1. Finde die nächste Frucht
  2. Entfernen Sie diese Früchte aus der Liste der verbleibenden Früchte und addieren Sie den Abstand zur Gesamtsumme
  3. Finden Sie die Frucht, die dieser Frucht am nächsten liegt
  4. gehen Sie zu Schritt 2 zurück und wiederholen Sie den Vorgang, bis keine Früchte mehr vorhanden sind
  5. die Summe zurückgeben

edit: Vorherige Behauptung, dass dies eine zulässige Heuristik ist, ist falsch. Es tut uns leid!

4
bendl

Sie könnten es für eine kleine Anzahl von Früchten in einem angemessen großen Labyrinth brutal erzwingen.

  • Erstellen Sie ein Diagramm mit einem Knoten für jedes Fruchtstück im Labyrinth.
  • Verwenden Sie A * oder ähnliches, um den Abstand zwischen jedem Paar von Früchten zu ermitteln. (Sie benötigen O(n^2) Läufe von A *, um alle paarweisen Abstände zwischen n Früchten zu erhalten.)
  • Verknüpfen Sie die Knoten (Früchte) in der Grafik mit nach Entfernung gewichteten Kanten.
  • Finden Sie den günstigsten Zyklus in der Grafik (mindestens einmaliges Durchlaufen aller Knoten) durch rohe Gewalt. Siehe günstigste Kosten in der vollständigen Grafik.
3
Li-aung Yip

wenn Sie die Anzahl der erweiterten Knoten reduzieren möchten und sich nicht für die Laufzeit interessieren, würde ich die Verwendung von Minimum Spanning Tree empfehlen. Die Kosten für Edge sollten mazeDistance und die Verwendung von priorityQueue sein. Jedes Mal, wenn Sie einen Knoten zu einem besuchten Knoten hinzufügen, suchen Sie nach Der nächstgelegene Knoten, der gerade hinzugefügt wird, und dann den Knoten zum besuchten Knoten, bis der gesamte Nahrungsknoten zum besuchten Knoten hinzugefügt wurde. Wenn Sie ein AI-Kursproblem haben, sollte der erweiterte Knoten sehr niedrig sein.

0
Haobo_X

Angenommen, dies ist für das Berkeley AI-Projekt:

Im Allgemeinen ist das Finden des kürzesten Pfads, der jeden Punkt besucht, NP-schwer. Das bedeutet jedoch nicht, dass es in der Praxis schwer ist. Der Grund liegt darin, dass es feste Parameter für nachvollziehbare Parameter gibt und die Pacman-Labyrinthe unter den Fall von Graphen fallen, die leicht zu lösen sind.

Insbesondere kann für jede gegebene Zweigbreite der kürzeste Weg im Zeitpolynom in der Größe des Graphen (aber exponentiell in der Zweigbreite des Graphen) durch eine einfache Anwendung der dynamischen Programmierung gefunden werden. Dies verstößt nicht gegen die NP-Härte, da beliebige Graphen eine große Astbreite haben können. Dies bedeutet jedoch, dass das Problem effizient gelöst werden kann, wenn Sie nur auf Graphen achten, die eine geringe Astbreite haben. Die Pacman-Labyrinthe haben eine schlechte Konnektivität und daher eine geringe Astbreite.

Für mehr Details siehe diesen Beitrag .

0
Antimony

sagen Sie in einem bestimmten Spielzustand md(x) die Entfernung von Pacman zum Knoten x. Betrachten Sie minmd(X) als Funktion, die xmin s.t md(xmin)<=md(x) für alle x in X zurückgibt. Lassen Sie X die Menge von Lebensmitteln sein, die Pacman noch zu essen hat.

Denken Sie darüber nach - wenn Sie eine Entspannung Ihrer Pacman-Welt in Betracht ziehen, in der es keine Wände gibt, kann Pacman nicht weniger laufen als md(xmin), wo xmin=minmd(X) etwas Obst isst, und dann, wenn er eine andere Frucht essen möchte, muss er nicht weniger als md(xmin1) wo xmin1=minmd(X-{xmin}) und so weiter. Geben Sie die Summe der mds pacman zurück, die von xmin zu xmin1 zu xmin2 usw. gelaufen sind. Da dies eine optimale Lösung für die Entspannung ist, haben Sie sich eine großartige zulässige und cosistent heuristische Funktion!

Ein weiterer zu berücksichtigender Punkt ist, dass Sie sogar eine bessere Heuristik erhalten können, wenn Sie die Wände in Betracht ziehen. Dies ist ein viel schwierigeres Problem. Ich habe mich nicht viel damit beschäftigt, aber ich habe festgestellt, dass Pacman in einem Rechteck mit der nächsten optimalen Frucht gebunden ist. Er muss mindestens zwei weitere Aktionen bezahlen, wenn zwischen ihnen eine VOLLSTÄNDIGE vertikale oder horizontale Wandlinie vorhanden ist, da er das umgebende Rechteck verlassen und erneut eingeben muss, wobei er mindestens zwei Aktionen für jede dieser Wände tätigen muss. Dies kann weiter untersucht werden und in diesem Rechteck finden Sie weitere Besonderheiten.

0
Ofek Ron