Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Ich bin auf ein interessantes Material ĂŒber kĂŒnstliche Intelligenz in Spielen gestoßen. Es erklĂ€rt grundlegende Dinge ĂŒber KI anhand einfacher Beispiele und enthĂ€lt viele nĂŒtzliche Werkzeuge und Methoden fĂŒr die bequeme Entwicklung und Gestaltung. Wo, wie und wann man sie einsetzen kann, wird ebenfalls behandelt.

Die meisten Beispiele sind in Pseudocode verfasst, daher sind keine tiefen Programmierkenntnisse erforderlich. Unter dem Beitrag sind 35 Seiten Text mit Bildern und GIFs, also bereitet euch vor.

UPD. Entschuldigung, aber ich habe bereits meine eigene Übersetzung dieses Artikels auf Habr gemacht. PatientZero. Man kann seine Version lesen hier, aber aus irgendeinem Grund ist der Artikel an mir vorbeigegangen (ich habe die Suche benutzt, aber etwas lief schief). Da ich in einem Blog schreibe, der sich mit Game Development beschĂ€ftigt, habe ich beschlossen, meine Übersetzung fĂŒr die Abonnenten zu hinterlassen (einige Punkte habe ich anders formuliert, andere wurden absichtlich auf Anraten der Entwickler weggelassen).

Was ist KI?

Spiel-KI konzentriert sich darauf, welche Aktionen ein Objekt basierend auf den Bedingungen, in denen es sich befindet, ausfĂŒhren sollte. Dies wird normalerweise als Steuerung „intelligenter Agenten“ bezeichnet, wobei der Agent eine Spielfigur, ein Fahrzeug, ein Bot oder manchmal etwas Abstrakteres ist: eine ganze Gruppe von EntitĂ€ten oder sogar eine Zivilisation. In jedem Fall handelt es sich um etwas, das seine Umgebung wahrnehmen, Entscheidungen darauf basierend treffen und entsprechend handeln muss. Dies wird als Zyklus von Sense/Think/Act (Wahrnehmen/Denken/Handeln) bezeichnet:

  • Sense: Der Agent findet oder erhĂ€lt Informationen ĂŒber Dinge in seiner Umgebung, die sein Verhalten beeinflussen könnten (drohende Gefahren in der NĂ€he, Sammelobjekte, interessante Orte zur Erkundung).
  • Think: Der Agent entscheidet, wie er reagieren soll (prĂŒft, ob es sicher genug ist, Objekte zu sammeln, oder ob er zuerst kĂ€mpfen/sich verstecken sollte).
  • Act: Der Agent fĂŒhrt Aktionen aus, um die vorherige Entscheidung umzusetzen (beginnt, sich auf den Gegner oder das Objekt zuzubewegen).
  • 
die Situation hat sich jetzt aufgrund der Aktionen der Charaktere verĂ€ndert, daher wird der Zyklus mit neuen Daten wiederholt.

KI konzentriert sich in der Regel auf den Sinn-Teil des Zyklus. Autonome Fahrzeuge machen zum Beispiel Bilder der Straße, kombinieren sie mit Radar- und LiDAR-Daten und interpretieren diese. Normalerweise ĂŒbernimmt das maschinelles Lernen, das Eingabedaten verarbeitet und ihnen Bedeutung verleiht, indem es semantische Informationen wie „Da ist ein weiteres Auto 20 Yards vor Ihnen“ extrahiert. Dies sind sogenannte Klassifikationsprobleme.

Spiele benötigen kein komplexes System zur Informationsgewinnung, da der Großteil der Daten bereits ein integraler Bestandteil ist. Es ist nicht notwendig, Algorithmen zur Bildverarbeitung einzusetzen, um festzustellen, ob ein Gegner vor einem steht — das Spiel weiß bereits Bescheid und ĂŒbermittelt die Informationen direkt im Entscheidungsprozess. Daher ist der Sinn-Teil des Zyklus oft viel einfacher als Denken und Handeln.

EinschrÀnkungen der Spiel-KI

Die KI hat eine Reihe von EinschrĂ€nkungen, die beachtet werden mĂŒssen:

  • Die KI muss nicht im Voraus trainiert werden, wie es bei einem Machine-Learning-Algorithmus der Fall ist. Es ist sinnlos, wĂ€hrend der Entwicklung ein neuronales Netzwerk zu schreiben, um Dutzende von Tausenden von Spielern zu beobachten und den besten Spielansatz gegen sie zu erlernen. Warum? Weil das Spiel nicht veröffentlicht ist und es keine Spieler gibt.
  • Das Spiel soll unterhalten und herausfordern, deshalb sollten die Agenten nicht den besten Ansatz gegen Menschen finden.
  • Die Agenten mĂŒssen realistisch wirken, damit die Spieler das GefĂŒhl haben, gegen echte Menschen zu spielen. Das Programm AlphaGo hat den Menschen ĂŒbertroffen, aber die gewĂ€hlten ZĂŒge waren fernab des traditionellen VerstĂ€ndnisses des Spiels. Wenn ein Spiel einen menschlichen Gegner imitiert, sollte es dieses GefĂŒhl nicht haben. Der Algorithmus muss angepasst werden, damit er plausible Entscheidungen trifft und nicht perfekte.
  • Die KI muss in Echtzeit arbeiten. Das bedeutet, dass der Algorithmus die CPU nicht ĂŒber lĂ€ngere ZeitrĂ€ume monopolartig fĂŒr Entscheidungsfindungen nutzen kann. Selbst 10 Millisekunden dafĂŒr sind zu lang, da den meisten Spielen ausreichend 16 bis 33 Millisekunden zur VerfĂŒgung stehen, um die gesamte Verarbeitung durchzufĂŒhren und zum nĂ€chsten Grafikframe ĂŒberzugehen.
  • Ideal wĂ€re es, wenn zumindest ein Teil des Systems datengetrieben gesteuert wird, damit auch „Nicht-Coder“ Änderungen vornehmen können und Anpassungen schneller erfolgen.

Lassen Sie uns die KI-AnsÀtze betrachten, die den gesamten Zyklus Sinn/Denk/Handeln abdecken.

Grundlegende Entscheidungen treffen

Lass uns mit einem einfachen Spiel beginnen – Pong. Ziel: Bewege das Paddle so, dass der Ball davon abprallt und nicht daran vorbeifliegt. Es ist wie Tennis, bei dem du verlierst, wenn du den Ball nicht zurĂŒckspielst. Hier hat die KI eine relativ einfache Aufgabe – zu entscheiden, in welche Richtung sie das Paddle bewegen soll.

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Bedingte Operatoren

FĂŒr die KI in Pong gibt es eine naheliegende Lösung – immer versuchen, das Paddle unter dem Ball zu positionieren.

Ein einfacher Algorithmus dafĂŒr, in Pseudocode geschrieben:

fĂŒr jedes Frame/Update, wĂ€hrend das Spiel lĂ€uft:
wenn der Ball links vom Paddle ist:
bewege das Paddle nach links
sonst, wenn der Ball rechts vom Paddle ist:
bewege das Paddle nach rechts

Wenn das Paddle sich mit der Geschwindigkeit des Balls bewegt, ist das der ideale Algorithmus fĂŒr die KI in Pong. Es gibt keinen Grund, es komplizierter zu machen, wenn die Daten und möglichen Aktionen fĂŒr den Agenten nicht viele sind.

Dieser Ansatz ist so einfach, dass der gesamte Zyklus Sense/Think/Act kaum wahrnehmbar ist. Aber er ist vorhanden:

  • Der Teil Sense befindet sich in den beiden if-Operatoren. Das Spiel weiß, wo der Ball ist und wo das Paddle ist, also fragt die KI danach.
  • Der Teil Think wird ebenfalls durch zwei if-Operatoren dargestellt. Sie verkörpern zwei Entscheidungen, die in diesem Fall sich gegenseitig ausschließen. Infolge dessen wird eine von drei Aktionen gewĂ€hlt – das Paddle nach links bewegen, nach rechts bewegen oder nichts tun, wenn es bereits richtig positioniert ist.
  • Der Teil Act befindet sich in den Operatoren Move Paddle Left und Move Paddle Right. Je nach Spieldesign können sie das Paddle sofort oder mit einer bestimmten Geschwindigkeit bewegen.

Solche AnsĂ€tze werden reaktiv genannt – es gibt eine einfache Regelset (in diesem Fall if-Operatoren im Code), die auf den aktuellen Zustand der Welt reagieren und handeln.

Entscheidungsbaum

Das Beispiel mit dem Spiel Pong entspricht tatsĂ€chlich dem formalen Konzept der KI, das Entscheidungsbaum genannt wird. Der Algorithmus durchlĂ€uft ihn, um zu einem „Blatt“ zu gelangen – eine Entscheidung darĂŒber, welche Aktion zu ergreifen ist.

Lass uns ein Flussdiagramm des Entscheidungsbaums fĂŒr unseren Paddle-Algorithmus erstellen:

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Jeder Teil des Baumes wird als Node (Knoten) bezeichnet – die KI verwendet die Graphentheorie zur Beschreibung solcher Strukturen. Es gibt zwei Arten von Knoten:

  • Entscheidungsknoten: eine Wahl zwischen zwei Alternativen basierend auf der ÜberprĂŒfung einer Bedingung, wobei jede Alternative als eigener Knoten dargestellt wird.
  • Endknoten: eine auszufĂŒhrende Aktion, die die endgĂŒltige Entscheidung darstellt.

Der Algorithmus beginnt mit dem ersten Knoten (dem „Wurzel“-Knoten des Baums). Er trifft entweder eine Entscheidung, zu welchem Kindknoten er wechseln soll, oder fĂŒhrt eine im Knoten gespeicherte Aktion aus und beendet sich.

