Entwicklung einer listigen KI in einem taktischen Spiel, das auf Heuristiken und Mutationen basiert

In taktischen Spielen ist KI sehr wichtig. Wenn KI als „kĂŒnstlicher Idiot“ angesehen wird, kann das Spiel durch erstaunlichen Multiplayer, Handlung, AtmosphĂ€re und Grafik gerettet werden (dies ist ungenau). Die Lösung liegt auf der Hand: Machen Sie eine gute KI, was könnte das Problem sein?

Cat Terminator von CoolAI

Im Detail. Im Folgenden sind meine Schritte zum Aufbau einer starken KI mit Charakter aufgefĂŒhrt. Nicht super stark [ 1 ], aber in der Lage, schnell lokal in einem gefrĂ€ĂŸigen Browser eines mittelschwachen PCs zu arbeiten. Ich habe den Ansatz von Expertensystemen unter Verwendung einer Reihe von Heuristiken und Mutationen angewendet. Es werden 15 Schritte der schrittweisen Transformation der KI beschrieben, wobei jeder der Schritte zu spĂŒren ist.

Kurzbeschreibung


In einem experimentellen Browsergame basiert die KI auf der Erzeugung vieler möglicher ZustĂ€nde - den Ergebnissen des aktuellen Zuges. (Aufgrund der Spielspezifikationen und der Bequemlichkeit werden diese resultierenden ZustĂ€nde im Artikel je nach Kontext entweder Turn-Szenarien oder KI-Strategien genannt .) Dann werden die Szenarien des Kurses mutiert. GemĂ€ĂŸ den erhaltenen Szenarien werden die SchĂ€tzungen des "Erfolgs" berechnet. Am erfolgreichsten und von einem Computer-Spieler durchgefĂŒhrt.

Beispielsweise werden drei Strategien generiert:

  1. Laufen Sie hektisch vorwÀrts und greifen Sie alle an, die den Arm hochdrehen. Punkte des Endzustands: 37000 Punkte.
  2. Greife BogenschĂŒtzen aus sicherer Entfernung an, wĂ€hrend sich der Rest in den Ecken versteckt. 45000 Punkte.
  3. Alle ziehen sich zurĂŒck, gruppieren sich und verstecken sich vor Feinden. Wenn Sie einen Feind aus sicherer Entfernung verletzen können, greifen Sie an. 18000 Punkte.
  4. In diesem Fall wird die 2. Strategie ausgewÀhlt.


Nun, alles scheint Standard zu sein. Nicht wirklich.

Der gesamte Zellstoff ist, wie die Skripte generiert werden und wie der Wertkoeffizient des Skripts berechnet wird. In einem von ihnen auferlegen, und das Ergebnis wird Sie traurig machen.

Spielregel


Der Spieler und die KI haben anfangs 6 identische Einheiten an den Ecken. Jedes Team wechselt sich abwechselnd mit allen Einheiten gleichzeitig ab. Optionen fĂŒr den Fortschritt jeder Einheit:

  • einen Zug ĂŒberspringen;
  • bewege dich und ĂŒberspringe;
  • Bewegen Sie sich und greifen Sie an ( Sie können und mĂŒssen manchmal Ihre eigenen angreifen ).

Das Spielfeld und die Zusammensetzung des Teams werden prozedural generiert ( dh zufĂ€llig, jedoch mit DurchgĂ€ngigkeitsprĂŒfungen und akzeptablem "Takt" ). Einheitentypen:

  1. Fighter F, Nahkampfeinheit mit der grĂ¶ĂŸten ÜberlebensfĂ€higkeit, dem grĂ¶ĂŸten Schaden und der grĂ¶ĂŸten MobilitĂ€t. Eine Art Panzer + Schaden.
  2. BogenschĂŒtze A, der niedrigste Schaden, aber der Angriff erfolgt in einer geraden Linie in einer Entfernung von 1-7.
  3. Zauberer W stirbt mit einem Schlag eines KĂ€mpfers, aber der Angriff erfolgt in einer Entfernung von 1-5 in einer geraden Linie durch alle Einheiten.

Das Spielfeld ist immer 10 * 10 groß.

Mögliche Felder auf der Karte:

  • Erde - legt keine EinschrĂ€nkungen fest.
  • Wand - durch sie kann man weder schießen noch passieren.
  • Wasser - es ist unmöglich, es zu passieren, aber ein BogenschĂŒtze kann hindurchschießen (ein feuriger Magier kann es nicht ).



Das Spiel ist vollstĂ€ndig bestimmt, das heißt, es enthĂ€lt kein Zufallselement (100% Trefferchance, kein kritischer Schaden usw.). Es ist auch ein Spiel mit vollstĂ€ndigen Informationen, dh Rivalen wissen zu jeder Zeit alles ĂŒber den Zustand der Truppen des jeweils anderen. Wie bei Dame.

KI ist stÀrker als ein Fleischspieler, aber letzterer auf der ersten Ebene hat ein Handicap in Form einer Einheit. Am 3. hat der Spieler im Gegenteil ein Handicap von einer Einheit und es ist viel schwieriger zu gewinnen (ich habe ungefÀhr 15% der Siege in dieser Phase). Dann kommt die eher zufÀllige Version von Game +.

Abgebrochenes Gameplay
Anfangs wurde ein anderer Spielplan in Form eines „Swings“ entwickelt als in der Gesamtwertung, aber am Ende der Entwicklung habe ich ihn als schwach motivierend aufgegeben. Der Punkt war, dass wenn ein Team verliert, es auf der nĂ€chsten Karte +1 Einheit erhĂ€lt und so weiter bis zu maximal 10 gegen 6. Wenn und dann das Team es geschafft hat zu verlieren, dann haben seine Einheiten die Eigenschaften erhöht.

