Wir schreiben AI für Vindinium auf Single-Board-Computern. Teil 2: Entscheidungslogik

Eine Reihe von Artikeln über das Schreiben von KI für ein Multiplayer-Online-Spiel des Roguelike-Genres.


Teil 1
Teil 3


In diesem Teil des Artikels werden wir Ansätze zur Erstellung von Logik für KI betrachten, ein wenig über die Zielsetzung jedes gesetzestreuen Bots sprechen, die Wahl einer Programmiersprache bestimmen und Code schreiben.


Bild


Vindinium Game World


Um KI zu erstellen, müssen Sie die Struktur der Spielwelt verstehen.


Kostenlose Übersetzung der Spieldokumentation

Beschreibung


Vindinium ist ein rundenbasierter Multiplayer-Bagel. Jeder der vier Spieler hat einen Helden, der sich auf der Karte bewegen kann. Das Ziel ist, dass die Spieler innerhalb einer bestimmten Anzahl von Zügen die maximale Menge an Gold sammeln (jeder Spieler macht 300 Züge pro Spiel, das gesamte Spiel besteht also aus 1200 Zügen). Die Spieler müssen die Kontrolle über Goldminen übernehmen, um Gold zu produzieren. Die Minen sind jedoch durch Kobolde geschützt. Wenn ein Spieler einen Kobold besiegt, wird er der Besitzer der Mine und erhält ein Gold pro Spielzug. Außerdem schützt der Kobold die Mine jetzt vor anderen Spielern.


Helden können gegeneinander kämpfen. Ein Überlebender im Kampf erlangt die Kontrolle über alle Goldminen seines Gegners. Der getötete Held wird sofort mit all seinem Gold wiedergeboren, jedoch gehen alle Minen in die Hände des Mörders.


Auf dem Weg in die Taverne können Helden Bier für 2 Einheiten Gold kaufen und so ihre Gesundheitspunkte wiederherstellen.


Ziel ist es, ein Computerprogramm (Bot) zu erstellen, das das Vindinium-Spiel so vernünftig wie möglich spielt. Es wird empfohlen, eines der Starter-Kits für eine große Anzahl von Programmiersprachen als Ausgangspunkt zu verwenden.


Karte


Karten werden zufällig erstellt. Jedes Spielobjekt auf der Karte wird mit zwei Zeichen codiert. Kartenbeispiel:


+----------------------------------------+ |######$- $-############$- $-######| |###### ## ## ######| |####[] #### #### []####| |## #### ## ## #### ##| |#### $- $- ####| |########## @1 @4 ##########| |############ #### #### ############| |$-##$- ############ $-##$-| | $- $-################$- $- | | ######################## | | ######################## | | $- $-################$- $- | |$-##$- ############ $-##$-| |############ #### #### ############| |########## @2 @3 ##########| |#### $- $- ####| |## #### ## ## #### ##| |####[] #### #### []####| |###### ## ## ######| |######$- $-############$- $-######| +----------------------------------------+ 

Legende


## - Unwiderstehlicher Wald
@1 - Der erste Held
[] - Tavernen
$- - Goldmine (gezeichnet)
$1 - Goldmine (im Besitz des ersten Helden)


Die generierten Karten sind symmetrisch und enthalten immer 4 Tavernen und 4 Helden.


Held


Helden können für jede Runde eine Zelle bewegen und haben die folgenden Indikatoren:


  • Gesundheitspunkte (HP): Jeder "frische" Spieler beginnt mit einem Maximalwert = 100. Wenn HP auf Null fällt, stirbt der Held (siehe Abschnitt "Tod des Helden").
  • Gold: Dies ist ein Indikator für den Erfolg des Helden. Am Ende des Spiels werden die Helden anhand ihrer Goldmenge bewertet.
  • Die Anzahl der Goldminen.

Fahrtrichtung