Was ist also der Vorteil, wenn der Entscheidungsbaum die gleiche Funktion wie die if-Anweisungen im vorherigen Abschnitt erfĂŒllt? Hier gibt es ein allgemeines System, bei dem jede Entscheidung nur eine Bedingung und zwei mögliche Ergebnisse hat. Dies ermöglicht es dem Entwickler, KI aus Daten zu erstellen, die Entscheidungen im Baum reprĂ€sentieren, ohne hart kodiert zu werden. Stellen wir es in Tabellenform dar:

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Auf der Code-Seite erhalten Sie ein System zum Lesen von Zeilen. Erstellen Sie einen Knoten fĂŒr jede von ihnen, verbinden Sie die Entscheidungslogik basierend auf der zweiten Spalte und die Kindknoten basierend auf der dritten und vierten Spalte. Sie mĂŒssen weiterhin die Bedingungen und Aktionen programmieren, aber jetzt wird die Struktur des Spiels komplexer. Sie fĂŒgen zusĂ€tzliche Entscheidungen und Aktionen hinzu und konfigurieren dann die gesamte KI, indem Sie einfach die Textdatei mit der Baumdefinition bearbeiten. Übergeben Sie die Datei dann an den Spieldesigner, der das Verhalten Ă€ndern kann, ohne das Spiel neu zu kompilieren oder den Code zu Ă€ndern.

EntscheidungsbĂ€ume sind Ă€ußerst nĂŒtzlich, wenn sie automatisch auf der Grundlage eines großen Beispielsets erstellt werden (z. B. unter Verwendung des ID3-Algorithmus). Dadurch werden sie zu einem effizienten und leistungsstarken Werkzeug zur Klassifizierung von Situationen basierend auf erhaltenen Daten. Dennoch gehen wir ĂŒber ein einfaches System hinaus, das von Agenten zur Auswahl von Aktionen verwendet wird.

Szenarien

Wir haben das System des Entscheidungsbaums behandelt, das zuvor definierte Bedingungen und Aktionen verwendete. Der Mensch, der die KI entwirft, kann den Baum so organisieren, wie er möchte, muss jedoch weiterhin auf den Programmierer angewiesen sein, der alles programmiert hat. Was wÀre, wenn wir dem Designer Werkzeuge an die Hand geben könnten, um seine eigenen Bedingungen oder Aktionen zu erstellen?

Damit der Programmierer keinen Code fĂŒr die Bedingungen Is Ball Left Of Paddle und Is Ball Right Of Paddle schreiben muss, kann er ein System erstellen, in dem der Designer die Bedingungen zur ÜberprĂŒfung dieser Werte aufzeichnet. Dann könnte die Datenstruktur des Entscheidungsbaums folgendermaßen aussehen:

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Im Grunde genommen ist es dasselbe wie in der ersten Tabelle, aber die Lösungen haben ihren eigenen Code, der dem bedingten Teil eines if-Operators Ă€hnelt. Im Code wĂŒrde dies in der zweiten Spalte fĂŒr Entscheidungsneigungen abgerufen werden, aber anstelle nach einer bestimmten Bedingung fĂŒr die AusfĂŒhrung (Ist der Ball links vom Paddle?) zu suchen, bewertet es den Ausdruck und gibt entsprechend true oder false zurĂŒck. Dies geschieht mit der Skriptsprache Lua oder Angelscript. Mit diesen kann der Entwickler Objekte in seinem Spiel (Ball und Paddle) ĂŒbernehmen und Variablen erstellen, die im Skript verfĂŒgbar sind (ball.position). DarĂŒber hinaus ist die Skriptsprache einfacher als C++. Sie benötigt keinen vollstĂ€ndigen Kompilierungsprozess, was sie ideal fĂŒr schnelle Anpassungen der Spiel-Logik macht und es «Nicht-Entwicklern» ermöglicht, selbst die gewĂŒnschten Funktionen zu erstellen.

Im obigen Beispiel wird die Skriptsprache nur zur Bewertung des bedingten Ausdrucks verwendet, kann jedoch auch fĂŒr Aktionen genutzt werden. Zum Beispiel könnten die Daten Move Paddle Right zu einer Skriptanweisung werden (ball.position.x += 10). So kann auch die Aktion im Skript definiert werden, ohne dass das Programmieren von Move Paddle Right notwendig ist.

Man könnte noch weiter gehen und den Entscheidungsbaum vollstÀndig in der Skriptsprache schreiben. Das wÀre Code in Form von fest programmierten (hardcoded) Bedingungsanweisungen, die jedoch in externen Skriptdateien gespeichert sind, d.h. sie können geÀndert werden, ohne das gesamte Programm neu zu kompilieren. Oftmals kann die Skriptdatei wÀhrend des Spiels verÀndert werden, um verschiedene KI-Reaktionen schnell zu testen.

Reaktion auf Ereignisse

Die obigen Beispiele passen perfekt zu Pong. Sie durchlaufen kontinuierlich den Zyklus Sense/Think/Act und handeln basierend auf dem letzten Zustand der Welt. In komplexeren Spielen muss jedoch auf einzelne Ereignisse reagiert werden, nicht alles auf einmal bewertet werden. In diesem Fall ist Pong kein passendes Beispiel mehr. WĂ€hlen wir ein anderes.

Stellen Sie sich einen Shooter vor, bei dem die Feinde unbeweglich sind, bis sie den Spieler entdecken, woraufhin sie je nach ihrer «Spezialisierung» handeln: Manche werden versuchen, direkt anzugreifen, andere werden aus der Distanz angreifen. Das ist immer noch ein grundlegendes Reaktionssystem — «Wenn der Spieler gesehen wird, dann tu etwas» — aber es kann logisch in das Ereignis Player Seen (Spieler gesehen) und die Reaktion (WĂ€hlen Sie eine Antwort und fĂŒhren Sie sie aus) unterteilt werden.

Das bringt uns zu dem Zyklus Sense/Think/Act. Wir können den Sense-Teil programmieren, der in jedem Frame ĂŒberprĂŒft, ob die KI den Spieler sieht. Wenn nicht, passiert nichts, aber wenn sie es sieht, wird das Ereignis 'Spieler gesehen' ausgelöst. Der Code hat einen separaten Abschnitt, in dem steht: "Wenn das Ereignis 'Spieler gesehen' eintritt, mache ", wobei die Aktion ist, die Sie benötigen, um auf die Teile Think und Act zuzugreifen. So stellen Sie die Reaktionen auf das Ereignis 'Spieler gesehen' ein: fĂŒr einen 'rushing' Charakter - ChargeAndAttack, und fĂŒr einen Sniper - HideAndSnipe. Diese Verbindungen können in einer Datendatei erstellt werden, um eine schnelle Bearbeitung zu ermöglichen, ohne das Programm neu zu kompilieren. Hier kann auch eine Skriptsprache verwendet werden.

Komplexe Entscheidungen treffen

Obwohl einfache Reaktionssysteme sehr effektiv sind, gibt es viele Situationen, in denen sie nicht ausreichen. Manchmal mĂŒssen unterschiedliche Entscheidungen getroffen werden, basierend darauf, was der Agent gerade tut, aber es ist schwierig, dies als Bedingung darzustellen. Manchmal gibt es zu viele Bedingungen, um sie effektiv in einem Entscheidungsbaum oder Skript darzustellen. Manchmal muss bewertet werden, wie sich die Situation Ă€ndern könnte, bevor eine Entscheidung ĂŒber den nĂ€chsten Schritt getroffen wird. FĂŒr diese Probleme sind komplexere AnsĂ€tze erforderlich.

Endlicher Automat

Ein Finite State Machine (FSM) ist eine Möglichkeit zu sagen, dass unser Agent sich derzeit in einem von mehreren möglichen ZustĂ€nden befindet und dass er von einem Zustand in einen anderen ĂŒbergehen kann. Es gibt eine bestimmte Anzahl solcher ZustĂ€nde - daher der Name. Ein gutes Beispiel aus dem Leben ist eine Ampel. An verschiedenen Orten gibt es unterschiedliche Lichtfolgen, aber das Prinzip ist dasselbe - jeder Zustand stellt etwas dar (Halt, Gehe usw.). Die Ampel befindet sich immer zu einem bestimmten Zeitpunkt in genau einem Zustand und wechselt basierend auf einfachen Regeln von einem zum anderen.

Mit NPCs in Spielen sieht es Àhnlich aus. Nehmen wir zum Beispiel einen WÀchter mit diesen ZustÀnden:

  • Patrouillierend (Patrolling).
  • Angreifend (Attacking).
  • FlĂŒchtend (Fleeing).

Und mit diesen Bedingungen fĂŒr den Wechsel seines Zustands:

  • Wenn der WĂ€chter einen Gegner sieht, greift er an.
  • Wenn der WĂ€chter angreift, aber den Gegner nicht mehr sieht, kehrt er zur Patrouille zurĂŒck.
  • Wenn der WĂ€chter angreift, aber schwer verwundet ist, flieht er.

Man kann auch if-Anweisungen mit dem Status des WĂ€chters und verschiedene ÜberprĂŒfungen schreiben: Ist ein Feind in der NĂ€he? Welches Gesundheitsniveau hat das NPC usw.? FĂŒgen wir ein paar weitere ZustĂ€nde hinzu:

  • InaktivitĂ€t (Idling) – zwischen den Patrouillen.
  • Suche (Searching) – wenn ein gesichteter Feind sich versteckt hat.
  • Hilfe anfordern (Finding Help) – wenn ein Feind gesehen wird, aber zu stark ist, um alleine gegen ihn zu kĂ€mpfen.

Die Wahl fĂŒr jeden von ihnen ist eingeschrĂ€nkt – zum Beispiel wird der WĂ€chter nicht nach einem versteckten Feind suchen, wenn er wenig Gesundheit hat.