Das Spiel wurde auf nativem Javascript entwickelt: auf Divs und CSS-Stilen, und dies war die unglĂŒcklichste mögliche Lösung [ 2 ]. Dies ist ein Browsergame. Der Motor wurde nicht benutzt. Das einzige Ziel des Projekts ist es, einen starken Computerspieler „mit Charakter“ zu schaffen und diesen Charakter zu Ă€ndern (Berechnung von Cyborgs, aggressiven Orks, tĂŒckischen Elfen, dummen Zombies).

Um den "Computerstil" des Feindes zu reduzieren, wurden einige Tricks angewendet:

  • Der Spieler wartet nach seinem Zug nicht, bis die KI ĂŒber seinen Zug nachdenkt. Der Feind beginnt „sofort“, seine Bewegungen auszufĂŒhren ( in Wirklichkeit ist dies eine Illusion ).
  • Der Computerspieler steuert die Einheiten auch mit seinem Cursor ( und dies ist auch eine Illusion, der Cursor fliegt nur zur gleichen Zeit wie die Einheitenanimationen ).
  • KI kann heimtĂŒckische Köder verwenden, um einen Kampf zu erzwingen ( alles ist fair ).

Und was ist so kompliziert?


Auf den ersten Blick scheint alles einfach zu sein: Sie können einfach alle Optionen aller ZĂŒge sortieren und die beste auswĂ€hlen. Aber sehr bald wird klar, dass alles sehr schwierig ist.
Eine vollstĂ€ndige AufzĂ€hlung ist aufgrund des kombinatorischen Explosionseffekts [ 3 ] nicht möglich. Dies besteht darin, dass die KomplexitĂ€t der Berechnungen mit zunehmender Anzahl der in den Szenarien ĂŒberprĂŒften Elemente exponentiell zunimmt. Als nĂ€chstes werde ich beschreiben, was dies in meinem speziellen Spiel bedeutet.

Erstens, weil In jeder Runde gehen die Teameinheiten alle auf einmal , dann kann ihre Reihenfolge unterschiedlich sein. Und mit 6 Einheiten im Team solcher Kombinationen wird 720 (1 * 2 * 3 * 4 * 5 * 6). Wenn es mehr Einheiten geben wird, wird es eine große Anzahl von Kombinationen geben (bei 7 - 5040, bei 8 - 40320 ...). Wenn Sie das maximale Ergebnis nicht berĂŒcksichtigen, riskiert der Spieler, das VergnĂŒgen in Erwartung des nĂ€chsten Zuges fĂŒr 5-10 Minuten auszuprobieren ( und wenn er hartnĂ€ckig ist, wird die Verzögerung auf Millionen von Jahren anwachsen, nicht jeder wird leiden ). Aufgrund dieser Eigenschaft ist meine KI zu Beginn des Kampfes weniger effektiv als am Ende. Gegen Ende ist bereits die HĂ€lfte des Teams gestorben.

Keine Einheit - kein Problem

Zweitens kann sich jede Einheit zu verschiedenen Punkten der Karte bewegen . KĂ€mpfer mit einem Bewegungsbereich von 4 können 1-41 verschiedenen Positionen Ă€hneln. FĂŒr Zauberer und BogenschĂŒtzen mit einer Bewegung in 3 betrĂ€gt die mögliche Anzahl von ZĂŒgen 1-25. Zum Beispiel kann die Zusammensetzung des Teams sein: 4 KĂ€mpfer, 1 Magier und 1 BogenschĂŒtze. Wir erhalten die Summe der verschiedenen Kombinationen von ZĂŒgen fĂŒr diesen Gegenstand: 41 * 41 * 41 * 41 * 25 * 25 = 1766100625. In der RealitĂ€t gibt es aufgrund gegenseitiger Schnittpunkte und unpassierbarem GelĂ€nde weniger Kombinationen, aber in einer seltenen Situation mit „Streuung auf der Karte“ wird die Anzahl der Kombinationen sein nĂ€here dich dieser Zahl.

Drittens kann jede Einheit nach der Bewegung eine Bewegung ĂŒberspringen oder in eine von vier Richtungen angreifen. Das heißt, wir haben 5 mögliche endgĂŒltige Aktionen pro Einheit. Gesamtkombinationen: 5 ^ 6 = 15625.

Gesamtkombinationen: 720 * 1766100625 * 15625 = 19868632031250000.

Und in jeder gĂŒltigen Kombination mĂŒssen die Punkte des resultierenden Zustands berechnet werden. Die Bewertungsfunktion umfasst: Nachahmung von Bewegungen, Angriff, Verursachen von Schaden, Tod von Einheiten und ZĂ€hlen der verbleibenden Trefferpunkte von Überlebenden. NatĂŒrlich ist die Anzahl der Kombinationen ĂŒberbewertet, weil Unter realen Bedingungen nimmt die VariabilitĂ€t aufgrund der Grenzen und Hindernisse auf der Karte ab, es handelt sich jedoch immer noch um eine unertrĂ€gliche Anzahl von Kombinationen. Und das alles passiert schließlich in einem normalen Browser.

Wie wird es gemacht?


Um ein Àhnliches Problem zu lösen, wurde ein heuristischer Ansatz verwendet, dessen verallgemeinerter Algorithmus wie folgt beschrieben werden kann:

  1. Generieren Sie verschiedene Szenarien basierend auf vordefinierten Strategien (~ 20 Teile).
  2. Solange Zeit bleibt, mutieren Sie die Skripte und lassen Sie die profitabelsten ĂŒbrig.
  3. WÀhlen Sie am Ende das Szenario mit der höchsten Bewertung aus.
  4. FĂŒhren Sie den ersten Zug der Einheit aus dem Skript aus, aber gehen Sie den Rest nicht. Starten Sie die Animation des ersten Zuges und verbessern Sie die Skripte fĂŒr die verbleibenden Einheiten, wĂ€hrend die Animation angezeigt wird.
  5. Wiederholen Sie dies fĂŒr die verbleibenden Einheiten ab Schritt 1.