Der Bot muss einen Befehl pro Runde erteilen. Mögliche Bestellungen: ( Stay ), ( North ), ( South ), ( East ) oder ( West ). Sobald der Befehl ausgeführt wird, bleibt der Held an seinem Platz oder bewegt eine Zelle in eine bestimmte Richtung.


Heldenbewegung

Wenn der Held:


  • Beim Versuch, über die Karte hinaus oder durch Bäume zu gehen, passiert nichts.
  • Es betritt die Goldmine, bleibt an Ort und Stelle und:
    • Wenn die Mine bereits dem Helden gehört, passiert nichts.
    • Wenn die Mine Niemandsland ist oder einem anderen Helden gehört, gibt es einen Kampf mit der Koboldwache, die die Mine bewacht. Der Held verliert 20 Lebenspunkte. Wenn er überlebt, meins ihn.
  • Er tritt auf einen anderen Helden, er bleibt an Ort und Stelle und nichts passiert. Heldenkämpfe werden am Ende des Zuges entschieden.
  • Er betritt die Taverne, bleibt an Ort und Stelle und befiehlt sich zu essen. Der Held zahlt 2 Gold und stellt 50 Gesundheit wieder her. Bitte beachten Sie, dass die Gesundheitsmenge 100 Einheiten nicht überschreiten darf.
  • Er sendet keine Bestellung in der ihm zugewiesenen Zeit (1 Sekunde), er bleibt bis zum Ende des Spiels an Ort und Stelle, es wird unmöglich, neue Bestellungen zu senden. Bitte beachten Sie, dass er immer noch gewinnen kann, wenn er am Ende des Spiels mehr Gold hat als andere Spieler.

Ende der Runde


Nachdem sich der Held bewegt hat (oder beschlossen hat, still zu bleiben), passieren folgende Dinge:


Schlachten

Helden sind etwas nervös und verpassen nie die Gelegenheit, sich mit großen Schwertern zu schlagen. Wenn sich am Ende des Zuges des Helden ein Feind in einer Entfernung von einem Feld in eine beliebige Richtung befindet, greift ihn der Held an. Zum Beispiel in dieser Situation am Ende des Zuges des ersten Helden ( @1 ):


 ######## ##@1@2## ## @3## ######## 

Spieler 1 greift den zweiten Spieler an, berührt aber nicht den dritten, da der dritte zwei Felder von ihm entfernt ist.
Der Angreifer verliert keine Gesundheitseinheiten, der Verteidiger verliert 20 Einheiten.
Wenn der Verteidiger stirbt (siehe: Tod eines Helden), erhält der Angreifer die Kontrolle über alle Goldminen des Verlierers.


Goldabbau

Nach seinem Zug und dem Kampf mit anderen Helden (falls vorhanden) erhält der Spieler eine Einheit Gold für jede kontrollierte Mine.


Durst

Dann verliert der Held eine Gesundheitseinheit, denn jede Handlung macht ihn durstig.
Bitte beachte, dass Helden nicht verdursten können. Im schlimmsten Fall sinkt der Wert ihrer Gesundheit auf eins.


Heldentod


Wenn die Gesundheit des Helden auf Null fällt, stirbt er. Der Held erscheint sofort auf der Karte an seinem Wiedergeburtspunkt mit einer vollen Gesundheitsreserve (100 Einheiten). Der Held verliert die Kontrolle über alle seine Goldminen, behält aber sein gesamtes angesammeltes Gold. Sei vorsichtig, wenn der Held zum Punkt der Wiedergeburt zurückkehrt. Jeder Gegner, der sich in dieser Zelle befindet, stirbt automatisch. Deshalb solltest du es vermeiden, in der Spawn-Zelle eines der Helden zu bleiben ...


Ein Held kann nicht verdursten. Durst kann einen Helden mit einer Gesundheitseinheit zurücklassen, ihn aber nicht töten.


Ende des Spiels


