Ich entwickle derzeit ein GOAP-System in Java. Eine Erklärung zu GOAP finden Sie unter http://web.media.mit.edu/~jorkin/goap.html . Im Wesentlichen wird A * verwendet, um zwischen Aktionen zu zeichnen, die den Weltzustand mutieren.
Um eine faire Chance für alle Aktionen und Ziele zu bieten, verwende ich eine heuristische Funktion, um die Kosten für etwas zu schätzen. Wie lassen sich diese Kosten am besten schätzen, damit sie mit allen anderen Kosten vergleichbar sind?
Wenn Sie beispielsweise die Kosten für die Flucht vor einem Feind im Vergleich zum Angriff schätzen - wie sollten die Kosten berechnet werden, um vergleichbar zu sein?
java
ai
path-finding
Vollwand
quelle
quelle
Antworten:
Um alle Kosten vergleichbar zu machen, müssen Sie nur für alle Aktionen dieselbe Heuristik verwenden. Beispielsweise haben alle Aktionen eine Liste potenzieller Ergebnisse und alle Ergebnisse haben einen bestimmten Wert für die Entität.
Zum Beispiel gibt es einen tiefen Pool mit Wasser, und die Entität ist durstig. Wir schauen uns also eine Aktion an, die der Pool zur Verfügung hat, um dieses Bedürfnis zu befriedigen:
Zuerst die Entitätsprioritäten, die diesen Orten zugeordnet sind, können Sie diese als Modifikatoren bezeichnen. Einige davon ändern sich mit der Zeit und hängen von der Entität ab. Zum Beispiel könnte sich eine Ameise weniger Sorgen machen, am Leben zu bleiben, als vielmehr um Kolonieprobleme. Oder wenn eine Entität eine Weile ohne Getränk war, kann die Befriedigung des Durstes andere überschreiben.
Entitätsprioritäten :
Durst stillen: 40
Trocken bleiben: 10
Am Leben bleiben: 100
Was repräsentiert dann der Ort:
Ort : Pool
Aktion : Wasser sammeln
* Mögliche Ergebnisse: * :
Durst stillen - (-95)
Nass werden - 10
Ertrinken - 1
Wir könnten diese Aktionskosten also berechnen bei: (40 * -95) + (10 * 10) + (100 * 1) = -3600
Wo das Sammeln von Wasser aus einem tobenden Fluss aussehen könnte:
Ort : Raging Fluss
Aktion : Collect Wasser
* Mögliche Ergebnisse: * :
Satisfy Durst - (-95)
nass - 90
Drown - 60
(40 * -95) + (10 * 90) + (100 * 60) = 3100
Es ist also eindeutig eine bessere Wahl, Wasser aus dem Pool zu sammeln. Wenn der tobende Fluss die einzige Wahl wäre, würde das Wesen vielleicht warten, bis seine Durstpriorität sehr hoch ist, bevor es den Fluss probiert.
Vielleicht möchten Sie die Dinge am Anfang viel einfacher halten. Haben Sie nur ein paar Variablen, die globaler angewendet werden können. Wie am Leben bleiben, Bedürfnisse befriedigen. In Ihrem Kampf- oder Flugbeispiel müssten Sie jeder Entität eine Kampfbewertung geben, damit sie sich für Punktezwecke effektiv gegen die andere Entität behaupten kann.
quelle
Ich weiß, ich weiß, es ist schon eine ganze Weile her.
In GOAP, wie es 2005 von Jeff Orkin in FEAR implementiert wurde (und in den Fortsetzungen, der Erweiterung und ... Shadow Of Mordor wiederverwendet wurde), haben Aktionen feste Kosten zwischen 0,5 und 8. Im Allgemeinen sind die Kosten für Angriffe hoch teurer als die Kosten für die Verteidigung. Auf diese Kosten kann in der Spieledatenbank des Free FEAR SDK (2008) zugegriffen werden. hier sind sie:
{{Animate, 1}, {Attack, 6}, {AttackBurstLimited, 5}, {AttackCrouch, 5}, {AttackFromAmbush, 4}, {AttackFromArmored, 4}, {AttackFromArmoredBounded, 4}, {AttackFromCover, 4}, { AttackFromVehicle, 1}, {AttackFromView, 4.5}, {AttackGrenadeFromCover, 2}, {AttackLunge3D, 1}, {AttackLungeMelee, 1}, {AttackLungeSuicide, 1}, {AttackLungeUncloaked, 1}, {AttackMelee, 3}, {AttackMelee, 3} 1}, {AttackMeleeUncloaked, 3}, {AttackReady, 7}, {AttackTurret, 6}, {AttackTurretCeiling, 6}, {BlindFireFromCover, 2}, {Charge, 1}, {DeathOnVehicle, 1}, {DismountNodeUncloaked, 1} , {DismountVehicle, 1}, {DodgeCovered, 1}, {DodgeOnVehicle, 1}, {DodgeRoll, 2}, {DodgeRollParanoid, 2}, {DodgeShuffle, 3}, {DrawWeapon, 1}, {EscapeDanger, 0.5}, { FaceNode, 1}, {FlushOutWithGrenade, 3}, {Follow, 3}, {FollowHeavyArmor, 2}, {FollowPlayer, 2}, {FollowPlayerFidget, 1.8},{FollowWaitAtNode, 4}, {GetOutOfTheWay, 1}, {GotoNode, 1}, {GotoNode3D, 1}, {GotoNodeDirect, 1}, {GotoNodeOfType, 1}, {GotoTarget, 4}, {GotoTarget3D, 4}, {GotoTarget3D, 4} , 8}, {GotoValidPosition, 1}, {HolsterWeapon, 1}, {Idle, 2}, {IdleFidget, 1}, {IdleOnVehicle, 1}, {IdleTurret, 2}, {InspectDisturbance, 2}, {InstantDeath, 1 }, {InstantDeathKnockDown, 1}, {KnockDownBullet, 2}, {KnockDownExplosive, 2}, {KnockDownMelee, 2}, {LongRecoilBullet, 3}, {LongRecoilExplosive, 3}, {LongRecoilHelmetPiercing, 3}, {LongRecoilHelmetPiercing, 3}. {LookAtDisturbance, 1.5}, {LookAtDisturbanceFromView, 3}, {LopeToTargetUncloaked, 1}, {MountNodeUncloaked, 1}, {MountVehicle, 1}, {ReactToDanger, 1}, {Reload, 5}, {ReloadCovered, 1}, {ReloadCovered, 1} , 5}, {ShortRecoilMelee, 4}, {Stunned, 1}, {SuppressionFire, 2}, {SuppressionFireFromCover, 1}, {SurveyArea, 1},{TraverseBlockedDoor, 1}, {TraverseLink, 2}, {TraverseLinkUncloaked, 1}, {Uncover, 1}, {UseSmartObjectNode, 3}, {UseSmartObjectNodeMounted, 1}}
Dies ist jedoch nicht bei allen GOAP-Implementierungen der Fall, und beispielsweise haben die Tomb Raiders variable Kosten (z. B. die Entfernung für eine Goto-Aktion).
Aktionen haben auch Voraussetzungen und einige Aktionen müssen trotz der GOAP-Architektur ausgeführt werden (z. B. eine "betäubte" Animation als Reaktion auf eine schnell abnehmende Gesundheit abspielen - trotz des "Kill Enemy" -Ziels und des Plans, den GOAP zurückgibt, um dieses Ziel zu erreichen). In Ihrem Beispiel, dh weglaufen oder angreifen, kann das Gesundheitsniveau eine Voraussetzung sein (und es müssen keine variablen Kosten anfallen).
Oder eine Check_Costs () - Mitgliedsfunktion wird basierend auf Michaels Prioritäten vor allem anderen ausgeführt und gibt die dynamischen Kosten zurück.
Bitte beachten Sie, dass die Entwickler von Spielen in Shadow Of Mordor versucht haben, mit den Kosten der Aktionen zu spielen, um zu beeinflussen, was auf dem Bildschirm ausgeführt wird. Es stellt sich heraus, dass es nicht so einfach ist und selbst billige Aktionen nicht so oft auftauchen: KI in einem Spiel unterstützt den Spieler; Wenn der Spieler nicht das tut, was erwartet wird, unterstützt die KI dies nur und ... was auf dem Bildschirm angezeigt wird, entspricht nicht dem erwarteten Spieldesign.
quelle