Die heuristische Methode ist eine Methode, die funktionieren kann (nach McConnell [ 4 ]). Mehr und strenger auf Wikipedia [ 5 ].

Die wichtigsten Punkte in diesem Algorithmus sind: Szenarioerstellung, Mutationen und die korrekte Bewertung der RentabilitÀt des Staates. Jeder dieser Punkte verwendet seine eigenen lokalen Heuristiken. Trotzdem wurden nach Möglichkeit Algorithmen mit einem garantiert optimalen Ergebnis verwendet, beispielsweise A * zum Auffinden des Pfades [ 6 ].

Der evolutionĂ€re Ansatz, den ich verwendet habe, kann nicht als vollwertiges Gen bezeichnet werden [ 7 ], weil Ich habe nur Mutationen und das Überleben des „StĂ€rksten“ von ihm verwendet und die Einflusskoeffizienten der einzelnen Heuristiken manuell angepasst. Algorithmen zur Bildung von Populationen und Kreuzen wurden nicht verwendet. Nach der Mutation ĂŒberlebt nur eine: entweder eine Mutante oder ein Elternteil.



Ich habe aufgrund der Art des Problems keine neuronalen Netze [ 8 ] verwendet. Erstens aufgrund der KomplexitÀt ihrer erfolgreichen Implementierung in einem sich stÀndig Àndernden Umfeld (das Aufkommen neuer Mechaniken, FÀhigkeiten, Fertigkeiten). Zweitens aufgrund der KomplexitÀt ihrer kontrollierten Personalisierung (wenn Sie zwei Verhaltensweisen vornehmen möchten: schnelles Suworow und vorsichtiges Kutuzow [ 9 ]).

Die Entwicklung eines kĂŒnstlichen Idioten zur kĂŒnstlichen Intelligenz


0) ZunĂ€chst wurden in der KI nur 3 Strategien mit zufĂ€lligen Bewegungen eingefĂŒhrt. { Schwierigkeit des Spiels # 0 }. Die Zustandsbewertung war nur eine Zufallszahl. Und da KI nicht das einzige Entwicklungselement ist, musste ich mich lange mit dem Verhalten verrĂŒckter Fische abfinden.

1) Bei der Berechnung der Bewertung der Strategie wurden dann die ÜberprĂŒfungen der verbleibenden Einheiten und ihres Lebens mit der KI und dem Spieler hinzugefĂŒgt. { Schwierigkeit des Spiels # 10 }. FĂŒr eine tote Einheit erhielt das Team 0 Punkte. FĂŒr völlig gesunde X-Punkte (zum Beispiel 100.000 fĂŒr KĂ€mpfer F, 70.000 fĂŒr BogenschĂŒtze A, 85.000 fĂŒr Zauberer W). FĂŒr die Verwundeten wurden 50% des Kernwerts und die restlichen 50% im VerhĂ€ltnis zu den verbleibenden Leben des Maximums berechnet. Dank dessen war es fĂŒr die KI rentabler, Feinde zu töten, und wenn er nur verletzen konnte, wĂ€hlte er Gegner mit weniger Leben - verletzlicher.

ZufĂ€llige Bewegungen wurden bedeutungsvoller - KI gab manchmal etwas zurĂŒck.

2) Dann wurde eine aussagekrĂ€ftigere Startstrategie hinzugefĂŒgt:
max_agro - Alle Soldaten rannten so nah wie möglich an die Feinde heran und versuchten , so viel Schaden wie möglich zuzufĂŒgen . { Schwierigkeit des Spiels # 20 }. Eine Strategie verwendete die ursprĂŒngliche Zugreihenfolge der Einheit, die zweite ging in umgekehrter Reihenfolge vor.

AI begann sich in taktischen Spielen wie der primitivste kĂŒnstliche Idiot zu verhalten. Und ziemlich oft wird eine solche KI in taktischen Spielen verwendet. Es ist beliebt wegen seiner ZuverlĂ€ssigkeit und Einfachheit. Dieser kann sogar gewinnen - aber sehr selten.

Genau so sieht KI-Verhalten im fehlgeschlagenen Spiel Master of Monsters - Disciples of Gaia aus, was es mĂŒhsam macht, darin zu spielen [ 10 ].

Meister der Monster - SchĂŒler von Gaia

3) Dann wurden Strategien hinzugefĂŒgt, die möglichen Schaden durch Feinde wĂ€hrend der Bewegung berĂŒcksichtigen und diejenigen Bewegungen auswĂ€hlen, die zur geringsten Gefahr fĂŒhrten - vorzugsweise Null. { Schwierigkeit des Spiels # 30 }. Und die KI wurde sofort ĂŒbermĂ€ĂŸig feige und vermied jegliche NĂ€he zum Feind - es ist besser wegzulaufen als anzugreifen und zu verletzen, weil der Feind mehr VerĂ€nderung geben kann!

Daher begann die Bewertung der Bedingungen auch, den möglichen Schaden fĂŒr den Feind zu berĂŒcksichtigen. Strafpunkte aus potenziellem Schaden durch Feinde wurden mit einem abnehmenden Koeffizienten von 0,20 berechnet (der Koeffizient wurde stĂ€ndig neu konfiguriert ). Dies zwang die KI, bei der Wahl zwischen Angriff oder Flug eine aggressive Option zu wĂ€hlen, da sie fĂŒnfmal mehr Punkte als der Flug brachte. Aber die KI blieb noch lange feige, denn um in eine Situation der Wahl zu gelangen, sollte der Feind bereits in Reichweite sein, und die KI selbst wird sich mit solchen EinschĂ€tzungen niemals zuerst angreifen. Das heißt, es wird nicht zur AnnĂ€herung gehen. NatĂŒrlich wird sich der Spieler betrogen fĂŒhlen, weil die KI unendlich viel Geduld hat und fĂŒr immer vor der Gefahr davonlaufen kann, was den Spieler zur Aggression zwingt.

Es ist zu beachten, dass solche Berechnungen möglicher SchĂ€den ohne die Verwendung eines Caches sehr lang sind. Eine vollstĂ€ndige FehleinschĂ€tzung einer Strategie ohne Optimierungen dauerte zunĂ€chst 700 Millisekunden. Aber ich habe eine Begrenzung fĂŒr den gesamten Verlauf einer Einheit ~ 4000 ms! Nach Optimierungen und verbrauchten Caches verringert sich diese Zeit mit sehr Ă€hnlichen Strategien auf 20 Millisekunden ( leider kann der Cache aufgrund des kombinatorischen Explosionseffekts nicht alle im Voraus berechnet werden, sodass nicht immer 20 ms erreicht werden ).

Als ich die Berechnungstechnologie mit der Vorhersage mehrerer ZĂŒge vor mir einfĂŒhrte, dauerte die Berechnungszeit fĂŒr eine Tiefe von nur 2 ZĂŒgen (Feind und KI) bereits +700 Millisekunden. In diesem Fall wird die Optimierung verwendet, indem die "schwachen" Zweige abgeschnitten werden. Wenn wir hierfĂŒr die primitive max_agro-Strategie verwenden, betrug der Zeitanstieg +30 Millisekunden, und das Caching hat diesen Unterschied fast nicht verringert ( da die Position auf der Karte völlig neu war ).

Infolgedessen habe ich 5 verschiedene AnsÀtze zur Entwicklung dieses Ansatzes gemacht, aber am Ende habe ich ihn komplett aufgegeben, weil Mutationen mit Heuristiken ergaben bessere und schnellere Ergebnisse.

4) Die folgenden Strategien zielten darauf ab, die anfÀngliche Vielfalt der Strategien zu erweitern:
far_attack_and_hide - Einheiten versuchen, so weit wie möglich vom Feind entfernt anzugreifen. Wenn sie nicht angreifen, verstecken sie sich vor jedem Angriff.