Das Spiel endet, wenn die maximale Anzahl von Zügen (normalerweise 300) erreicht ist. Der Gewinner ist der Held mit dem meisten Gold. Wenn zwei Spieler die gleiche Menge Gold haben, gibt es keinen Gewinner.


Bewertung


Das Bewertungssystem für die relative Stärke des Spielers verwendet die Elo-Bewertung . Die Idee ist: Es ist besser, der Erste als der Zweite zu sein, besser der Zweite als der Dritte und so weiter. Ich hoffe das Prinzip ist klar.


Mehrere Bots gleichzeitig verwenden


Sie können mehrere Instanzen Ihrer Bots gleichzeitig starten und im Allgemeinen alle Maßnahmen anwenden, die Ihrer Meinung nach geeignet sind, eine dominante Führung zu erreichen. Kämpfe!


Link zum Original


Es ist erwähnenswert, dass einige weitere Aspekte nicht in den Regeln beschrieben, sondern empirisch identifiziert wurden:


  • Wenn wir weniger als 21 Gesundheitseinheiten haben, Sie aber eine Mine angreifen, die Ihnen nicht gehört, sterben Sie. Ja, ja, es gibt keinen Schutz vor dem Narren, hier ist alles ernst, wie in echten Schlachten. Wenn Sie eine Niemandsmine angreifen, werden alle Ihre Minen zu Niemandsland, und wenn Sie einen Ihrer Feinde angreifen, gehen Ihre Minen in die Hände des Spielers über, dem diese Mine gehört.
  • Das Spiel beschreibt das folgende Verfahren: - - Wir 1 . Und was passiert, wenn wir während der Ausführung des Befehls sterben (im Spiel können Sie dies nur tun, indem Sie im Kampf mit dem Kobold sterben)? Wir werden wiedergeboren (und töten sofort den Spieler, der sich jetzt an unserem Spawnpunkt befindet), verlieren jedoch die Fähigkeit, Gegner in der Nähe zu treffen, und verlieren auch nicht 1 Gesundheit aufgrund von Durst.
  • Nachdem wir den Feind getötet haben, der während unserer Wiedergeburt an unserem Spawnpunkt steht, erobern wir seine Minen, hehe.
  • Die Karte hat ein quadratisches Erscheinungsbild, die Länge der Karte nimmt gerade Werte auf dem Segment an [8, 28].

"Lerne von deinen Feinden und du wirst ihre Stärken verstehen"


Vindinium ist ein öffentliches Spiel. Seine nützliche Seite ist, dass wir in das Profil eines jeden Spielers schauen und die letzten hundert Kämpfe mit seiner Teilnahme sehen können. "Ausgezeichnet! Es ist Zeit, neuronale Netze zu verwenden, denn wir haben 50 Top-Spieler, nehmen wir die Top 10 von ihnen. Jeder der letzten 100 Kämpfe enthält ~ 300 Momente, in denen der Spieler eine Entscheidung treffen musste, insgesamt etwa 200-300.000 Einheiten Material für das Training! Und Sie können jede Situation im Uhrzeigersinn drehen, spiegeln usw., um noch mehr Material für das Training zu erhalten und das Ergebnis zu konsolidieren. Dies gibt uns bis zu 4,8-7,2 Millionen Materialeinheiten "- die Stimme der Vernunft kam heraus. Ja, tatsächlich hat eine solche Idee ein Existenzrecht. Darüber hinaus haben neuronale Netze viele Vorteile.


  • Alle Schulungsunterlagen können problemlos aus Open Source analysiert werden.
  • Für die Reflexion über Computer Vision wird ein breites Spektrum eröffnet:
    • Sie können alles so lassen, wie es ist. Es gibt 28 * 28 Eingangsneuronen (wenn die Karte kleiner ist, füllen Sie sie mit Bäumen).
    • Sie können jedes Mal entsprechend der Position des Helden zentrieren (vielleicht bringt es ein erstaunliches Ergebnis);
    • Sie können die Karte in Form eines Diagramms darstellen, wodurch die Arbeit des neuronalen Netzwerks beim Auffinden von Mustern erheblich erleichtert wird. Diese Option ermöglicht es dem Neuron, schnell Muster komplexen Verhaltens zu finden und schnell zu verstehen, warum wir, wenn wir wenig Gesundheit haben, zu einer entfernten Taverne gehen, wenn sich nur ein paar Tavernen in ein paar Zellen von uns befinden, selbst wenn der Gegner direkt daneben ist.
  • Ein bereits trainiertes neuronales Netzwerk kann angesichts der Aufgabe, Ressourcen im Voraus zu verbrauchen, kompakt in 512 Megabyte RAM platziert werden (tatsächlich werden etwa 480 Megabyte erhalten), so dass die Leistung eines Einplatinencomputers für Berechnungen ausreicht.

