Offensichtlich funktioniert der Versuch, den Min-Max-Algorithmus auf den gesamten Zugbaum anzuwenden, nur für kleine Spiele (ich entschuldige mich bei allen Schachbegeisterten, mit "klein" meine ich nicht "simpel"). Bei typischen rundenbasierten Strategiespielen, bei denen das Spielbrett häufig breiter als 100 Felder ist und sich alle Teile einer Seite gleichzeitig bewegen können, ist der Min-Max-Algorithmus nicht anwendbar.
Ich habe mich gefragt, ob ein partieller Min-Max-Algorithmus, der sich auf N Platinenkonfigurationen in jeder Tiefe beschränkt, nicht gut genug sein kann. Unter Verwendung eines genetischen Algorithmus ist es möglicherweise möglich, eine Reihe von Platinenkonfigurationen zu finden, die für die Bewertungsfunktion geeignet sind. Hoffentlich können diese Konfigurationen auch gut für langfristige Ziele sein.
Es würde mich wundern, wenn das noch nie gedacht und ausprobiert worden wäre. Hat es? Wie funktioniert es?
quelle
Antworten:
Das hängt von der Spielmechanik ab. Spielbaum Min-Max kann insgesamt nicht anwendbar sein, aber möglicherweise gilt es in einigen Bereichen. Es ist üblich, dass einige Orte auf einer Karte strategisch wichtig sind. Min-Max kann auf strategischer Ebene gelten, für welchen dieser Standorte die Kontrolle ausgeübt werden soll. Auf taktischer Ebene kann für die x Quadrate um jede strategische Position ein Minimum-Maximum verwendet werden, um zu entscheiden, wie Einheiten eingesetzt werden, um sie zu erobern und zu verteidigen.
quelle
Dies ist kein Minimax-Algorithmus, aber die für die Killzone-KI Verantwortlichen haben eine Veröffentlichung veröffentlicht, die auf Positionsbewertungsfunktionen basiert, die auch von einigen KI-Schachspielern verwendet werden.
Es ist sehr einfach, denn alles, was es tut, ist eine Position auf dem Board zu finden, basierend auf dem aktuellen Wissen des Agenten. Wenn also die Gesundheit des Agenten niedrig ist, erhalten Positionen, die weiter von seinem Feind entfernt sind, eine höhere Punktzahl, da es wünschenswerter ist, außerhalb der Reichweite des Feindes zu sein.
Das Paper befindet sich in AI Game Programming Wisdom 3 und trägt den Titel Dynamic Tactical Position Evaluation.
Ein Entwurf des Papiers finden Sie online hier:
http://www.cgf-ai.com/docs/straatman_remco_killzone_ai.pdf
Ich hoffe, das hilft.
quelle
Ich denke nicht, dass es gut genug wäre. Die Auswahl der spezifischen N-Konfigurationen, wie viele und welche, wäre in so einer komplexen Umgebung praktisch unmöglich. Denken Sie daran, wenn Ihr Spiel über unendlich viele Ressourcen oder ähnliches verfügt, kann es Kreise geben, wie es gespielt werden kann, was das Ausnutzen einer solchen KI relativ einfach macht.
quelle
Ich würde vorschlagen, mindestens Min-Max mit Alpha-Beta-Bereinigung zu implementieren.
Ohne es zu versuchen und zu entscheiden, ist es unpraktisch (dh schreckliche Leistung), und ohne mehr Hintergrundwissen über die Spielmechanik, verstehe ich nicht, warum Sie denken, dass Min-Max nicht anwendbar ist.
Die Größe des Boards ist möglicherweise ein Problem, aber beim Beschneiden ermöglicht das Verwerfen verlorener Pfade eine tiefere Suche mit dem gleichen Rechenaufwand, sodass die größeren Board-Bereiche beim Beschneiden möglicherweise kein Problem darstellen. Angenommen, die Platinengröße selbst ist ein Problem, das möglicherweise verfrüht ist. Dies hängt weniger von der Größe der Platine als von der Komplexität der Mechanik ab und davon, wie viele Bewegungen von jeder Platinenposition aus möglich sind. Wenn Ihr Spiel ein großes, aber dünn besiedeltes Gebiet hat, ist die Anzahl der möglichen Züge in den einzelnen Bretterzuständen möglicherweise nicht viel anders als wenn das Brett gerade groß genug wäre, um alle Teile aufzunehmen. Natürlich, wenn Sie ein gigantisches Board haben, das zu 90% voll ist und sich überall in jeder Runde bewegen kann, ist viel Suche erforderlich.
Ich bin mir auch nicht sicher, warum gleichzeitige Bewegung von Natur aus ein Problem ist. Solange Sie von einem diskreten Board-Status in einen anderen wechseln und eine Bewertungsfunktion haben, sollte der Algorithmus angewendet werden.
Ich gehe davon aus, dass Sie ohnehin eine Evaluierungsfunktion benötigen. Unabhängig von der von Ihnen verwendeten Suche ist die Evaluierungsfunktion der Ort, an dem der größte Teil der Arbeit wahrscheinlich anfällt. Der Min-Max-Algorithmus mit Bereinigung ist selbst sehr einfach zu implementieren, was wahrscheinlich in ein oder zwei Stunden erledigt werden kann, und ein Großteil der Infrastrukturarbeit wie Board-Statusspeicherung, Auswertung und Generierung von Verschiebungen wird wahrscheinlich unabhängig von der gleich sein Suche, mit der Sie sich abfinden.
quelle
Der Gewinner der Google AI-Challenge 2011 verwendete Min-Max (Tiefe 1). Ein anderer Spitzenkandidat verwendete Zufallsstichproben . Dieser Teilnehmer erwähnte, dass eine Mischung aus Min-Max- und Zufallsstichproben, wie ich sie in meiner Frage beschrieben habe, schlecht abschneide. Damit ist es erledigt, denke ich.
Andererseits zeigt es, dass es möglich ist, Min-Max in großen Spielen zu verwenden. Es schien jedoch notwendig zu sein, es auf kleine Ameisengruppen zu beschränken. Die Arbeit mit dem gesamten Satz aller Ameisen wäre wahrscheinlich zu langsam gewesen. Eine weitere interessante Beobachtung ist, dass eine Tiefe von 1 ausreichte. Wir (Menschen) sind ziemlich gut darin geworden, Schach zu spielen, und eine KI für dieses Spiel braucht viel tiefere Suchbäume, um herausfordernd zu sein. Neue, komplexere Spiele wurden so lange nicht mehr gespielt und studiert, und dümmeren AIs könnte ein ausreichender Unterhaltungswert zu Gute kommen.
quelle
Die Grundidee einer Schach-KI besteht darin, eine Liste aller möglichen Züge aus dem derzeit geschätzten besten Zug zu erstellen, sie dann zu bewerten und den Vorgang zu wiederholen. Dies führt dazu, dass diejenigen, die zu wenig Chancen haben, nicht berücksichtigt werden (oder davon ausgegangen werden können, dass sie nicht berücksichtigt werden, da sie anscheinend keinen Vorteil bieten).
Die Grundidee erfordert, dass Sie eine Liste aller möglichen Züge erstellen und diesen Vorgang für alle diese Züge usw. wiederholen. Dies ist im Schach möglich (wobei die Liste der wahrscheinlichen nächsten Züge effektiv aufzählbar ist; ein Startschachbrett hat 20 mögliche Züge) ) und bis zu einem gewissen Grad für andere Dinge wie Backgammon, Dame und das Lösen eines Zauberwürfels.
Wenn ich ein einfaches rundenbasiertes Spiel (Civilization 2) als Beispiel nehme, kann sich jeder Ihrer Spieler in einer Runde auf insgesamt 8 Felder (oder 24) bewegen. Wenn Sie 10 Leute haben (was nicht viel ist, haben Sie in der Regel mehr, wenn es etwas interessanter wird), beträgt die Gesamtzahl der möglichen "Züge" aus dem aktuellen Zustand (also einem einzelnen Level) bereits 8 ^ 10 oder etwa 4 Milliarden. Selbst wenn Sie 99,99% davon beschneiden, können Sie nicht tief in den Baum eindringen, da die Anzahl der möglichen Züge sehr schnell explodiert.
Hinzu kommt, dass das Spiel ein bisschen wie das Rubik's Cube-Problem ist, bei dem Sie erst nach 10 oder 12 Zügen Fortschritte sehen. Das Problem explodiert bis zu einem Punkt, an dem die Vorteile eines Standard-Min / Max erst bei einer Speicherkapazität von 1% überwiegen mehr als Ihr typischer Computer haben wird.
Mit anderen Worten, die Strategien, die es finden wird, sind reproduzierbar, aber schlecht.
Für das eigentliche Problem, wie man eine anständige KI macht, würde ich in die Richtung einer grundsätzlich gesteuerten zufälligen Bewegung (jeden Kerl mit ein bisschen grundlegender Intelligenz bewegen), Auswertung und Abstimmung gehen. Tun Sie dies parallel für 100 oder 1000 verschiedene und wählen Sie diejenige aus, die am Ende die beste ist. Sie können die Ergebnisse in die ursprüngliche intelligente Lenkung zurückmelden, um sie erneut abzustimmen. Ein bisschen wie die Monte-Carlo-Simulation.
quelle
Um Min / Max erfolgreich auf ein rundenbasiertes Strategiespiel anzuwenden, müssen Sie alle verfügbaren Schachtechniken korrekt anwenden ...
Bewertungsfunktion
Sogar Schach-Engines haben eine sehr schlechte Stärke, wenn Ihre Bewertungsfunktionen schlecht sind. Die einfachste Version einer Bewertungsfunktion ist: 1 = Spiel von Weiß gewonnen, -1 = Spiel von Schwarz gewonnen, 0 = alle anderen Fälle; Dies würde jedoch zu einer sehr schlechten Leistung führen. Das gleiche passiert mit deinem rundenbasierten Spiel! Wenn Sie wie im Schach Min / Max (mit Alpha / Beta-Bereinigung und so weiter) verwenden möchten, müssen Sie auch eine vernünftige Auswertungsfunktion implementieren! Andernfalls können Sie die Leistung dieser Algorithmen bei der Anwendung auf Ihr Strategiespiel nicht mit dem Fall vergleichen, in dem sie auf Schach angewendet werden.
Was Bewertungsfunktionen von Schachengines tun, ist die Bewertung von Dingen wie:
Diese Teile der Bewertungsfunktion müssen zuerst in Ihr Spiel "übersetzt" werden:
Die verschiedenen Bewertungen müssen für alle Einheiten durch die Gewichtungsfunktion (factor_a * rating_a + factor_b * ranting_b + ...) summiert werden ...
In Strategiespielen müssen auch die verbleibenden Ressourcen (Gold, Holz, ...) berücksichtigt werden.
Wenn Ihre Bewertungsfunktion gut genug ist, müssen Sie in den meisten Fällen nicht wirklich "tief" in den Baum suchen. Sie müssen sich also wahrscheinlich nur die drei oder zehn vielversprechendsten Optionen genauer ansehen. Siehe nächstes Kapitel ...
Mögliche Bewegungen an jeder Position
Das Schwierigste an der Verwendung von Min / Max für Strategiespiele ist, dass Sie mehrere Einheiten in einer Runde befehlen können, während Sie im Schach nur eine Einheit befehlen dürfen (mit Ausnahme der Rochade, aber dies ist eine klar definierte Zugkombination). Dies führt zu 5 ^ N möglichen Zügen für N Einheiten für jede "Position" (Schachbegriff), wenn Sie sich nur für jede Einheit zwischen "Nach Norden, Süden, Westen, Osten ODER Stopp" entscheiden würden. Sie können dies lösen, indem Sie den komplexen Befehl in Befehle der unteren Ebene aufteilen: Wählen Sie z. B. die Aktion für Einheit A, gehen Sie in die Tiefe und entscheiden Sie sich für Einheit B .... entscheiden Sie sich für Einheit N ... und beenden Sie dann diesen Zug. Dies allein ändert jedoch nichts an der Komplexität! Sie müssen die Reihenfolge optimieren, in der Aktionen Einheiten zugewiesen werden (z. B. zuerst Einheit B, C, D und dann Einheit A). Sie können die Auswirkung der Entscheidung für jede Einheit während der letzten Berechnung aufzeichnen und dann nach Wichtigkeit sortieren. Auf diese Weise kann Alpha-Beta-Bereinigung verwendet werden, um jede schlechte Kombination sehr früh aus dem Suchbaum zu entfernen. Die höchste Priorität sollte in jeder Iteration immer "nichts mehr tun und deinen Zug beenden" (Null-Verschiebungsbeschnitt) sein. Auf diese Weise können Sie das Zuweisen der meisten Aufgaben zu den meisten Einheiten "überspringen" und sie einfach so weitermachen lassen, wie sie es zuvor getan haben. Auf diese Weise wird die Suche schnell vertieft, indem Sie sich nur die "kritischen" Einheiten ansehen (z. B. die Einheiten, die sich gerade wirklich im Kampf befinden). Stellen Sie sicher, dass Sie jede Einheit nur einmal kommandieren ... Sie können auch einen Zufallsbefehl verwenden, um sicherzustellen, dass die "wichtigen" Einheiten auch von Zeit zu Zeit einen Befehl erhalten. Insbesondere Einheiten, die einen Job beenden (z. B.
Iterative Vertiefung + Caching / Hash-Tabelle
Dann kann man "interaktiv vertiefen", um mehr und mehr in die Tiefe zu gehen, bis ein gewisses Zeitlimit erreicht ist. Sie werden also tiefer suchen, wenn es weniger Einheiten gibt, und Sie haben immer ein "Ergebnis", wenn Sie aufhören, nach einer besseren Lösung zu suchen. Für die iterative Vertiefung müsste eine Hash-Tabelle verwendet werden, um frühere Suchergebnisse zwischenzuspeichern. Dies ermöglicht auch die Wiederverwendung einiger Ergebnisse der Suche in den letzten Runden (der Zweig des Suchbaums, der die Befehle abdeckt, die tatsächlich in der letzten Runde ausgeführt wurden). Um dies zu implementieren, benötigen Sie eine sehr gute Hash-Funktion (siehe "zobrist key"), die iterativ aktualisiert werden kann. Das Aktualisieren des Hash-Schlüssels bedeutet, dass Sie nur den Hash-Schlüssel der alten "Position" nehmen und nur die Änderung der Position einleiten können (z. B. Nehmen Sie das Gerät an Position x ab und setzen Sie es an Position y). Auf diese Weise ist die Berechnung des Hash-Schlüssels schnell und Sie müssen nicht die gesamte Board-Situation verarbeiten, um ihn zu berechnen, nur um zu überprüfen, ob der Hash einen früheren Eintrag für diese Position enthält. In gewisser Weise müssen Sie sicherstellen, dass keine Hash-Kollisionen auftreten.
Nicht deterministisches Verhalten
Nicht deterministisches Verhalten ist ein Problem bei Min / Max-Suchen. Dies bedeutet, dass Sie nicht sicher sind, ob Sie ein angegriffenes Ziel treffen werden (z. B. beträgt die Wahrscheinlichkeit 10%). Dann kann man das eben nicht planen. In diesem Fall müssen Sie den Algorithmus ändern und eine "Wahrscheinlichkeits" -Ebene dazwischen setzen. Es ist ein bisschen wie "es sind die Wahrscheinlichkeiten". Jedes unabhängige Ergebnis muss separat betrachtet werden. Die Bewertung durch diese Tiefen- "Schicht" muss dann abgetastet werden (Monte Carlo Sampling) und das Ergebnis der eingehenden Bewertung muss mit der Wahrscheinlichkeit des Auftretens gewichtet werden. Unterschiedliche Ergebnisse der Wahrscheinlichkeitsschicht müssen als unterschiedliche gegnerische Bewegungen betrachtet werden (aber anstelle von min / max muss der "Durchschnitt" berechnet werden). Dies erhöht natürlich die Komplexität des Suchbaums.
Zusammenfassung
Wenn Sie all diese Techniken (die alle von aktuellen Schachengines verwendet werden) auf ein deterministisches Spiel anwenden, werden Sie mit Sicherheit auch für ein Spiel vernünftige Ergebnisse erzielen können. Für nicht deterministische Spiele wird dies wahrscheinlich komplizierter sein, aber ich halte es immer noch für handlich.
Eine gute Quelle zur Erklärung dieser Techniken (für Schach) ist http://chessprogramming.wikispaces.com/
Sie können sogar eine Art gerichtete Zufälligkeit in Min / Max-Suchen implementieren. Anstatt die besten Ergebnisse zuerst in jeder Iteration deterministisch zu untersuchen, können Sie diese einfach randomisieren und ihre Reihenfolge durch eine Wahrscheinlichkeitsverteilung bestimmen lassen, die auf den aktuellen Auswertungen basiert ...
quelle