Letztlich kann eine riesige Liste von „wenn“ <x Đž y, ĐœĐŸ ĐœĐ” z>, dann <p>zu umfangreich werden, daher sollten wir eine Methode formal definieren, die es uns ermöglicht, die Zustände und die Übergänge zwischen den Zuständen im Kopf zu behalten. Dazu berücksichtigen wir alle Zustände und notieren unter jedem Zustand eine Liste aller Übergänge zu anderen Zuständen, einschließlich der erforderlichen Bedingungen.

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Dies ist eine ZustandsĂŒbergangstabelle – eine umfassende Methode zur Darstellung von FSM. Wir zeichnen ein Diagramm und erhalten einen vollstĂ€ndigen Überblick darĂŒber, wie sich das Verhalten von NPCs verĂ€ndert.

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Das Diagramm spiegelt das Wesen der Entscheidungsfindung fĂŒr diesen Agenten basierend auf der aktuellen Situation wider. Jede Pfeil zeigt einen Übergang zwischen den ZustĂ€nden, wenn die Bedingung daneben wahr ist.

Bei jedem Update ĂŒberprĂŒfen wir den aktuellen Zustand des Agenten, durchsehen die Liste der ÜbergĂ€nge, und wenn die Bedingungen fĂŒr den Übergang erfĂŒllt sind, nimmt er einen neuen Zustand an. Zum Beispiel wird bei jedem Frame ĂŒberprĂŒft, ob der 10-Sekunden-Timer abgelaufen ist, und wenn ja, wechselt der WĂ€chter vom Zustand Idling in Patrolling. Ebenso ĂŒberprĂŒft der Zustand Attacking die Gesundheit des Agenten – wenn sie niedrig ist, wechselt er in den Zustand Fleeing.

Das betrifft die Verarbeitung von ÜbergĂ€ngen zwischen ZustĂ€nden, aber was ist mit dem Verhalten, das mit den ZustĂ€nden selbst verbunden ist? Wenn es um die Implementierung des tatsĂ€chlichen Verhaltens fĂŒr einen bestimmten Zustand geht, gibt es normalerweise zwei Arten von „Hooks“, bei denen wir Aktionen der FSM zuweisen:

  • Aktionen, die wir regelmĂ€ĂŸig fĂŒr den aktuellen Zustand ausfĂŒhren.
  • Aktionen, die wir bei einem Übergang von einem Zustand in einen anderen unternehmen.

Beispiele fĂŒr den ersten Typ. Der Zustand Patrolling wird jeden Frame den Agenten entlang des Patrouillenwegs bewegen. Der Zustand Attacking wird jeden Frame versuchen, einen Angriff zu beginnen oder in einen Zustand ĂŒberzugehen, wenn dies möglich ist.

FĂŒr den zweiten Typ betrachten wir den Übergang: „Wenn der Feind sichtbar ist und der Feind zu stark ist, dann wechsle in den Zustand Finding Help. Der Agent muss wĂ€hlen, wo er Hilfe suchen möchte, und diese Information speichern, damit der Zustand Finding Help weiß, wohin er sich wenden kann. Sobald Hilfe gefunden ist, wechselt der Agent zurĂŒck in den Zustand Attacking. In diesem Moment möchte er seinen VerbĂŒndeten ĂŒber die Bedrohung informieren, weshalb die Aktion NotifyFriendOfThreat auftreten kann.

Und erneut können wir dieses System durch die Linse des Zyklus Sense / Think / Act betrachten. Sense wird in den Daten verkörpert, die von der Übergangslogik verwendet werden. Think sind die ÜbergĂ€nge, die in jedem Zustand verfĂŒgbar sind. Und Act erfolgt durch die Aktionen, die periodisch innerhalb eines Zustands oder bei ÜbergĂ€ngen zwischen ZustĂ€nden ausgefĂŒhrt werden.

Manchmal kann die kontinuierliche Abfrage von Übergangsbedingungen kostspielig sein. Wenn jeder Agent zum Beispiel in jedem Frame komplexe Berechnungen durchfĂŒhren muss, um zu bestimmen, ob er Feinde sieht und zu erkennen, ob er von Patrolling zu Attacking wechseln kann – das kostet viel Rechenzeit.

Wichtige VerĂ€nderungen des Weltzustands können als Ereignisse betrachtet werden, die verarbeitet werden, sobald sie auftreten. Anstatt dass die FSM in jedem Frame die Übergangsbedingung „Kann mein Agent den Spieler sehen?“ prĂŒft, könnte man ein separates System einrichten, das die PrĂŒfungen seltener durchfĂŒhrt (zum Beispiel 5 Mal pro Sekunde). Das Ergebnis könnte Player Seen sein, wenn die PrĂŒfung bestanden wird.

Dies wird an die FSM ĂŒbergeben, die jetzt in den Zustand Player Seen event received ĂŒbergehen und entsprechend reagieren muss. Das endgĂŒltige Verhalten bleibt gleich, abgesehen von einer nahezu unmerklichen Verzögerung bei der Antwort. Die Leistung hat sich jedoch verbessert, da ein Teil des Sense in einen separaten Teil des Programms ausgelagert wurde.

Hierarchische endliche Zustandsmaschine

Es ist jedoch nicht immer bequem, mit großen FSM zu arbeiten. Wenn wir den Angriffsstatus erweitern möchten, indem wir ihn durch separate MeleeAttacking (Nahkampf) und RangedAttacking (Fernkampf) ersetzen, mĂŒssen wir die ÜbergĂ€nge aus allen anderen ZustĂ€nden, die in den Zustand Attacking fĂŒhren (aktuelle und zukĂŒnftige), Ă€ndern.

Sie haben sicherlich bemerkt, dass in unserem Beispiel viele redundante ÜbergĂ€nge vorkommen. Die meisten ÜbergĂ€nge im Zustand Idling sind identisch mit den ÜbergĂ€ngen im Zustand Patrolling. Es wĂ€re besser, nicht zu wiederholen, insbesondere wenn wir mehr Ă€hnliche ZustĂ€nde hinzufĂŒgen. Es macht Sinn, Idling und Patrolling unter einem gemeinsamen Etikett „nicht kĂ€mpferisch“ zu gruppieren, wobei es nur einen gemeinsamen Satz von ÜbergĂ€ngen zu kĂ€mpferischen ZustĂ€nden gibt. Wenn wir dieses Etikett als Zustand betrachten, werden Idling und Patrolling zu UnterzustĂ€nden. Ein Beispiel fĂŒr die Verwendung einer separaten Übergangstabelle fĂŒr den neuen nicht kĂ€mpferischen Unterzustand:

HauptzustÀnde:
Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Zustand außer Gefecht:
Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Und in Form eines Diagramms:

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Es ist dasselbe System, aber mit einem neuen nicht kĂ€mpferischen Zustand, der Idling und Patrolling umfasst. Mit jedem Zustand, der eine FSM mit UnterzustĂ€nden enthĂ€lt (und diese UnterzustĂ€nde ihrerseits eigene FSMs haben – so viele, wie Sie benötigen), erhalten wir eine Hierarchical Finite State Machine oder HFSM (hierarchische endliche Zustandsmaschine). Durch die Gruppierung des nicht kĂ€mpferischen Zustands haben wir eine Menge ĂŒberflĂŒssiger ÜbergĂ€nge eliminiert. Dasselbe können wir fĂŒr zukĂŒnftige ZustĂ€nde mit gemeinsamen ÜbergĂ€ngen tun. Wenn wir beispielsweise den Zustand Attacking in die ZustĂ€nde MeleeAttacking und MissileAttacking erweitern, werden sie zu UnterzustĂ€nden, die auf der Grundlage der Entfernung zum Feind und der VerfĂŒgbarkeit von Munition zwischen einander wechseln. Dadurch können komplexe Verhaltensmodelle und Unterverhaltensmodelle mit minimalen redundanten ÜbergĂ€ngen dargestellt werden.

Verhaltenbaum

Mit HFSM werden komplexe Verhaltenskombinationen auf einfache Weise erstellt. Es gibt jedoch eine kleine Schwierigkeit, da die Entscheidungsfindung in Form von Übergangsregeln eng mit dem aktuellen Zustand verbunden ist. In vielen Spielen ist das genau das, was benötigt wird. Eine sorgfĂ€ltige Nutzung der Zustandshierarchie kann jedoch die Anzahl der Wiederholungen bei ÜbergĂ€ngen verringern. Manchmal sind jedoch Regeln erforderlich, die unabhĂ€ngig vom aktuellen Zustand funktionieren oder die in fast allen ZustĂ€nden angewendet werden. Wenn beispielsweise die Gesundheit des Agenten auf 25 % gefallen ist, möchten Sie, dass er unabhĂ€ngig davon, ob er im Kampf war, untĂ€tig war oder sprach, weglĂ€uft – Sie mĂŒssen diese Bedingung in jeden Zustand einfĂŒgen. Wenn Ihr Designer spĂ€ter den Schwellenwert fĂŒr niedrige Gesundheit von 25 % auf 10 % Ă€ndern möchte, mĂŒssen Sie sich wieder damit beschĂ€ftigen.

Idealerweise benötigt man fĂŒr diese Situation ein System, in dem Entscheidungen darĂŒber, "in welchem Zustand man sich befinden soll", außerhalb der eigentlichen ZustĂ€nde liegen, sodass Änderungen nur an einem Ort vorgenommen werden und die Übergangsbedingungen nicht berĂŒhrt werden. Hier kommen VerhaltensbĂ€ume ins Spiel.

Es gibt mehrere Möglichkeiten zu implementieren, aber der Kern ist fĂŒr alle ungefĂ€hr gleich und Ă€hnelt einem Entscheidungsbaum: Der Algorithmus beginnt mit einem "Wurzel"-Knoten, und im Baum befinden sich Knoten, die entweder Entscheidungen oder Aktionen reprĂ€sentieren. Es gibt jedoch einige wichtige Unterschiede:

  • Jetzt geben die Knoten eines von drei Werten zurĂŒck: Succeeded (wenn die Aufgabe erfĂŒllt wurde), Failed (wenn sie nicht gestartet werden kann) oder Running (wenn sie noch lĂ€uft und kein endgĂŒltiges Ergebnis vorliegt).
  • Es gibt keine Entscheidungsknoten mehr, um zwischen zwei Alternativen zu wĂ€hlen. Stattdessen gibt es Decorator-Knoten mit einem einzigen Kindknoten. Wenn sie Succeed, fĂŒhren sie ihren einzigen Kindknoten aus.
  • Knoten, die Aktionen ausfĂŒhren, geben den Wert Running zurĂŒck, um die laufenden Aktionen darzustellen.