Der jugendliche Maximalismus in mir möchte jedoch den komplizierteren Weg gehen - nicht die Suche nach Mustern auf das neuronale Netzwerk zu legen, sondern diese Arbeit selbst zu erledigen, auf der Grundlage der intuitiv höheren Plastizität dieser Lösung.


Also. Entscheidungsbäume, Alpha-Beta-Clipping, Minimaxe ... zu anspruchsvolle Aufgaben! Beim Vindinium-Subreddit haben mehrere Entwickler, die den Schleier der Geheimnisse ihrer Bots enthüllen, diese Lösung bereits verwendet, und wahrscheinlich nicht unter solchen spartanischen Bedingungen. Leider ist es in diesem Bereich unwahrscheinlich, dass etwas besser gemacht werden kann als die anderen.


Nachdem ich Artikel über evolutionäre, genetische Algorithmen und das Lösen von Bäumen gelesen hatte, grub ich geheimes Wissen aus - potenzielle Felder. Mehr darüber können Sie hier und hier lesen. Diese Idee schien sehr gut zu funktionieren, da das potenzielle Feld ein planarer Graph ist und in jedem Link eine Funktion platziert ist, die von den Eingabedaten abhängt (insbesondere von der Entfernung zum Objekt, aber niemand stört sich daran, mehr Bedingungen zu schaffen). All dies passt perfekt in die Realität von Vindinium - Sie müssen nicht nach dem Pfad zum Objekt suchen, wenn dieser bereits im Algorithmus enthalten ist.


"Ziemlich spezifische Aromen"


Sehen wir uns die Kämpfe der Top-Charaktere an. Bevor wir anfangen, werden wir einen Favoriten auswählen, ihm folgen, ihn anfeuern, für die falschen Entscheidungen im Stil von "aber ich hätte an diesem Ort gehandelt ..." züchtigen. Nach einem Dutzend Kämpfen können Sie bereits die erste Skizze erstellen, was eine gesetzestreue KI ist (die Bedingungen werden in der richtigen Reihenfolge überprüft):


  1. Sie sollten sich dem Spawnpunkt des Feindes nicht nähern, wenn der Feind die Chance hat zu sterben (d. H. Wenn wir einen unrühmlichen Tod erwarten können, wenn wir auf dem Spawnpunkt des Feindes stehen).
  2. Es ist töricht, deinen Feind in der Nähe seines Spawnpunkts zu bekämpfen, denn er wird immer noch wie ein klarer Phönix mit voller Gesundheit sein und erneut versuchen, unsere ehrlich geplünderten Minen zu erobern.
  3. Wenn der Feind in unserer Nähe steht und wir in der Nähe der Taverne stehen - Zeit, sich zu betrinken. Gemessen an den zahlreichen blutigen Schlachten in der Nähe der Mittel zum Lebensunterhalt und zur Entspannung ist diese Regel sehr relevant.
  4. Wenn wir den Feind / die Feinde nicht besiegen können, aber es schaffen, zur Taverne zu rennen, rennen wir;
  5. Wenn wir den Feind / die Feinde nicht besiegen können und keine Zeit haben, die Taverne zu erreichen, dann:
    • Wenn wir uns auf einer Niemandsfarm umbringen können, bringen wir uns selbst um. Haben Sie einen Bissen!
    • Wenn wir an der Mine eines Menschen mit der geringsten Menge Gold sterben können, haben wir uns selbst darüber informiert.
    • Wenn ein trauriges Ende auf uns wartet, müssen wir diesem Reptil so viel Gesundheit wie möglich nehmen. Lassen Sie ihn lange an seinen Fehler denken!
  6. Wenn es einen Feind gibt, den wir innerhalb von zwei unserer Züge töten können und der Minenlinien hat, greifen wir an.
  7. Wenn es einen Feind gibt, der von allen Minilocks weiter entfernt ist als wir, und der 33% Minilock unter Kontrolle hat. Und wir können ihn besiegen - wir gewinnen, sonst trinken wir Bier.
  8. Wir erobern Farmen, wenn nichts anderes übrig bleibt.