close_group_flee - Einheiten ziehen sich aus dem Kampf zurĂŒck und gruppieren sich so nah wie möglich beieinander. Wenn Sie den Feind gleichzeitig sicher angreifen können, greifen Sie an.
{ Schwierigkeit des Spiels # 40 }.

Dies verbesserte den Prozess des Kampfes selbst, aber der Beginn des Kampfes war fĂŒr die KI immer unrentabel: Es zog sich stĂ€ndig zurĂŒck, aber es konnte in den Angriff gelockt und abgeschreckt werden, so dass die KI-Gruppe in mehrere kleine Gruppen aufgeteilt wurde, die separat zerstört werden konnten.

5) Dann ist es Zeit fĂŒr Mutationen . { Schwierigkeit des Spiels # 50 }.

Der Mutationsalgorithmus war sehr einfach:

  • Beim Durchlaufen der ausgewĂ€hlten Strategien wurde eine Kopie der Strategie erstellt.
  • in dieser Kopie wurde eine Mutation des Kurses gemacht;
  • Wenn der Zug ungĂŒltig wurde, wurde er gemĂ€ĂŸ einer der Standardstrategien auf mindestens einen gĂŒltigen korrigiert.
  • Punkte der mutierten Strategie wurden berechnet;
  • Wenn der Mutant mehr Punkte hatte, ersetzte der Mutant seinen Elternteil.

Gleichzeitig haben Außenstehende die Strategie nicht gelöscht und sich auch an Mutationen beteiligt, weil Es war immer eine spĂŒrbare Wahrscheinlichkeit fĂŒr eine sehr erfolgreiche Reihe von Mutationen.

ZunĂ€chst wurde der primitivste Mutationstyp implementiert: 1 bis 3 Bewegungen wurden durch zufĂ€llige ersetzt, die Reihenfolge der Bewegungen blieb gleich. WĂ€hrend einer Iteration von Berechnungen wurden durchschnittlich etwa 5 bis 15 Mutationen fĂŒr jede Strategie erstellt. DarĂŒber hinaus war im Durchschnitt jede fĂŒnfte Mutation rentabler und ersetzte die Strategie der Eltern.

6) Heuristischer Köder . { Schwierigkeit des Spiels # 60 }.

Diese Heuristik wiederholte die Taktik, mit der ich die KI dazu verleitete, mit einer Einheit anzugreifen, um sie einzeln zu töten. Dieser Trick wurde auch der KI beigebracht.

Dazu wird bei der Berechnung von Punkten fĂŒr den Zustand der Strategie geprĂŒft, ob der aktuelle Zustand der Situation des Köders entspricht:

  • Es kann nur ein KI-Soldat angegriffen werden.
  • Nur ein Feind kann eine gekrochene Einheit angreifen.
  • Die Einheit des Computerspielers muss nach diesem Angriff ĂŒberleben.
  • Mindestens zwei Einheiten des Computers können als Reaktion darauf angreifen. Je mehr solche Bestrafungseinheiten, desto mehr Punkte fĂŒr die Heuristik.

Der Effekt erwies sich als ausgezeichnet: Es wird fĂŒr den Spieler einfacher, den Kampf selbst zu beginnen. DarĂŒber hinaus ist es fĂŒr den Spieler meistens immer noch rentabler, sich auf diesen Köder zu setzen, da er nach einem Gegenangriff mit seinem gesamten Kader auf die KI fallen kann ( dies ist der Fall, wenn er vorher vernĂŒnftig gruppiert ist ). Und dort werden alle kompetenten lokalen taktischen Entscheidungen alles lösen.


7) Dann fiel mir auf, dass sich KI-KĂ€mpfer stĂ€ndig wie Kakerlaken zerstreuen . { Schwierigkeit des Spiels # 70 }. Außerdem könnten sich Soldaten in einer Ecke verstecken oder in enge Tunnel gehen, in denen die KI bei der Sortierung möglicher Angriffe stark an Wirksamkeit verloren hat.
Daher wurden der Bewertungsfunktion Heuristiken zur SchĂ€tzung der Entfernungen zwischen Einheiten und Kartentopographie mit den folgenden Annahmen hinzugefĂŒgt:

  • Je nĂ€her die VerbĂŒndeten "im Durchschnitt" beieinander sind, desto besser (die Einheiten begannen sich seltener in verschiedene Teile der Karte zu zerstreuen).
  • Je nĂ€her die KI-Soldaten den „durchschnittlichen“ Soldaten des Feindes sind, desto besser (ich brauchte eine offensive KI).
  • Je grĂ¶ĂŸer der maximale Abstand zwischen zwei VerbĂŒndeten ist, desto schlechter. Gleichzeitig wird eine Entfernung von 4 nicht bestraft, und alles, was grĂ¶ĂŸer ist, wird exponentiell bestraft (dies hat aufgehört, Soldaten in gefĂ€hrdete Reihen zu ziehen).
  • Wenn ein KI-Soldat nicht in mindestens zwei Runden rennen und den Feind angreifen kann, muss er mit einer Geldstrafe belegt werden (dies zwingt ihn, voranzukommen, aber nicht selbst angegriffen zu werden).
  • Wenn sich innerhalb eines Radius von 2 Schritten vom Soldaten zu viele Sperrpositionen befinden, wird eine Geldstrafe verhĂ€ngt (seltener stießen sie auf Tunnel).
  • Wenn sich ein Soldat am Rand der Karte befindet, wird er noch hĂ€rter bestraft. Infolgedessen nahm die ManövrierfĂ€higkeit der KI stark zu Eine Einheit kann von einem offenen Bereich zu einer viel grĂ¶ĂŸeren Anzahl von Positionen laufen als von einer Ecke oder einem Tunnel.

8) Dann ist es Zeit, Strategien zu erweitern. { Schwierigkeit des Spiels # 80 }. Ich konnte keine vollstĂ€ndige AufzĂ€hlung der möglichen Reihenfolge der Einheitenbewegungen hinzufĂŒgen, aber ich konnte ihre Bewegungen nach Typ auflisten: KĂ€mpfer, BogenschĂŒtze, Zauberer. Daher erschienen Strategien fĂŒr die Abfolge von ZĂŒgen der Form W_A_F: zuerst gehen alle Zauberer, dann alle BogenschĂŒtzen, dann alle KĂ€mpfer.

Somit wurden 6 neue Strategien hinzugefĂŒgt: W_A_F, W_F_A, A_W_F, A_F_W, F_A_W, F_W_A. Sie haben nicht alle Probleme gelöst, aber die QualitĂ€t des Spiels erheblich verbessert.

9) Ich hatte Mutationen, aber sie waren von geringem Nutzen. { Schwierigkeit des Spiels # 90 }. Meist verbesserten sie schwache Strategien, wÀhrend erfolgreiche sich selten verbesserten. Daher wurden die Mutationen modifiziert und jedes Mal funktionierte eine der zufÀlligen Arten von Mutationen:

  • 1 bis 3 Bewegungen wurden durch zufĂ€llige ersetzt, die Reihenfolge der ZĂŒge blieb gleich (alter Weg);
  • Tauschen Sie die Bewegungsreihenfolge von zwei zufĂ€lligen Einheiten aus. Lassen Sie sie unverĂ€ndert, auch wenn sie nicht optimal sind. Wenn die Bewegung nicht wiederholt werden kann, wird sie zufĂ€llig durch eine der ĂŒblichen Strategien in einen gĂŒltigen Zustand versetzt.
  • Vertauschen Sie die Reihenfolge der ZĂŒge zweier zufĂ€lliger Einheiten und erzĂ€hlen Sie ihre ZĂŒge erneut. Alle fehlgeschlagenen Bewegungen in nachfolgenden Einheiten werden durch zufĂ€llige konventionelle Strategien repariert.

Die EinfĂŒhrung dieser Mutationen begann ernsthaft die Unmöglichkeit zu kompensieren, alle Kombinationen von Einheitenbewegungen vollstĂ€ndig aufzuzĂ€hlen. Obwohl er aufgrund seiner ZufĂ€lligkeit keine Garantie dafĂŒr gibt, dass ein Coup in der verfĂŒgbaren begrenzten Zeit gefunden wird.

10) Dann wurden weitere halbzufĂ€llige Strategien hinzugefĂŒgt . { Schwierigkeit des Spiels # 100 }. Die Reihenfolge der ZĂŒge wurde zufĂ€llig generiert und die ZĂŒge selbst wurden nach den folgenden Prinzipien ausgewĂ€hlt (um ihre Bedeutung zu verringern):

  • maximalen Schaden zufĂŒgen;
  • als Reaktion so wenig Schaden wie möglich nehmen;
  • Gehen Sie Ihren Feinden so nahe wie möglich.

Ich habe hier keine spĂŒrbare Verbesserung gesehen, aber das Projekt ist bereits so weit fortgeschritten, dass jede Verbesserung zu weniger spĂŒrbaren reproduzierbaren Effekten fĂŒhrt.

11) Ich hatte die krassen Fehler der KI satt, als er meine Soldaten angriff, wĂ€hrend er mit seinem Zauberer angriff, aber gleichzeitig seine VerbĂŒndeten verwundete. { Schwierigkeit des Spiels # 110 }. Obwohl er vorher tatsĂ€chlich mit ihnen herumlaufen und sie aus der Schusslinie entfernen konnte. Daher wurde eine hart generierte Strategie mit manuellen ÜberprĂŒfungen erstellt :

  • Wenn es einen Zauberer gibt, dann finde einen Ort, an dem er maximalen Schaden zufĂŒgt.
  • Wenn es an diesem Ort oder auf dem Weg des Streiks VerbĂŒndete gibt, erinnere dich an sie.
  • Erstens gehen alle VerbĂŒndeten, an die sie sich erinnern, und können keine vom Zauberer reservierten Positionen einnehmen (dh den Weg frei machen).
  • der Zauberer geht;
  • Die restlichen Einheiten gehen.

Die Strategie lĂ€sst sich leicht in Worten beschreiben, ist aber fĂŒr die Programmierung cool.

12) Manchmal " flĂŒchteten " Einheiten kurz vor Beginn der Feindseligkeiten in die BĂŒsche . { Schwierigkeit des Spiels # 120 }. Infolgedessen konnten zu Beginn des Angriffsaustauschs eine oder sogar zwei Einheiten zu weit von militĂ€rischen Operationen entfernt sein und den VerbĂŒndeten nicht helfen. Wenn dies passierte, war mir fast garantiert, dass ich die KI schlagen wĂŒrde. Wenn es nicht passiert ist, habe ich oft verloren. Ich habe dies beseitigt, indem ich eine neue Heuristik eingefĂŒhrt habe, um die resultierenden Punkte der Strategie zu bewerten. FĂŒr jede Einheit wurde eine ÜberprĂŒfung durchgefĂŒhrt:

1. Wenn die Einheit in diesem Zug angegriffen hat, erhielt sie +1500 Punkte.
2. Wenn Sie nicht angegriffen haben, wurden die Positionen berechnet, von denen aus die Feinde den VerbĂŒndeten Schaden zufĂŒgen konnten. ZĂ€hlen Sie weiter, wenn mehr als 0 solcher Positionen vorhanden sind (N> 0).
2.1. Wenn eine Einheit keine Position erreichen und schlagen kann (n = 0), erhÀlt sie eine Strafe von -1000 Punkten.
2.2. Wenn eine Einheit alle Positionen erreichen kann, erhÀlt sie +1200 Punkte.
2.3. Wenn eine Einheit bis zu bestimmten Positionen angreifen kann, erhÀlt sie + (n / N) * 1000 Punkte.

Dies hat den „Zusammenhalt“ der KI-Einheiten erheblich verbessert. Leider tauchten FĂ€lle von „einem Deserteur“ auf, als eine der verwundeten Einheiten es vorzog, sich in einer verlorenen Situation hinter dem RĂŒcken ihrer Kameraden zu verstecken, anstatt einen Beitrag zu leisten, indem sie den Feind angriffen. Es sah lĂ€cherlich aus, wenn der Computer nur noch 2 Einheiten hatte und der Spieler 3 oder mehr. Eine zusĂ€tzliche Korrekturheuristik ist die folgende Regel:

IF ("   ,   " AND "    3 ") THEN "      " 

13) Am Ende der EinfĂŒhrung der Strategien hatten sie bereits weniger als 25 StĂŒck. { Schwierigkeit des Spiels # 130 }.

Die Mutation jedes einzelnen von ihnen ist zu teuer geworden. Daher wurde beschlossen, die erfolglosesten zu entfernen und nur 8 StĂŒck zu belassen. Von Anfang an wollte ich diesen Ansatz nicht in der Erwartung verwenden, dass die Mutation von Außenstehenden zu einem unerwartet hervorragenden Ergebnis fĂŒhren kann, anstatt nur zu einem guten. Die Eingabe dieser Verarbeitung fĂŒhrte letztendlich zu einer Verbesserung des KI-Spiels.

14) Zu Beginn gab es noch eine interessante Überarbeitung. ZunĂ€chst wurde der Wert des Szenarios als Differenz der Punktesumme berechnet:

 _ = _ - _ 