Dieser kleine Satz von Knoten kann kombiniert werden, um eine große Anzahl komplexer Verhaltensmodelle zu erstellen. Stellen wir uns das HFSM eines WĂ€chters aus dem vorherigen Beispiel in Form eines Verhaltensbaums vor:

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Mit dieser Struktur sollte es keinen expliziten Übergang von den ZustĂ€nden Idling/Patrolling zum Zustand Attacking oder zu anderen geben. Wenn der Feind sichtbar ist und die Gesundheit des Charakters niedrig, wird die AusfĂŒhrung am Knoten Fleeing angehalten, unabhĂ€ngig davon, welchen Knoten er zuvor ausgefĂŒhrt hat – Patrolling, Idling, Attacking oder einen anderen.

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

VerhaltensbĂ€ume sind komplex – es gibt viele Möglichkeiten, sie zu erstellen, und das richtige Zusammenspiel von Dekoratoren und zusammengesetzten Knoten zu finden, kann problematisch sein. Es gibt auch Fragen dazu, wie oft der Baum ĂŒberprĂŒft werden sollte – wollen wir ihn bei jedem Teil durchlaufen oder nur, wenn sich eine der Bedingungen Ă€ndert? Wie speichert man den Zustand, der sich auf die Knoten bezieht – wie wissen wir, wann wir 10 Sekunden im Zustand Idling waren oder wie wissen wir, welche Knoten zuletzt ausgefĂŒhrt wurden, um die Sequenz korrekt zu verarbeiten?

Deshalb gibt es zahlreiche Implementierungen. In einigen Systemen wurden die Decorator-Knoten durch eingebaute Dekoratoren ersetzt. Diese evaluieren den Baum erneut, wenn sich die Bedingungen des Dekorators Àndern, helfen beim AnhÀngen an Knoten und bieten zeitliche Aktualisierungen.

Utility-basiertes System

Einige Spiele verfĂŒgen ĂŒber zahlreiche verschiedene Mechaniken. Es ist wĂŒnschenswert, dass sie alle Vorteile einfacher und allgemeiner Übergangsregeln erhalten, es ist jedoch nicht unbedingt notwendig, diese in Form eines vollstĂ€ndigen Verhaltensbaums darzustellen. Anstatt eine klare Auswahl oder einen Baum möglicher Aktionen zu haben, ist es einfacher, alle Aktionen zu studieren und die am besten geeignete fĂŒr den aktuellen Moment auszuwĂ€hlen.

Ein utilitaristisches System hilft dabei genau. Es handelt sich um ein System, in dem der Agent viele Handlungen hat und selbst auswĂ€hlt, welche er basierend auf der relativen NĂŒtzlichkeit jedes einzelnen ausfĂŒhren möchte. Wo NĂŒtzlichkeit eine willkĂŒrliche Maßzahl dafĂŒr ist, wie wichtig oder wĂŒnschenswert es fĂŒr den Agenten ist, diese Aktion auszufĂŒhren.

Basierend auf dem aktuellen Zustand und der Umgebung kann der Agent die geschĂ€tzte NĂŒtzlichkeit einer Aktion ĂŒberprĂŒfen und jederzeit den am besten passenden anderen Zustand wĂ€hlen. Dies Ă€hnelt einem FSM, mit dem Unterschied, dass die ÜbergĂ€nge durch Bewertungen fĂŒr jeden potenziellen Zustand, einschließlich des aktuellen, bestimmt werden. Beachten Sie, dass wir die nĂŒtzlichste Aktion fĂŒr den Übergang wĂ€hlen (oder bleiben, wenn wir sie bereits ausgefĂŒhrt haben). Um mehr Vielfalt zu bieten, kann dies eine gewichtete, aber zufĂ€llige Auswahl aus einer kleinen Liste sein.

Das System ordnet willkĂŒrlich einen Wertebereich fĂŒr die NĂŒtzlichkeit zu – zum Beispiel von 0 (völlig unerwĂŒnscht) bis 100 (vollstĂ€ndig erwĂŒnscht). Jedes Handeln hat eine Reihe von Parametern, die sich auf die Berechnung dieses Wertes auswirken. Wenn wir zu unserem Beispiel mit dem Wachmann zurĂŒckkehren:

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

ÜbergĂ€nge zwischen Aktionen sind mehrdeutig – jeder Zustand kann auf einen beliebigen anderen folgen. Die PrioritĂ€ten der Handlungen basieren auf den zurĂŒckgegebenen NĂŒtzlichkeitswerten. Wenn der Feind sichtbar ist und dieser Feind stark ist, wĂ€hrend die Gesundheit des Charakters niedrig ist, werden sowohl Fleeing als auch FindingHelp hohe, von Null verschiedene Werte zurĂŒckgeben. Dabei wird FindingHelp immer höher bewertet. Ähnlich werden nicht-kĂ€mpferische Aktionen niemals mehr als 50 zurĂŒckgeben, weshalb sie immer unter den kĂ€mpferischen liegen. Dies muss bei der Erstellung von Handlungen und der Berechnung ihrer NĂŒtzlichkeit berĂŒcksichtigt werden.

In unserem Beispiel geben die Aktionen entweder einen festen konstanten Wert oder einen von zwei festen Werten zurĂŒck. Ein realistischeres System wĂŒrde die RĂŒckgabe einer Bewertung aus einem kontinuierlichen Wertebereich vorsehen. Zum Beispiel liefert die Aktion Fliehen höhere Nutzwerte, wenn die Gesundheit des Agenten niedrig ist, wĂ€hrend die Aktion Angreifen niedrigere Werte zurĂŒckgibt, wenn der Feind zu stark ist. Aus diesem Grund hat die Aktion Fliehen Vorrang vor Angreifen in jeder Situation, in der der Agent das GefĂŒhl hat, nicht genĂŒgend Gesundheit zu haben, um den Gegner zu besiegen. Dies erlaubt es, die PrioritĂ€ten der Aktionen basierend auf einer beliebigen Anzahl von Kriterien zu Ă€ndern, was diesen Ansatz flexibler und variabler macht als ein Verhaltensbaum oder FSM.

Jede Aktion hat viele Bedingungen zur Berechnung des Programms. Diese können in einer Skriptsprache oder in Form einer Reihe von mathematischen Formeln geschrieben werden. In Die Sims, das den Tagesablauf eines Charakters modelliert, wird eine zusĂ€tzliche Ebene der Berechnungen hinzugefĂŒgt – der Agent erhĂ€lt eine Reihe von „Motivationen“, die die Nutzwertbewertungen beeinflussen. Wenn der Charakter hungrig ist, wird er im Laufe der Zeit noch hungriger, und das Ergebnis der Nutzwertbewertung der Aktion Essen wird steigen, bis der Charakter diese ausfĂŒhrt, wodurch der Hunger gesenkt wird und der Wert fĂŒr Essen auf null zurĂŒckkehrt.

Die Idee, Handlungen auf der Grundlage eines Bewertungssystems auszuwĂ€hlen, ist ziemlich einfach, daher kann das nutzwertbasierte System als Teil der Entscheidungsprozesse der KI verwendet werden, anstatt sie vollstĂ€ndig zu ersetzen. Ein Entscheidungsbaum kann den Nutzwert von zwei Kindknoten abfragen und den höheren auswĂ€hlen. In Ă€hnlicher Weise kann ein Verhaltensbaum einen zusammengesetzten Knoten fĂŒr die Bewertung der Nutzwerte von Handlungen haben, um zu entscheiden, welches untergeordnete Element ausgefĂŒhrt werden soll.

Bewegung und Navigation

In den vorherigen Beispielen hatten wir eine Plattform, die wir nach links oder rechts bewegt haben, und einen WĂ€chter, der patrouillierte oder angriff. Aber wie genau behandeln wir die Bewegung des Agenten ĂŒber einen bestimmten Zeitraum? Wie legen wir die Geschwindigkeit fest, wie vermeiden wir Hindernisse und wie planen wir eine Route, wenn es schwieriger ist, das Ziel zu erreichen, als einfach geradeaus zu gehen? Lassen Sie uns das betrachten.

Verwaltung

In der Anfangsphase gehen wir davon aus, dass jeder Agent einen Geschwindigkeitswert hat, der beinhaltet, wie schnell er sich bewegt und in welche Richtung. Dies kann in Metern pro Sekunde, Kilometern pro Stunde, Pixel pro Sekunde usw. gemessen werden. Wenn wir uns an den Zyklus Sense/Think/Act erinnern, können wir uns vorstellen, dass der Teil Think die Geschwindigkeit auswĂ€hlt und der Teil Act diese Geschwindigkeit auf den Agenten anwendet. In Spielen gibt es normalerweise ein physikalisches System, das diese Aufgabe fĂŒr Sie ĂŒbernimmt, indem es den Geschwindigkeitswert jedes Objekts berĂŒcksichtigt und anpasst. Daher kann die KI mit der Aufgabe betraut werden, zu entscheiden, welche Geschwindigkeit der Agent haben sollte. Wenn bekannt ist, wo sich der Agent befinden soll, kann er in die richtige Richtung mit einer festgelegten Geschwindigkeit bewegt werden. Eine sehr triviale Gleichung:

desired_travel = ziel_position – agent_position