Frage Antwort:


  • Was sind seine Vorteile gegenüber neuronalen Netzen, die diese Aufgabe hundertmal besser erledigen können, oder Bäumen, die alle Ihre nächsten n Schritte kennen und die bereits Gegenmaßnahmen entwickelt haben? Alles, was bleibt, ist die Verwendung einer guten Bewertungsfunktion?
  • (1) Multifunktionalität. Es ist einfacher, Parameter zu ändern und neue Funktionen hinzuzufügen. Sie folgen einem solchen Charakter, freuen sich und dann bam - und Sie sehen, dass Sie zu einem bestimmten Zeitpunkt völlig anders und vorsichtiger hätten handeln können - wir schreiben eine neue Regel oder ändern die alte. (2) Wir wissen auch genau, welche Entscheidung das Programm bei der Auswahl eines bestimmten Zuges leitete. (3) Potenzielle Felder haben sich in Bagels als Grundlage für die künstliche Intelligenz von Bots gut gezeigt.


  • Beweisen Sie, dass Ihr Ansatz gültig ist, dass Ihre Absichten etwas wert sind.
  • In der Rangliste hängt Zaraza 0.1 auf dem 27. Platz - KI auf potenziellen Feldern, die von nur drei Instinkten geleitet wird - greift gedankenlos nach allem, was ihm im Weg steht, trocknet nicht in Bars aus und verhält sich vorsichtig mit Feinden. Wenn Sie seinen Bewegungen folgen, werden Sie sehen, wie gut er kämpft, obwohl dies für die KI einfach unglaublich ist, die auf drei einfachen Regeln basiert und er nicht einmal von einem komplizierten Verhalten träumen wird. Außerdem arbeite ich jetzt an Zonko 0.11 , einer stark verbesserten Version von Zaraz 'Alkohol. Sie können aufgrund der verbesserten Interaktion mit Feldern ein viel komplexeres Verhalten integrieren - genau wie beim neuen GPS. Aber wie sich herausstellte, ist es unersättlich in Bezug auf Ressourcen, so dass der Prozess seiner Optimierung jetzt stattfindet ... Aber ich schweife ab, jetzt sprechen wir über strenge Beschränkungen, strenge strenge Regeln (...).


  • Dein Glaube ist lächerlich, dein Glaube ist zu schwach! Ich kann eine KI für method_name erstellen und sie wird dich zerreißen!
  • Es wird sehr angenehm sein, den Gedanken anderer Menschen zu diesem Thema zuzuhören. Außerdem habe ich für Sie bereits alle Kämpfe der Top-10-Spieler zusammengestellt, nur 1000 Kämpfe und ungefähr 1.000.000 Moves - Link (.zip - 33 MB, RAW - 1,68 GB). Ich biete die Bedingungen des Spiels an:
    • Registrieren Sie Bots unter Ihren Spitznamen in geektimes.
    • An die fünf Spieler, die vor dem 30. September die meisten Punkte erzielt haben als ich oder jeder andere, der angegeben hat, zu spielen, sende ich eine Postkarte aus Moskau.

