Ich stecke ein bisschen fest:
Ich habe eine KI mit GOAP implementiert (Zielorientierte Aktionsplanung, http://alumni.media.mit.edu/~jorkin/gdc2006_orkin_jeff_fear.pdf) ) für ein Simulationsspiel . Das funktioniert gut.
Jetzt möchte ich, dass die Agenten zusammenarbeiten können (z. B. gemeinsam Aktionen ausführen). Was ist in diesem Fall das beste AI-Design, das die GoapActions lose Couplet halten?
Sollten sie zusammen planen? (Was ist in diesem Fall der "Weltstaat"?) Oder sollten sie ihre Pläne teilen? eine Art Nachrichtensystem?
Beispiel
Agent1: Worldstate Agent 1: isLonely = true
Ziel Agent1: isLonely = false
Plan Agent1: AskAgent2ToTalk -> TalkToAgent2
Agent2 Worldstate Agent 2: hasWood = false
Ziel hasWood = true
Plan Agent2: GetAxe -> ChopWood -> BringWoodToSupply
Wie bekomme ich diese Konstellation?
Agent1-Plan: TalkToAgent2
Agent2-Plan: TalkToAgent1 -> GetAxe -> ChopWood -> BringWoodToSupply
Oder wenn sie sprechen und einer der Agenten unterbrochen wird (z. B. durch einen angreifenden Feind), muss der andere Agent wissen, dass seine TalktoAgent2-Aktion beendet wurde.
quelle
Ich denke, goap ist eine neue Version von Zustandsautomaten, die versucht, Zustände einzurichten, um ein Ziel zu erreichen. Sie müssen nur definieren, welche Szenarien in jedem Zustand auftreten.
Zum Beispiel haben Sie einige KI-Feinde, die Patrouillen-, Verfolgungs-, Such- und Angriffszustände haben. Sie können einfach einen Code schreiben, der, wenn einer der Feinde den Spieler gefunden hat, alle den Zustand in Angriffs- oder Verfolgungszustand ändert. In einem anderen Beispiel haben Sie ein Szenario, in dem im Angriffszustand ein oder zwei Feinde den Spieler flankieren und andere ihn unterstützen müssen. Jeder Feind prüft also, ob ein Feind flankiert oder eine andere Bedingung vorliegt (Sie können einfach eine Bool-Variable dafür definieren). Wenn dies nicht der Fall ist, gehen Sie zur Flanke, sonst gehen Sie zur Unterstützung. Alles hängt von den von Ihnen definierten Szenarien und Regeln ab.
quelle
Ich weiß nicht, ob Sie versuchen, eine lose Kopplung zwischen Agenten zu erreichen, da dies sowieso das war, was ich interpretiert habe. Das wäre der beste Ansatz. Sie sollten nach dem Beobachtermuster suchen , einem Ereignisabonnementsystem, das Abhängigkeiten vermeidet. Sie könnten es so verwenden (ich werde versuchen, sprachunabhängig zu sein):
Es liegt also an Ihnen, die Logik zum Abonnieren / Abbestellen festzulegen, wenn der Agent beschäftigt ist und keine Firma bilden kann.
Wenn Sie C # verwenden, sollten Sie Ereignisdelegierte aktivieren , die das oben genannte Muster bereits implementieren.
Hoffe, es gibt Ihnen zumindest eine Idee.
quelle
Sie müssten A: Schritt und Bewertung verwenden und B: Sie müssen mehrere haben Ziele mit Prioritäten haben.
Wenn Agent1 X will und Agent2 niemals X will, können sie nicht zusammenarbeiten . Das kann in keinem System passieren . Um dies zu beheben, müssen mehrere Ziele verfolgt werden. Sie können Ziele sogar danach priorisieren, wie weit man sie erreicht hat und wie einfach andere Ziele erreicht werden können . In Ihrem Szenario ohne Prioritäten lautet dies:
Agent1 bat dann Agent2 fortlaufend, zu sprechen, bis er eine Bestätigung erhielt, was nach Abschluss seiner ersten Aufgabe geschehen würde.
Schritte in Richtung jedes Ziels müssen bewertet werden, und obwohl dies mit nur einem Ziel keine große Sache ist, können mehr Ziele Ihr Spiel möglicherweise verlangsamen.
Um dieses Problem zu lösen, benötigen Sie Bäume, die aus der Ausführung von Aufgaben generiert wurden, bei denen möglicherweise mehrere Ziele gleichzeitig überprüft werden, um die Verarbeitung von Entscheidungen zu beschleunigen.
quelle