Aber nach mehreren Verbesserungen fiel mir ein, dass dies nicht die beste Lösung ist, weil dann sind fĂŒr AI die Situationen "2 Soldaten gegen 1 einzelnen Soldaten" und "4 Soldaten gegen 3 Soldaten" gleich. Daher wurden Punkte als VerhĂ€ltnis berechnet:

 _ = _ / _ 

Die Änderung ist gering und das Ergebnis ist sehr ernst. Ohne Änderung war der Preis eines Fehlers mit erhöhtem Risiko immer der gleiche. Nach der Verfeinerung begann die KI gegen Ende des Kampfes weniger nachlĂ€ssig zu riskieren, was sie deutlich stĂ€rkte.

Ich möchte darauf hinweisen, dass all diese Verbesserungen schrittweise eingefĂŒhrt wurden, wenn auch in der angegebenen Reihenfolge, aber viele von ihnen wurden verbessert, verarbeitet und aufgrund von Fehlern in einer chaotischeren Reihenfolge korrigiert. Es gab mehr als 100 echte Iterationen.

So spielt die endgĂŒltige KI { Schwierigkeitsgrad des Spiels # 9999 }:


AI geht sofort und verschwendet keine Zeit mit Nachdenken


Um die Berechnungen selbst zu beschleunigen, wurden Optimierungsalgorithmen aktiv in Form von Partitionen verschachtelter Schleifen in sequentielle Schleifen ( Reduzierung der KomplexitĂ€t ) und der EinfĂŒhrung mehrerer Arrays mit zwischengespeicherten vorlĂ€ufigen Berechnungen ( und anschließender Optimierung dieser Caches ) verwendet. Nach meinen SchĂ€tzungen könnten weitere Optimierungen zu einer doppelten (oder sogar grĂ¶ĂŸeren) Geschwindigkeitssteigerung fĂŒhren, dies wĂŒrde jedoch zu einer ungerechtfertigten Erhöhung der Zeitkosten und einem weiteren noch grĂ¶ĂŸeren Verlust der Lesbarkeit des Codes fĂŒhren.

Die Haupttechnologie der Hochgeschwindigkeit sind vorlÀufige Berechnungen wÀhrend der Ausfallzeit. Diese Methode besteht darin, den Prozess in zwei Teile zu unterteilen: die Berechnungen selbst und die Animation der Berechnungsergebnisse:

  • Berechnungen des Verlaufs der ersten Einheit beginnen unmittelbar nach dem Zug des Spielers, wĂ€hrend ein Fenster herausfliegt, in dem der Zug des Gegners beginnt. Und das sind bis zu 4 Sekunden, die der Spieler nicht als leere Erwartung wahrnimmt.
  • Die Berechnungen des zweiten und der nachfolgenden ZĂŒge beginnen, wenn die Animation des Verlaufs der letzten Einheit erst beginnt (dh wenn der KI-Cursor gerade seine Bewegung beginnt). Und die Zeit aller Animationen betrĂ€gt bereits 4,5 Sekunden. Es wĂ€re zwar richtiger, dies nicht die Berechnung des nĂ€chsten Schrittes zu nennen, sondern die Verbesserung der bereits entwickelten frĂŒheren Strategie und die Suche nach einer neuen, weil Bei jeder Iteration werden die Bewegungen des gesamten Teams berechnet.
  • Wenn sich die animierende KI zu beweglichen Einheiten bewegt, fliegt der KI-Cursor, der vorgibt, auf sie zu klicken. Der Cursor fliegt so schnell wie möglich, damit der Komfort der Verfolgung erhalten bleibt. DarĂŒber hinaus konnte durch HinzufĂŒgen eines Cursors nicht nur die Rechenzeit von 2 Sekunden auf 4,5 Sekunden erhöht werden, sondern auch der Fortschritt des Computers fĂŒr eine Person komfortabler angezeigt werden.
  • Die Zugzeit des Spielers wird ebenfalls nicht verschwendet. Solange der Spieler denkt, werden fast keine Berechnungen durchgefĂŒhrt, so dass zu diesem Zeitpunkt mögliche Caches fĂŒr den zukĂŒnftigen Zug des Computergegners intensiv berechnet werden.

Um zu verhindern, dass all dies im Browser zurĂŒckbleibt und mit einem relativ stabilen FPS arbeitet, werden die Berechnungen vom Worker ( Web Worker ) asynchron durchgefĂŒhrt [ 11 ].

Auf diese Weise wollte ich das nervige Wartefenster „Computer-SpaziergĂ€nge“ loswerden. Solch ein unangenehmer WĂŒrfel ist in vielen guten Spielen zu finden, zum Beispiel bei Xenonauts [ 12 ]. Ich glaube, dass ich dieses Problem bewĂ€ltigen konnte.

Xenonauten - versteckte Bewegung

Daher verbringt die KI immer die gleiche Zeit damit, ĂŒber ihren Umzug nachzudenken - unabhĂ€ngig von ihrer KomplexitĂ€t. Ein sehr merkwĂŒrdiges Merkmal dieses Ansatzes ist, dass je stĂ€rker der Spieler einen Computer hat, desto mehr KI-Mutationen Zeit zum Aussortieren haben und daher umso stĂ€rker und leistungsfĂ€higer der Computer des Spielers ist. Ich habe diesen Effekt zuerst entfernt, indem ich die Laufzeit festgelegt und die Geschwindigkeit des Computers vorberechnet habe. Allerdings habe ich dann diese Fixierung entfernt, weil Besitzer von leistungsstarken Computern können so mit "ihrem" Computer kĂ€mpfen, anstatt mit dem durchschnittlichen.

Was ist das Ergebnis und was sind die Nachteile


Somit weiß der resultierende Computergegner, wie man wĂŒrdig kĂ€mpft und nutzt die Versehen eines Spielers gut aus und macht nicht zu viele seiner eigenen. Trotzdem kenne ich alle Merkmale seiner Arbeit, wenn auch mit Spannung, aber ich besiege ihn fast immer (unter gleichen Bedingungen). Aber ich möchte das Gegenteil: Selbst wenn ich ĂŒber seine Eigenschaften Bescheid weiß, verliere ich fast immer gegen ihn. KI ist alles andere als ideal, da die von mir verwendeten Heuristiken zu einer synergistischen Überlappung von "Fehlern meiner Wahrnehmung" fĂŒhren. Diese Fehler sind:

  1. Aufgrund der Unvollkommenheit und UnvollstÀndigkeit meiner eigenen Strategie kenne ich nicht alle besten Strategien und kann sie daher nicht identifizieren und im Spiel umsetzen.
  2. Effizienzverlust (was nicht so ideal ist) von ausgearbeiteten Heuristiken bei der Übertragung auf Programmcode. Zum Beispiel meine menschliche Heuristik: „Einheiten bleiben in der NĂ€he, aber nicht zu nahe, um doppelten Schaden durch Magier zu vermeiden und nicht in engen Passagen stecken zu bleiben.“ Diese Heuristik hilft mir, die KI zu besiegen, aber wenn ich sie meinem Computergegner beibringe, muss ich eine qualitative Beschreibung in eine algorithmische mit quantitativen SchĂ€tzungen ĂŒbersetzen, und hier ist Datenverlust möglich.
  3. Gegenseitige Konflikte zwischen Heuristiken. Wenn zu viele Heuristiken vorhanden sind, beginnen sie sich allmĂ€hlich zu ĂŒberlappen. Infolgedessen kann eine unerwartete VerstĂ€rkung aufgrund einer versteckten DoppelzĂ€hlung oder einer teilweisen Verdoppelung auftreten. Oder irgendeine Art von Heuristik wird aufhören, irgendetwas zu beeinflussen, weil sein Beitrag wird durch große konkurrierende Koeffizienten vollstĂ€ndig blockiert.
  4. Enge ZeitbeschrĂ€nkungen und schrittweise Verbesserungen der gewĂ€hlten Strategien fĂŒhren dazu, dass der erste Schritt immer weniger durchdacht ist. Dies bedeutet, dass ein erfolgloser erster Zug die offensichtlich effektiveren ZĂŒge der verbleibenden Einheiten des Teams blockieren kann. Dies drĂŒckt sich in der Tatsache aus, dass der erste KĂ€mpfer F, anstatt sich zu entfernen, den Feind ironisch angreifen kann und dann sein VerbĂŒndeter W seinen eigenen verletzen muss, um den Feind zu erledigen.

Vollwertige genetische Algorithmen wĂŒrden es höchstwahrscheinlich ermöglichen, optimalere Koeffizienten in der Heuristik auszuwĂ€hlen, anstatt sie mit dem Auge abzugleichen. Dies ist jedoch bereits eine Aufgabe fĂŒr zukĂŒnftige vollwertige Projekte - ich möchte nicht lange an einem Prototyp hĂ€ngen bleiben. Ich bin sehr zufrieden mit der aktuellen KI: Sie ist umsichtig, ein wenig heimtĂŒckisch, ziemlich aggressiv und erlaubt dem Spieler nicht, sich trocken zu besiegen ( in Wirklichkeit ist es Ă€ußerst selten, dies zuzulassen ).

ZusÀtzliche Funktionen


Mit dieser Implementierungsmethode können Sie zusÀtzliche Boni in der Spieleentwicklung erzielen ( in vielerlei Hinsicht aus Sicht des Entwicklers und seiner brennenden Bedingungen ):

  1. Das Erscheinen neuer Mechaniken im Spiel wird die StĂ€rke des Computerspielers nicht zerstören, obwohl es ihn im Vergleich zum Spieler allmĂ€hlich schwĂ€cht. Diese SchwĂ€chung kann durch die EinfĂŒhrung zusĂ€tzlicher Heuristiken ausgeglichen werden. Damit dies nicht zu fortschreitenden Ressourcenausgaben fĂŒhrt, können diese neuen Heuristiken nur angewendet werden, wenn diese neuen Mechaniken im aktuellen Kampf vorhanden sind.
  2. Wirklich intelligente Schwierigkeitsgrade . GrundsÀtzlich bestimmt der Schwierigkeitsgrad, welche Boni ein Computerspieler als Ressourcen erhÀlt ( mehr Gold zu Beginn oder ein Bonus im Bergbau ) oder wie viel seine Soldaten schlagen ( + 50% Schaden ). Es funktioniert, aber Sie können die KI ein wenig weniger intelligent machen, indem Sie einige Heuristiken schrittweise deaktivieren, wenn die KomplexitÀt abnimmt.
  3. In der Fortsetzung des zweiten Absatzes können Sie verschiedene Rassen / Fraktionen von Computergegnern erstellen: Nur aggressive Strategien funktionieren fĂŒr Orks; in Massen von Zombies rennen nur die Primitiven „vorwĂ€rts und greifen an“; und Cyborgs nutzen die volle Kraft der KI. Dank dieses Spielers muss vor dem Angriff nicht nur die Anzahl der Gegner, sondern auch deren Intelligenz bewertet werden.

All dies klingt vielversprechend, aber Sie sollten sich daran erinnern, dass all dies auf dem Papier schön ist und in einem echten Spiel möglicherweise nicht funktioniert, sich als uninteressant oder sogar fĂŒr den Spieler unsichtbar herausstellt. Dies ist jedoch ein guter Grund zum Experimentieren.

Wo zu fĂŒhlen


Sie können die Leistung dieser KI im taktischen KI-Rumpelbrowser testen. Testperson “kostenlos auf Websites wie itch.io [ 13 ]. Der GET-Parameter ai (Werte von 0 bis 140 in Schritten von 10) verringert die KomplexitĂ€t der KI.

Nach meinen Erwartungen wird es fĂŒr Sie sehr, sehr schwierig sein, KI zu gleichen Bedingungen zu besiegen. Auch nachdem man sich an die Spielregeln gewöhnt hat. Ich empfehle, dieses Spiel als Prototyp zu betrachten, was es im Wesentlichen ist (es enthĂ€lt keine Musik, Sounds und keinen Preis ).

Bitte hinterlassen Sie Ihre Meinung in den Kommentaren zur Interessantheit der KI, Tipps und Kritik zur möglichen Implementierung der KI mit verschiedenen Lehrmethoden. Wenn Sie sich plötzlich fĂŒr meine anderen Forschungsergebnisse interessieren, können Sie hier mein Konto abonnieren.

Referenzliste


1. DeepMind - Artikel ĂŒber HabrĂ© .
2. HTML5-Spiele: Canvas vs. SVG vs. div on stackoverflow .
3. Kombinatorische Explosion - Wikipedia .
4. Der perfekte Steve McConnell-Code ist Habr .
5. Heuristische Methoden - Wikipedia .
6. A * - Red Blob-Spiele .
7. Der genetische Algorithmus. Fast das Schwierige - Habr .
8. Acht erstaunliche Spiele mit kĂŒnstlicher Intelligenz von der Firma Google - Habr .
9. Ganz kurz ĂŒber Suworow und Kutusow .
10. Meister der Monster - SchĂŒler von Gaia - RĂŒckblick auf IGN .
11. Eine detaillierte ErklÀrung der JavaScript-Spielschleifen und des Timings .
12. Xenonauten und ein langer AI-Standby-Bildschirm .
13. KI taktisches Grollen. Testperson - auf itch.io.

Source: https://habr.com/ru/post/de461287/


All Articles