Stellen Sie sich eine 2D-Welt vor. Der Agent befindet sich an Punkt (-2,-2), das Ziel irgendwo nordöstlich an Punkt (30, 20), und der notwendige Weg fĂŒr den Agenten, um dort zu sein, ist (32, 22). Angenommen, diese Positionen werden in Metern gemessen – wenn wir die Geschwindigkeit des Agenten auf 5 Meter pro Sekunde ansetzen, dann skalieren wir unseren Bewegungsvektor und erhalten eine Geschwindigkeit von etwa (4,12, 2,83). Mit diesen Parametern wĂŒrde der Agent sein Ziel in fast 8 Sekunden erreichen.

Die Werte können jederzeit neu berechnet werden. Wenn der Agent auf halbem Weg zum Ziel war, wĂ€re die Bewegung die HĂ€lfte der LĂ€nge, aber da die maximale Geschwindigkeit des Agenten 5 m/s betrĂ€gt (das haben wir oben festgelegt), bleibt die Geschwindigkeit gleich. Das funktioniert auch fĂŒr sich bewegende Ziele, sodass der Agent kleine Anpassungen vornehmen kann, wĂ€hrend diese sich bewegen.

Aber wir möchten mehr VariabilitĂ€t – zum Beispiel die Geschwindigkeit langsam erhöhen, um einen Charakter zu simulieren, der sich aus einer stehenden Position in einen Lauf bewegt. Das Gleiche kann auch am Ende vor dem Anhalten gemacht werden. Diese Funktionen sind bekannt als Steering Behaviours, von denen jede spezifische Namen hat: Seek (Suchen), Flee (Fliehen), Arrival (Ankunft) usw. Die Idee ist, dass BeschleunigungskrĂ€fte auf die Geschwindigkeit des Agenten angewendet werden können, basierend auf dem Vergleich der Position des Agenten und der aktuellen Geschwindigkeit mit dem Ziel, um verschiedene Methoden zur Bewegung in Richtung des Ziels zu nutzen.

Jedes Verhalten hat ein etwas anderes Ziel. Seek und Arrival sind Methoden, um den Agenten zu einem Zielpunkt zu bewegen. Obstacle Avoidance (Hindernisvermeidung) und Separation (Trennung) korrigieren die Bewegung des Agenten, um Hindernisse auf dem Weg zum Ziel zu umgehen. Alignment (Ausrichtung) und Cohesion (Zusammenhalt) halten die Agenten wĂ€hrend der Bewegung zusammen. Eine beliebige Anzahl verschiedener Steering Behaviours kann summiert werden, um einen einzigen Bewegungsvektor unter BerĂŒcksichtigung aller Faktoren zu erhalten. Ein Agent verwendet die Verhaltensweisen Arrival, Separation und Obstacle Avoidance, um Abstand zu WĂ€nden und anderen Agenten zu halten. Dieser Ansatz funktioniert gut in offenen Locations ohne ĂŒberflĂŒssige Details.

In schwierigeren Bedingungen funktioniert das Addieren verschiedener Verhaltensweisen schlechter – zum Beispiel kann ein Agent an einer Wand stecken bleiben aufgrund eines Konflikts zwischen Arrival und Obstacle Avoidance. Daher mĂŒssen komplexere Optionen als nur das Addieren aller Werte in Betracht gezogen werden. Eine Möglichkeit ist, anstatt die Ergebnisse jedes Verhaltens zu addieren, die Bewegung in verschiedene Richtungen zu betrachten und die beste Option auszuwĂ€hlen.

In einer komplexen Umgebung mit Sackgassen und Entscheidungen ĂŒber die Richtung, in die man gehen soll, benötigen wir jedoch etwas noch Fortgeschrittenes.

Wegsuche

Steering Behaviours eignen sich hervorragend fĂŒr einfache Bewegungen in offenem GelĂ€nde (Fußballfeld oder Arena), wo es von A nach B in gerader Linie mit geringfĂŒgigen Abweichungen um Hindernisse geht. FĂŒr komplexe Routen benötigen wir Pathfinding, das eine Methode ist, die Welt zu erkunden und eine Route durch sie zu bestimmen.

