In dieser Frage geht es um eine Herangehensweise an Computergegner, die ich erstellt habe und die derzeit in mehreren Computerspielen verwendet wird oder für die geplant ist.
Hintergrund
Als ich letztes Jahr versuchte, einen Computergegner für ein Spiel namens "Minesweeper Flags" zu verbessern (kurze Beschreibung: Eine rundenbasierte Mehrspielerversion von Minesweeper, bei der Sie mehr Minen nehmen müssen als Ihr Gegner) , habe ich die Funktionsweise meiner Algorithmen stark verändert . Anstatt einen Ansatz wie if-else-if-else zu verwenden, verwende ich eine Reihe von "Scorern" mit festgelegten Gewichten, um den besten Zug zu bestimmen.
Man könnte meinen, dass es bei einem Spiel wie Minesweeper Flags nur darum geht, Züge zu machen, die die höchste Wahrscheinlichkeit bieten, eine Mine zu erobern, aber so einfach ist das nicht. Welche Bewegung der Computer ausführt, hängt normalerweise von verschiedenen Funktionen für diese bestimmte Bewegung im aktuellen Spielstatus ab. Beispiele für Funktionen:
- Wie hoch ist die Wahrscheinlichkeit, dass dieser Schritt eine Mine einbringt?
- Wie groß ist die Wahrscheinlichkeit, dass ich meinem Gegner hier etwas verrate?
Beschreibung des Systems
Das System funktioniert grundsätzlich so:
- "Pre-scorers": Für den aktuellen Spielstatus wird eine Voranalyse durchgeführt (in Bezug auf Minesweeper-Flags ist dies normalerweise: Berechnung aller Wahrscheinlichkeiten).
- "Scorer": Eine Reihe von normalen Scorern wird gebeten, die Punktzahl für jeden möglichen Zug zu ermitteln. Jeder Scorer wendet die Punktzahlen nach seinen eigenen Kriterien an. Die Torschützen können die Ergebnisse der durchgeführten Voranalyse überprüfen.
- Die im obigen Schritt berechneten Punktzahlen werden summiert und als Punktzahl für einen Zug festgelegt.
- Die Züge werden nach ihrer Punktzahl sortiert und geordnet, sodass alle Züge mit derselben Punktzahl den gleichen Rang erhalten.
- "Nachscorer": Das Ergebnis der oben genannten Aktion kann an "Nachscorer" gesendet werden, die die Möglichkeit haben, die Punktzahlen aller Felder nach den eigenen Regeln des Nachscorers nach Belieben zu ändern.
Wenn man eine Reihe von Pre-Scorern, Scorern (mit ihren Gewichten) und Post-Scorern kombiniert, wird dies zu einer so genannten Score-Konfiguration .
Beispielergebnis
Dies ist ein Beispiel für Punkte, die auf Minensuchflaggen angewendet wurden. Dies ist die Karte, die gewertet wurde:
Und dies ist die Ausgabe einer tatsächlichen Score-Konfiguration. Es zeigt den Rang der möglichen Züge, wobei 1 der beste Rang ist und weiß hervorgehoben wurde:
Dank des hochflexiblen Codes kann dieser Ansatz für AIs auch in andere Spiele eingefügt werden.
Vorteile und Nachteile
Nachfolgend sind einige Vor- und Nachteile dieses Systems aufgeführt, die ich mir vorstellen kann
Vorteile
- Es ist sehr einfach, viele verschiedene Konfigurationen für AIs zu erstellen.
- Es ist möglich, mit genetischen Algorithmen zu arbeiten: Jeder Schreiber hat ein zugehöriges Gewicht, das Gewicht kann zum Gen werden.
- Mit einigen Tools kann überprüft werden, warum ein bestimmter Zug ausgeführt wurde und welche Torschützen hauptsächlich für diesen Zug verantwortlich waren
- Mithilfe von Werkzeugen ist es möglich, eine Karte der Gesamtpunktzahl / Rangfolge möglicher Züge zu erstellen (wie im obigen Screenshot).
- Durch Anwenden von Scores auf die Art und Weise, wie der Mensch spielt, ist es möglich, einen "#AI_Mirror" zu erstellen, der versucht, Bewegungen auszuführen, von denen er denkt, dass der Mensch sie ausführen würde
Nachteile
- Es kann extrem schwierig sein, eine Score-Konfiguration "korrekt" anzupassen, um die KI so gut wie möglich zu spielen.
Fragen
Ist das System, das ich hier aufgebaut habe, in der KI-Welt weithin bekannt? Wie würde es in realen AI-Begriffen heißen?
Ist dieser Ansatz sinnvoll oder gibt es einen anderen Ansatz, den Sie empfehlen würden?
Welche Möglichkeiten bieten sich an, um das Ändern einer Score-Konfiguration zu vereinfachen?
In Bezug auf die letzte Frage bin ich mir der Möglichkeit bewusst, genetische Algorithmen zu verwenden, und bin mir auch der Tatsache bewusst, dass SARSA (und ich denke, dass meine Scorer der Beschreibung von Features mit Gewichten auf dieser Site ähneln, aber nach meinem Verständnis ist das nicht genau das, was ich erstellt habe Hier). Ich denke, dass ein Problem mit SARSA darin besteht, dass Sie die Belohnung erst kennen, wenn das Spiel vorbei ist. Der beste Zug ist oft ein Zug, der überhaupt keine Belohnung (eine Mine) gibt. Ihre aktuellen Gewinnchancen hängen sowohl von der aktuellen Punktzahl (wie viele Minen Sie und Ihr Gegner genommen haben) als auch davon ab, wie die aktuelle Karte aussieht.
Diese Frage wurde ursprünglich auf einer nicht mehr existierenden Website für künstliche Intelligenz gestellt .
Der für diesen Ansatz verwendete (Java-) Code wurde jetzt unter Code Review veröffentlicht .
quelle
Ja, die Technik, Punkte basierend auf bestimmten Aspekten der Position zuzuweisen, ist Standard beim Schreiben von AIs zum Spielen von Spielen. Zum Beispiel arbeiten fast alle Schachprogramme so, dass Positionen am wichtigsten anhand der verfügbaren Figuren bewertet werden, wobei kleinere Boni auf ihren Positionen basieren (z. B. Schachfiguren, die sich gegenseitig schützen). Sie versuchen dann, den besten verfügbaren Zug mithilfe eines gegnerischen Suchalgorithmus wie Alpha-Beta zu berechnen.
Eine gegnerische Suche könnte hier aufgrund des großen Verzweigungsfaktors schwierig sein - in jeder Position müssen die rechtlichen Schritte ein unbekanntes Quadrat markieren oder aufdecken. Andererseits ist es möglich, dass Sie den Verzweigungsfaktor durch Heuristiken erheblich reduzieren können. Zum Beispiel ist das Markieren oder Aufdecken eines Quadrats, von dem Sie nichts wissen, sehr selten der beste Zug. Wenn Sie die Standorte einiger nicht markierter Minen kennen, ist es wahrscheinlich die meiste Zeit der beste Schritt, eine von ihnen zu markieren. Die Aufrechterhaltung einer Umsetzungstabelle würde wahrscheinlich ebenfalls helfen.
quelle