Also, jetzt die Programmiersprache ... Persönlich bin ich jetzt zwischen Python3 (schnelle Entwicklung, einfach zu lesen, lange damit vertraut, es gibt Pypy3 (schnell optimierter Interpreter), Jupyter ("Notizbücher", in die Sie sicher Codeteile schreiben und optimieren können) unendlich); aber pypy / pypy3 funktioniert nicht unter ARM 64bit, und tatsächlich wird ARM nicht mehr unterstützt, und die Sprache selbst ist den kompilierten von Natur aus unterlegen) und Golang (auch schnelle Entwicklung, leicht zu verstehen, eine große Tendenz zum Backend, Multithreading und Multiprocessing). läuft schneller als Python, aber mit etsya, um sich an das Fehlen einer interaktiven Umgebung zu statischer Typisierung verwendet).


Die Hauptfunktion, die mit dem Server kommuniziert, kann wie folgt dargestellt werden:


Code
 #     train_url, arena_url, userkey,   config.py from config import train_url, arena_url, userkey import requests, random, json, time def start(is_train = True, debug = True, show_decision = True): #   if is_train: r = requests.post(train_url, data={"key":userkey}) else: r = requests.post(arena_url, data={"key":userkey}) timer = time.time() data = json.loads(r.text) if debug or show_decision: print('viewUrl:', data['viewUrl']) print(' :', data['game']['board']['size']) # while True: if debug: print('Turn', data['game']['turn']) #     direction = random.choice(['North', 'South', 'East', 'West', 'Stay']) if show_decision or debug: print(' ',str(data['game']['turn'])+':', direction) #    ,   ,  . if debug: print(':',time.time()-timer) r = requests.post(data['playUrl'], data={'key': userkey, 'dir': direction}) timer = time.time() if r.status_code != 200: print('Request code :', r.status_code) print('Reason:', r.reason) break data = json.loads(r.text) if data['game']['finished']: print('Game finished.') break 

Es wird jedoch empfohlen, Standardentwicklungen zu verwenden, deren Links auf der offiziellen Website von Vindinium zu finden sind.


Extra 1: Ich möchte wirklich etwas über die Entwicklung der künstlichen Intelligenz auf der Basis von Vindinium von anderen Leuten lesen, denn auf diese Weise können Sie die Vielschichtigkeit der Lösung dieses Problems verstehen. Um die Kampfzusammenfassung im JSON-Format zu erhalten (dies kann zum Debuggen von Kämpfen nützlich sein), müssen Sie den Link zum Kampf der Form http://vindinium.org/fd96vc2z in den Link des Formulars http://vindinium.org/events/fd96vc2z konvertieren . Aber ich rate nicht, den Spielserver zu quälen und zu versuchen, Hunderte von Kämpfen von Topspielern zu bekommen. Verwenden Sie den obigen Link.


Extra 2: Wenn jemand versuchen möchte, seine Betriebszeit in Vindinium in die Grenzen von NanoPi Neo2 oder Orange Pi Zero zu bringen, kann ich die Möglichkeit bieten, mit diesen Einplatinencomputern zu arbeiten.


Link zu Vindinium
→ Der Link zum Vindinium-Subreddit ist sehr nützlich. Dort können Sie meine Bewegungen in Vindinium verfolgen
Link zu meinem Github mit ein wenig Arbeit an Vindinium


Im nächsten Teil werden wir potenzielle Felder einrichten, mit potenziellen Karten arbeiten, Bedingungen schreiben und all dies der modernen Realität aufzwingen.

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


All Articles