Die einfachste Methode besteht darin, ein Raster ĂŒber jedes Quadrat neben dem Agenten zu legen und zu bewerten, in welchen er sich bewegen darf. Wenn eines davon das Ziel ist, folgen Sie ihm, indem Sie von jedem Quadrat zu dem vorhergehenden zurĂŒckverfolgen, bis Sie den Anfang erreichen. Das ist der Weg. Andernfalls wiederholen Sie den Vorgang mit den nĂ€chstgelegenen anderen Quadraten, bis Sie das Ziel finden oder alle Quadrate aufgebraucht sind (was bedeutet, dass kein möglicher Weg besteht). Dies wird formal als Breadth-First Search oder BFS (Breitensuche) bezeichnet. Bei jedem Schritt schaut es in alle Richtungen (deshalb

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

In der Folge erhalten Sie eine Liste von Quadraten, aus denen die benötigte Route besteht. Das ist der Pfad (von hier, pathfinding) - eine Liste der Orte, die der Agent besuchen wird, um zum Ziel zu gelangen.

Angesichts dessen, dass wir die Position jedes Quadrats in der Welt kennen, können wir Steering-Bewegungen verwenden, um dem Pfad zu folgen - von Knoten 1 zu Knoten 2, dann von Knoten 2 zu Knoten 3 und so weiter. Die einfachste Variante besteht darin, zum Zentrum des nÀchsten Quadrats zu steuern, aber noch besser wÀre es, an der Mitte der Kante zwischen dem aktuellen Quadrat und dem nÀchsten zu halten. Dadurch kann der Agent an scharfen Kurven die Ecken schneiden.

Der BFS-Algorithmus hat auch Nachteile - er untersucht genauso viele Quadrate in die "falsche" Richtung wie in die "richtige". Hier kommt ein komplexerer Algorithmus namens A* (A Stern) ins Spiel. Er funktioniert Ă€hnlich, aber anstatt blind die benachbarten Quadrate zu durchsuchen (dann die Nachbarn der Nachbarn, dann die Nachbarn der Nachbarn der Nachbarn und so weiter), sammelt er die Knoten in einer Liste und sortiert sie so, dass der nĂ€chste untersuchte Knoten immer der ist, der den kĂŒrzesten Weg fĂŒhrt. Die Knoten werden basierend auf einer Heuristik sortiert, die zwei Dinge berĂŒcksichtigt: die „Kosten“ des hypothetischen Pfades zum gewĂŒnschten Quadrat (einschließlich aller Bewegungs- und Reisekosten) und eine SchĂ€tzung, wie weit dieses Quadrat vom Ziel entfernt ist (was die Suche in die richtige Richtung lenkt).

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

In diesem Beispiel wird gezeigt, dass der Agent jeweils ein Quadrat erkundet und dabei immer das am vielversprechendsten erscheinende Nachbarquadrat auswĂ€hlt. Der resultierende Pfad ist derselbe wie bei BFS, aber es wurden weniger Quadrate betrachtet – was fĂŒr die Leistung des Spiels von großer Bedeutung ist.

Bewegung ohne Raster

Aber die meisten Spiele sind nicht im Raster angeordnet, und oft ist es nicht möglich, dies ohne Einbußen an der RealitĂ€tsnĂ€he zu tun. Es sind Kompromisse erforderlich. Wie groß sollten die Quadrate sein? Zu groß – und sie können enge Korridore oder Kurven nicht richtig darstellen, zu klein – es gibt zu viele Quadrate, die durchsucht werden mĂŒssen, was viel Zeit in Anspruch nehmen kann.

Das erste, was man verstehen sollte, ist, dass ein Raster uns einen Graphen verbundener Knoten liefert. Die Algorithmen A* und BFS arbeiten tatsĂ€chlich mit Graphen und kĂŒmmern sich ĂŒberhaupt nicht um unser Raster. Wir könnten Knoten an beliebigen Stellen der Spielwelt setzen: Solange eine Verbindung zwischen zwei verbundenen Knoten und auch zwischen dem Start- und dem Endpunkt sowie mindestens einem der Knoten besteht, funktioniert der Algorithmus genauso gut wie zuvor. Oft wird dies als Wegpunkt-System bezeichnet, da jeder Knoten eine signifikante Position in der Welt darstellt, die Teil beliebig vieler hypothetischer Wege sein kann.

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger
Beispiel 1: Ein Knoten in jedem Quadrat. Die Suche beginnt aus dem Knoten, in dem sich der Agent befindet, und endet im Knoten des gewĂŒnschten Quadrats.

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger
Beispiel 2: Ein kleinerer Satz von Knoten (Wegpunkten). Die Suche beginnt im Quadrat mit dem Agenten, verlĂ€uft ĂŒber die erforderliche Anzahl von Knoten und setzt sich dann bis zum Ziel fort.

Dies ist ein recht flexibles und leistungsfÀhiges System. Aber es ist Vorsicht geboten, wo und wie Wegpunkte platziert werden, sonst sehen die Agenten möglicherweise einfach den nÀchstgelegenen Punkt nicht und können ihren Weg nicht beginnen. Es wÀre einfacher, wenn wir Wegpunkte automatisch basierend auf der Geometrie der Welt platzieren könnten.

Hier kommt das Navigation Mesh oder Navmesh ins Spiel. Dies ist normalerweise ein 2D-Netzwerk von Dreiecken, das auf die Geometrie der Welt gelegt wird – ĂŒberall dort, wo es dem Agenten erlaubt ist zu gehen. Jedes der Dreiecke im Netz wird zu einem Knoten im Graphen und hat bis zu drei benachbarte Dreiecke, die zu benachbarten Knoten im Graphen werden.

Dieses Bild ist ein Beispiel aus der Unity-Engine – es hat die Geometrie der Welt analysiert und ein Navmesh erstellt (auf dem Screenshot in hellblau dargestellt). Jedes Polygon im Navmesh ist ein Bereich, auf dem ein Agent stehen oder von einem Polygon zum anderen bewegen kann. In diesem Beispiel sind die Polygone kleiner als die Etagen, auf denen sie sich befinden – dies wurde gemacht, um die GrĂ¶ĂŸe des Agents zu berĂŒcksichtigen, der ĂŒber seine nominelle Position hinausgehen kann.

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Wir können den Weg durch dieses Netz suchen, indem wir erneut den A*-Algorithmus verwenden. Dies wird uns einen nahezu perfekten Weg in der Welt bieten, der die gesamte Geometrie berĂŒcksichtigt und dabei keine ĂŒberflĂŒssigen Knoten und Wegpunkte benötigt.

Pathfinding ist ein zu umfangreiches Thema, um nur einen Abschnitt eines Artikels darĂŒber zu haben. Wenn Sie es detaillierter studieren möchten, finden Sie Hilfe auf der Webseite von Amit Patel.

Planung

Wir haben bei Pathfinding festgestellt, dass es manchmal nicht ausreicht, einfach eine Richtung zu wĂ€hlen und zu gehen – wir mĂŒssen einen Weg wĂ€hlen und mehrere Abzweigungen machen, um das gewĂŒnschte Ziel zu erreichen. Wir können diese Idee zusammenfassen: Das Erreichen eines Ziels ist nicht nur der nĂ€chste Schritt, sondern eine ganze Abfolge, bei der es manchmal erforderlich ist, einige Schritte vorausschauen, um herauszufinden, wie der erste Schritt aussehen sollte. Dies wird als Planung bezeichnet. Pathfinding kann als eine von mehreren ErgĂ€nzungen zur Planung angesehen werden. Aus der Sicht unseres Sense/Think/Act-Zyklus ist es der Teil, in dem das Denken mehrere Teile des Handelns fĂŒr die Zukunft plant.

Nehmen wir als Beispiel das Kartenspiel Magic: The Gathering. Wir ziehen zuerst mit diesem Kartensatz auf der Hand:

  • Sumpf – gibt 1 schwarze Mana (Landkarte).
  • Wald – gibt 1 grĂŒne Mana (Landkarte).
  • FlĂŒchtiger Zauberer – benötigt 1 blaue Mana zum Beschwören.
  • Elfen-Mystiker – benötigt 1 grĂŒne Mana zum Beschwören.

Die verbleibenden drei Karten ignorieren wir, um es einfacher zu machen. Nach den Regeln darf der Spieler 1 Landkarte pro Zug spielen, er kann diese Karte „tap“ (um Mana daraus zu ziehen), und anschließend die Zauber (einschließlich der Beschwörung von Kreaturen) entsprechend der verfĂŒgbaren Mana verwenden. In dieser Situation weiß der menschliche Spieler, dass er den Wald spielen, 1 grĂŒne Mana „tap“ und dann den Elfen-Mystiker beschwören muss. Aber wie kann der Spiel-IA das herausfinden?

Einfache Planung

Der triviale Ansatz besteht darin, jede Handlung der Reihe nach auszuprobieren, bis keine passenden mehr ĂŒbrig sind. Der KI sieht anhand der Karten, dass sie Swamp spielen kann. Und sie spielt es. Gibt es noch andere Handlungen in diesem Zug? Sie kann weder Elvish Mystic noch Fugitive Wizard beschwören, da fĂŒr deren Beschwörung jeweils grĂŒne und blaue Mana erforderlich sind, wĂ€hrend Swamp nur schwarze Mana erzeugt. Und sie kann bereits keinen Forest mehr spielen, weil sie Swamp bereits gespielt hat. So hat die spielende KI gemĂ€ĂŸ den Regeln gehandelt, aber schlecht. Dieses Vorgehen kann verbessert werden.

Die Planung kann eine Liste von Handlungen finden, die das Spiel in den gewĂŒnschten Zustand versetzen. So wie jede Quadrate auf dem Weg Nachbarn hatte (im Pathfinding), hat jede Handlung im Plan ebenfalls Nachbarn oder Nachfolger. Wir können diese Handlungen und die nĂ€chsten Handlungen suchen, bis wir den gewĂŒnschten Zustand erreichen.

In unserem Beispiel ist das gewĂŒnschte Ergebnis „ein Wesen beschwören, wenn dies möglich ist“. Zu Beginn des Zugs sehen wir nur zwei mögliche Handlungen, die den Regeln des Spiels entsprechen:

1. Swamp spielen (Ergebnis: Swamp im Spiel)
2. Forest spielen (Ergebnis: Forest im Spiel)

Jede ausgefĂŒhrte Handlung kann zu weiteren Handlungen fĂŒhren und andere schließen, wiederum abhĂ€ngig von den Regeln des Spiels. Stellen Sie sich vor, wir haben Swamp gespielt – dies entfernt Swamp als nĂ€chsten Schritt (wir haben es bereits gespielt), außerdem entfernt es Forest (da gemĂ€ĂŸ den Regeln in einem Zug nur eine LĂ€nderkarte gespielt werden kann). Danach fĂŒgt die KI als nĂ€chsten Schritt das Erhalten von 1 schwarzer Mana hinzu, da es keine anderen Optionen gibt. Wenn sie weitermachen und Swamp tappen wĂ€hlt, erhĂ€lt sie 1 Einheit schwarze Mana und kann damit nichts tun.

1. Swamp spielen (Ergebnis: Swamp im Spiel)
1.1 Swamp „tappt“ (Ergebnis: Swamp „getappt“, +1 Einheit schwarze Mana)
Keine verfĂŒgbaren Handlungen – ENDE
2. Forest spielen (Ergebnis: Forest im Spiel)

Die Liste der Handlungen ist kurz geworden, wir sind an einem toten Punkt angekommen. Wir wiederholen den Prozess fĂŒr die nĂ€chste Handlung. Wir spielen Forest, öffnen die Handlung „1 grĂŒne Mana erhalten“, die ihrerseits die dritte Handlung – das Beschwören von Elvish Mystic – eröffnet.

1. Swamp spielen (Ergebnis: Swamp im Spiel)
1.1 Swamp „tappt“ (Ergebnis: Swamp „getappt“, +1 Einheit schwarze Mana)
Keine verfĂŒgbaren Handlungen – ENDE
2. Forest spielen (Ergebnis: Forest im Spiel)
2.1 Forest „tappt“ (Ergebnis: Forest „getappt“, +1 Einheit grĂŒne Mana)
2.1.1 Elvish Mystic beschwören (Ergebnis: Elvish Mystic im Spiel, -1 Einheit grĂŒne Mana)
Keine verfĂŒgbaren Handlungen – ENDE

Schließlich haben wir alle möglichen Handlungen untersucht und einen Plan gefunden, der ein Wesen beschwört.

Dies ist ein sehr vereinfachtes Beispiel. Es ist ratsam, den bestmöglichen Plan zu wĂ€hlen und nicht einfach irgendetwas, das bestimmten Kriterien entspricht. Oft kann man potenzielle PlĂ€ne anhand des Endergebnisses oder des Gesamtnutzens ihrer AusfĂŒhrung bewerten. Man kann sich 1 Punkt fĂŒr das Spielen einer Landkarte und 3 Punkte fĂŒr das Beschwören eines Wesens gutschreiben. Das Spielen von Swamp wĂ€re ein Plan, der 1 Punkt einbringt. Und das Spielen von Forest → Tap the Forest → beschwören von Elvish Mystic – bringt sofort 4 Punkte.

So funktioniert das Planen in Magic: The Gathering, aber dasselbe Prinzip lĂ€sst sich auch auf andere Situationen anwenden. Zum Beispiel, einen Bauern zu bewegen, um Platz fĂŒr den Zug eines LĂ€ufers im Schach zu schaffen. Oder sich hinter einer Wand zu verstecken, um in XCOM sicher zu schießen. Im Grunde versteht ihr das Wesentliche.

Verbessertes Planen

Manchmal gibt es zu viele potenzielle Aktionen, um jede mögliche Option zu betrachten. ZurĂŒck zum Beispiel mit Magic: The Gathering: Angenommen, im Spiel hast du mehrere Landkarten und Kreaturen auf der Hand – die Anzahl möglicher Spielkombinationen kann in die Dutzende gehen. Es gibt mehrere LösungsansĂ€tze fĂŒr dieses Problem.

Der erste Ansatz ist das Backwards Chaining (RĂŒckwĂ€rtsverknĂŒpfung). Anstatt alle Kombinationen durchzugehen, ist es besser, mit dem Endergebnis zu beginnen und zu versuchen, einen direkten Pfad zu finden. Anstatt den Weg von der Wurzel eines Baumes zu einem bestimmten Blatt zu verfolgen, bewegen wir uns in umgekehrter Richtung – vom Blatt zur Wurzel. Diese Methode ist einfacher und schneller.

Wenn der Gegner 1 Lebenspunkt hat, kann man einen Plan finden, um „1 oder mehr Schadenspunkte zuzufĂŒgen“. Um dies zu erreichen, mĂŒssen einige Bedingungen erfĂŒllt sein:

1. Der Schaden kann durch einen Zauberspruch verursacht werden – dieser muss auf der Hand sein.
2. Um einen Zauberspruch zu wirken – braucht man Mana.
3. Um Mana zu erhalten – muss man eine Landkarte ausspielen.
4. Um eine Landkarte auszuspielen – muss man sie auf der Hand haben.

Eine andere Methode ist der Best-First Search (Besten-Erstsuche). Anstatt alle Wege zu durchforsten, wĂ€hlen wir den vielversprechendsten aus. Diese Methode liefert in der Regel den optimalen Plan ohne unnötige Suchkosten. A* ist eine Form des Besten-Erstsuchens – indem er vielversprechende Routen von Anfang an erforscht, kann er den besten Weg finden, ohne andere Optionen ĂŒberprĂŒfen zu mĂŒssen.

Eine interessante und zunehmend beliebte Variante der besten ersten Suche ist die Monte Carlo Tree Search. Anstatt zu erraten, welche PlĂ€ne besser sind als andere, wĂ€hlt der Algorithmus bei jedem Schritt zufĂ€llige Nachfolger, bis er das Ende erreicht (wenn der Plan zu einem Sieg oder einer Niederlage fĂŒhrt). Das endgĂŒltige Ergebnis wird dann verwendet, um die Bewertung des „Gewichts“ der vorherigen Optionen zu erhöhen oder zu senken. Durch mehrmaliges Wiederholen dieses Prozesses gibt der Algorithmus eine gute EinschĂ€tzung ab, welcher nĂ€chste Schritt besser ist, selbst wenn sich die Situation Ă€ndert (wenn der Gegner Maßnahmen ergreift, um den Spieler zu behindern).

In der ErzĂ€hlung ĂŒber Planung in Spielen kommt man nicht ohne Goal-Oriented Action Planning oder GOAP (zielorientierte Aktionsplanung) aus. Dies ist eine weit verbreitete und diskutierte Methode, aber abgesehen von einigen unterscheidenden Details handelt es sich im Wesentlichen um eine Methode des rĂŒckwĂ€rts gerichteten Denkens, die wir zuvor erwĂ€hnt haben. Wenn die Aufgabe lautet „den Spieler eliminieren“ und der Spieler sich hinter einer Deckung befindet, könnte der Plan so aussehen: zerstöre mit einer Granate → hole sie → wirf sie.

Normalerweise gibt es mehrere Ziele, jedes mit seiner eigenen PrioritĂ€t. Wenn das Ziel mit der höchsten PrioritĂ€t nicht erreicht werden kann (da keine Kombination von Aktionen einen Plan „den Spieler eliminieren“ erstellt, weil der Spieler nicht sichtbar ist), kehrt die KI zu den Zielen mit niedrigerer PrioritĂ€t zurĂŒck.

Training und Anpassung

Wir haben bereits erwĂ€hnt, dass KI in Spielen normalerweise kein maschinelles Lernen verwendet, da es nicht geeignet ist, um Agenten in Echtzeit zu steuern. Aber das bedeutet nicht, dass man aus diesem Bereich nichts lernen kann. Wir wĂŒnschen uns einen Gegner in einem Shooter, von dem man etwas lernen kann. Zum Beispiel ĂŒber die besten Positionen auf der Karte. Oder einen Gegner in einem Kampfspiel, der hĂ€ufig verwendete Kombinationen des Spielers blockieren wĂŒrde, was dazu anregt, andere zu verwenden. Maschinelles Lernen kann in solchen Situationen also sehr nĂŒtzlich sein.

Statistik und Wahrscheinlichkeiten

Bevor wir zu komplexen Beispielen ĂŒbergehen, lassen Sie uns ĂŒberlegen, wie weit wir gehen können, indem wir einige einfache Messungen vornehmen und diese zur Entscheidungsfindung nutzen. Zum Beispiel, die Echtzeit-Strategie – wie können wir feststellen, ob ein Spieler in den ersten Minuten des Spiels einen Angriff starten kann und welche Verteidigung wir dagegen aufbauen sollten? Wir können die bisherigen Erfahrungen des Spielers analysieren, um zu verstehen, wie seine zukĂŒnftige Reaktion aussehen könnte. ZunĂ€chst einmal haben wir keine solchen Ausgangsdaten, aber wir können sie sammeln – jedes Mal, wenn die KI gegen einen Menschen spielt, kann sie die Zeit des ersten Angriffs aufzeichnen. Nach mehreren Sitzungen erhalten wir den Durchschnittswert der Zeit, nach der der Spieler in der Zukunft angreifen wird.

Es gibt jedoch auch ein Problem mit Durchschnittswerten: Wenn ein Spieler 20 Mal „rushte“ und 20 Mal langsam spielte, dann werden die benötigten Werte irgendwo in der Mitte liegen, was uns nichts NĂŒtzliches bringt. Eine mögliche Lösung besteht darin, die Eingangsdaten zu begrenzen – wir können die letzten 20 Angriffe berĂŒcksichtigen.

Ein Ă€hnlicher Ansatz wird verwendet, um die Wahrscheinlichkeit bestimmter Aktionen abzuschĂ€tzen, wobei davon ausgegangen wird, dass die frĂŒheren Vorlieben des Spielers auch in Zukunft bestehen bleiben. Wenn ein Spieler uns fĂŒnf Mal mit FeuerbĂ€llen angreift, zwei Mal mit Blitz und ein Mal im Nahkampf, ist offensichtlich, dass er FeuerbĂ€lle bevorzugt. Wir extrapolieren und sehen die Wahrscheinlichkeit, verschiedene Waffen zu verwenden: Feuerball = 62,5 %, Blitz = 25 % und Nahkampf = 12,5 %. Unsere Spiel-KI muss sich auf den Schutz gegen Feuer vorbereiten.

Eine weitere interessante Methode ist die Verwendung des Naive Bayes Classifier, um große Mengen an Eingabedaten zu analysieren und die Situation zu klassifizieren, damit die KI entsprechend reagiert. Bayes-Klassifikatoren sind am bekanntesten fĂŒr ihren Einsatz in Spamfiltern fĂŒr E-Mails. Dort untersuchen sie Wörter, vergleichen sie mit ihren vorherigen Vorkommen (ob in Spam oder nicht) und ziehen SchlĂŒsse ĂŒber eingehende Nachrichten. Wir können dasselbe tun, sogar mit weniger Eingabedaten. Basierend auf allen nĂŒtzlichen Informationen, die die KI sieht (z. B. welche feindlichen Einheiten erstellt wurden, welche Zauber sie einsetzen oder welche Technologien sie erforschen), und dem endgĂŒltigen Ergebnis (Krieg oder Frieden, „rushen“ oder verteidigen usw.) – wĂ€hlen wir das angemessene Verhalten der KI aus.

Alle diese Lernmethoden sind ausreichend, aber es ist ratsam, sie auf Basis von Testergebnissen zu verwenden. KI wird lernen, sich an die verschiedenen Strategien anzupassen, die Ihre Playtester verwendet haben. Eine KI, die sich nach dem Release an den Spieler anpasst, kann zu vorhersehbar oder umgekehrt zu schwierig zu besiegen werden.

Anpassung basierend auf Werten

Angesichts des Inhalts unserer Spielwelt und der Regeln können wir die Menge der Werte Àndern, die die Entscheidungsfindung beeinflussen, anstatt nur die Eingabedaten zu verwenden. So machen wir das:

  • Lassen Sie die KI Daten ĂŒber den Zustand der Welt und wichtige Ereignisse wĂ€hrend des Spiels sammeln (wie oben angegeben).
  • Wir werden einige wichtige Werte (value) basierend auf diesen Daten Ă€ndern.
  • Wir setzen unsere Entscheidungen um, die auf der Verarbeitung oder Bewertung dieser Werte basieren.

Zum Beispiel hat der Agent mehrere RĂ€ume zur Auswahl auf der Karte eines Ego-Shooters. Jeder Raum hat seinen eigenen Wert, der bestimmt, wie wĂŒnschenswert er fĂŒr einen Besuch ist. Die KI wĂ€hlt zufĂ€llig, in welchen Raum sie gehen soll, basierend auf dem Wert. Der Agent merkt sich dann, in welchem Raum er getötet wurde, und reduziert dessen Wert (die Wahrscheinlichkeit, dass er zurĂŒckkommt). Analog fĂŒr die umgekehrte Situation – wenn der Agent viele Gegner vernichtet, steigt der Wert des Raums.

Markov-Modell

Was, wenn wir die gesammelten Daten zur Vorhersage verwenden? Wenn wir uns an jeden Raum erinnern, in dem wir den Spieler ĂŒber einen bestimmten Zeitraum gesehen haben, können wir vorhersagen, in welchen Raum der Spieler wechseln könnte. Indem wir die Bewegungen des Spielers durch die RĂ€ume (values) verfolgen und aufzeichnen, können wir diese vorhersagen.

Nehmen wir drei RĂ€ume: rot, grĂŒn und blau. Und die Beobachtungen, die wir wĂ€hrend der Betrachtung der Spielsitzung aufgezeichnet haben:

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Die Anzahl der Beobachtungen fĂŒr jeden Raum ist nahezu gleich – wo wir einen guten Platz fĂŒr einen Hinterhalt schaffen können, wissen wir immer noch nicht. Die Sammlung von Statistiken wird auch durch das Respawning der Spieler erschwert, die gleichmĂ€ĂŸig auf der gesamten Karte erscheinen. Aber die Daten ĂŒber den nĂ€chsten Raum, in den sie nach ihrem Erscheinen auf der Karte eintreten – sind bereits hilfreich.

Es ist offensichtlich, dass der grĂŒne Raum die Spieler ansprechend findet – die Mehrheit der Leute wandert von rot dorthin, wobei 50 % von ihnen dort verweilen. Der blaue Raum hingegen erfreut sich keiner Beliebtheit, dort gehen fast keine Leute hin, und wenn sie es tun, verweilen sie nicht.

Doch die Daten zeigen uns etwas Wichtigeres – wenn sich ein Spieler im blauen Raum aufhĂ€lt, wird der nĂ€chste Raum, in dem wir ihn wahrscheinlich sehen, der rote und nicht der grĂŒne sein. Trotz der Tatsache, dass der grĂŒne Raum beliebter ist als der rote, Ă€ndert sich die Situation, wenn der Spieler im blauen Raum ist. Der nĂ€chste Zustand (also der Raum, in den der Spieler wechselt) hĂ€ngt vom vorherigen Zustand (also dem Raum, in dem sich der Spieler derzeit befindet) ab. Aufgrund der AbhĂ€ngigkeitsanalysen werden wir genauere Prognosen machen, als wenn wir einfach die Beobachtungen unabhĂ€ngig voneinander zĂ€hlen wĂŒrden.

Die Vorhersage des zukĂŒnftigen Zustands basierend auf Daten des vergangenen Zustands wird als Markov-Modell bezeichnet, und solche Beispiele (mit RĂ€umen) werden Markov-Ketten genannt. Da diese Modelle die Wahrscheinlichkeit von Änderungen zwischen aufeinanderfolgenden ZustĂ€nden darstellen, werden sie visuell in Form eines FSM mit Wahrscheinlichkeiten um jeden Übergang dargestellt. FrĂŒher haben wir FSM verwendet, um den Verhaltenszustand darzustellen, in dem sich der Agent befand, aber dieses Konzept erstreckt sich auf jeden Zustand, unabhĂ€ngig davon, ob er mit dem Agenten in Verbindung steht oder nicht. In diesem Fall stellen die ZustĂ€nde den Raum dar, den der Agent besetzt:

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Dies ist eine einfache Möglichkeit, die relative Wahrscheinlichkeit von ZustandsÀnderungen darzustellen, die es der KI ermöglicht, das nÀchste Zustand zu prognostizieren. Man kann mehrere Schritte im Voraus vorhersagen.

Wenn sich der Spieler im grĂŒnen Raum befindet, besteht eine 50 %ige Chance, dass er beim nĂ€chsten Beobachtung dort bleibt. Aber wie hoch ist die Wahrscheinlichkeit, dass er auch danach noch dort ist? Es gibt nicht nur die Chance, dass der Spieler nach zwei Beobachtungen im grĂŒnen Raum geblieben ist, sondern auch die Möglichkeit, dass er weggegangen und zurĂŒckgekehrt ist. Hier ist eine neue Tabelle unter BerĂŒcksichtigung der neuen Daten:

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger

Hieraus ergibt sich, dass die Chance, den Spieler nach zwei Beobachtungen im grĂŒnen Raum zu sehen, bei 51 % liegt – 21 %, dass er aus dem roten Raum kommt, 5 %, dass der Spieler dazwischen den blauen Raum besucht hat, und 25 %, dass der Spieler den grĂŒnen Raum ĂŒberhaupt nicht verlassen hat.

Eine Tabelle ist ein einfaches visuelles Werkzeug – das Verfahren erfordert nur die Multiplikation von Wahrscheinlichkeiten in jedem Schritt. Das bedeutet, dass Sie weit in die Zukunft schauen können, mit einer Ausnahme: Wir nehmen an, dass die Chance, den Raum zu betreten, vollstĂ€ndig von dem aktuellen Raum abhĂ€ngt. Dies wird als Markowsches Eigentum (Markov Property) bezeichnet – der zukĂŒnftige Zustand hĂ€ngt nur vom aktuellen ab. Aber das ist nicht hundertprozentig genau. Spieler können Entscheidungen je nach anderen Faktoren Ă€ndern: Gesundheitszustand oder Anzahl der Munition. Da wir diese Werte nicht festhalten, werden unsere Prognosen weniger genau sein.

N-Gramme

Was ist mit dem Beispiel eines Kampfspiels und der Vorhersage von KombinationszĂŒgen des Spielers? Dasselbe! Statt eines einzelnen Zustands oder Ereignisses untersuchen wir ganze Sequenzen, aus denen der Kombinationsangriff besteht.

Eine Möglichkeit, dies zu tun, besteht darin, jede Eingabe (wie Kick, Punch oder Block) im Puffer zu speichern und den gesamten Puffer als ein Ereignis aufzuzeichnen. Der Spieler drĂŒckt also wiederholt Kick, Kick, Punch, um den SuperDeathFist-Angriff auszufĂŒhren. Das KI-System speichert alle Eingaben im Puffer und merkt sich die letzten drei, die in jedem Schritt verwendet werden.

Wie man eine Spiel-KI erstellt: ein Leitfaden fĂŒr Einsteiger
(Die Zeilen sind fett hervorgehoben, wenn der Spieler den SuperDeathFist-Angriff ausfĂŒhrt.)

Die KI wird alle Varianten sehen, bei denen der Spieler Kick gewÀhlt hat, gefolgt von einem weiteren Kick, und dann bemerken, dass die nÀchste Eingabe immer Punch ist. Dies ermöglicht es dem Agenten, den SuperDeathFist-Kombinationsangriff vorherzusagen und ihn zu blockieren, wenn möglich.

Diese Ereignisse werden als N-Gramme (N-grams) bezeichnet, wobei N die Anzahl der gespeicherten Elemente ist. Im vorherigen Beispiel handelte es sich um ein 3-Gramm (Trigramm), was bedeutet: Die ersten beiden EintrĂ€ge werden verwendet, um den dritten vorherzusagen. Entsprechend sagen in einem 5-Gramm die ersten vier EintrĂ€ge den fĂŒnften vor und so weiter.

Der Entwickler muss die GrĂ¶ĂŸe der N-Gramme sorgfĂ€ltig auswĂ€hlen. Eine kleinere Zahl von N benötigt weniger Speicher, speichert jedoch auch eine kĂŒrzere Geschichte. Zum Beispiel wird ein 2-Gramm (Bigramm) Kick, Kick oder Kick, Punch aufzeichnen, kann jedoch Kick, Kick, Punch nicht speichern, sodass die KI nicht auf den SuperDeathFist-Kombinationsangriff reagieren wird.

Andererseits benötigen große Zahlen mehr Speicher und es wird fĂŒr die KI schwieriger, zu lernen, da es viel mehr mögliche Varianten gibt. Wenn Sie drei mögliche Eingaben wie Kick, Punch oder Block hatten und wir ein 10-Gramm verwendet haben, ergeben sich etwa 60.000 verschiedene Varianten.

Das Bigram-Modell ist eine einfache Markow-Kette – jedes Paar „vorheriger Zustand / aktueller Zustand“ ist ein Bigramm, und Sie können den zweiten Zustand anhand des ersten vorhersagen. Trigramme und grĂ¶ĂŸere N-Gramme können ebenfalls als Markow-Ketten betrachtet werden, wobei alle Elemente (außer dem letzten im N-Gramm) zusammen den ersten Zustand bilden und das letzte Element den zweiten. Ein Beispiel aus dem Kampfspiel zeigt die Wahrscheinlichkeit des Übergangs vom Zustand Kick und Kick zu den ZustĂ€nden Kick und Punch. Wenn wir mehrere Aufzeichnungen der Eingangsvergangenheit als eine Einheit betrachten, verwandeln wir im Wesentlichen die Eingabesequenz in einen Teil des gesamten Zustands. Dies gibt uns die Markow-Eigenschaft, die es ermöglicht, Markow-Ketten zur Vorhersage der nĂ€chsten Eingabe zu verwenden und zu erraten, welcher Kombinationszug als nĂ€chstes kommt.

Fazit

Wir haben ĂŒber die gĂ€ngigsten Werkzeuge und AnsĂ€tze in der Entwicklung kĂŒnstlicher Intelligenz gesprochen. Außerdem haben wir die Situationen untersucht, in denen sie angewendet werden sollten und wo sie besonders nĂŒtzlich sind.

Das sollte ausreichen, um die Grundlagen im Gaming-AI zu verstehen. Aber natĂŒrlich ist das bei weitem nicht alles. Zu den weniger verbreiteten, aber nicht weniger effektiven Methoden gehören:

  • Optimierungsalgorithmen, einschließlich Hill Climbing, Gradientenabstieg und genetische Algorithmen
  • Wettbewerbsalgorithmen fĂŒr Suche / Planung (Minimax und Alpha-Beta-Pruning)
  • Klassifikationsmethoden (Perzeptronen, neuronale Netze und Support Vector Machines)
  • Systeme zur Verarbeitung von Wahrnehmung und GedĂ€chtnis von Agenten
  • Architektonische AnsĂ€tze fĂŒr KI (hybride Systeme, Untergruppen von Architekturen und andere Möglichkeiten zur Überlappung von KI-Systemen)
  • Animationswerkzeuge (Planung und Koordination von Bewegungen)
  • Leistungsfaktoren (Detailgrad, Anytime-Algorithmen und Timeslicing)

Internetressourcen zum Thema:

1. Auf GameDev.net gibt es einen Bereich mit Artikeln und Tutorials zu KI, sowie Forum.
2. AiGameDev.com enthÀlt eine Vielzahl von PrÀsentationen und Artikeln zu einem breiten Spektrum im Bereich der Entwicklung von Gaming-AI.
3. Das GDC Vault beinhaltet Themen vom GDC AI Summit, von denen viele kostenlos verfĂŒgbar sind.
4. NĂŒtzliche Materialien finden Sie auch auf der Website AI Game Programmers Guild.
5. Tommy Thompson, KI-Forscher und Spieleentwickler, veröffentlicht Videos auf dem YouTube-Kanal AI and Games mit ErklÀrungen und Analysen von KI in kommerziellen Spielen.

BĂŒcher zu diesem Thema:

1. Die Buchreihe Game AI Pro besteht aus Sammlungen kurzer Artikel, die erklÀren, wie bestimmte Funktionen implementiert oder spezifische Probleme gelöst werden können.

Game AI Pro: Gesammelte Weisheit von Game AI-Experten
Game AI Pro 2: Gesammelte Weisheit von Game AI-Experten
Game AI Pro 3: Gesammelte Weisheit von Game AI-Experten

2. Die Reihe AI Game Programming Wisdom ist der VorgÀnger der Reihe Game AI Pro. Sie enthÀlt Àltere Methoden, aber fast alle sind auch heute noch relevant.

AI Game Programming Wisdom 1
AI Game Programming Wisdom 2
AI Game Programming Wisdom 3
AI Game Programming Wisdom 4

3. Artificial Intelligence: A Modern Approach — ist einer der Grundlagenliteraturen fĂŒr alle, die sich mit dem allgemeinen Bereich der kĂŒnstlichen Intelligenz vertraut machen möchten. Dieses Buch handelt nicht von der Spieleentwicklung – es lehrt die grundlegenden Grundlagen der KI.

Quelle: habr.com

60GB SSD 8Gb DDR4