GOAPシステムでのコストの見積もり


9

現在、JavaでGOAPシステムを開発しています。GOAPの説明はhttp://web.media.mit.edu/~jorkin/goap.htmlにあります。基本的に、A *を使用して、世界の状態を変化させるアクション間をプロットします。

すべてのアクションと目標を実行するための公正な機会を提供するために、私はヒューリスティック関数を使用して何かを行うコストを見積もります。他のすべてのコストと比較できるように、このコストを見積もる最良の方法は何ですか?

例として、敵から逃げるコストとそれを攻撃するコストの見積もり-コストを比較できるように計算するにはどうすればよいですか?


私たちは、RTSゲームのためGOAPを使用していて、すぐにこのようなより多くのチュートリアルを掲載されます。indiedb.com/games/attack-of-the-gelatinous-blob/news/...
Erlend

回答:


4

すべてのコストを比較可能にするには、すべてのアクションに同じヒューリスティックを使用するだけで済みます。たとえば、すべてのアクションには潜在的な結果のリストがあり、すべての結果にはエンティティに対して特定の値があります。

たとえば、水のある深いプールがあり、エンティティがのどが渇いています。そこで、そのニーズを満たすためにプールが使用できるアクションを見てみましょう。

最初に、これらの場所に関連付けられたエンティティの優先順位、これらを修飾子と呼ぶことができます。これらのいくつかは時間とともに変化し、エンティティに依存します。たとえば、アリは生き続けることよりも、コロニーの問題について心配するかもしれません。または、エンティティが飲み物なしでしばらく行った場合、満足度の渇きの優先順位が他のものをオーバーライドする場合があります。

エンティティの優先順位

喉の渇きを満たす:40
乾いた状態を保つ:10
生き続ける:100

次に、場所が表すもの:

場所:プール
アクション:水を集める
* 潜在的な結果:*
喉の渇きを満たす-(-95)
濡れる-10
溺れる-1

したがって、次のアクションコストを計算できます:(40 * -95)+(10 * 10)+(100 * 1)= -3600

荒れ狂う川から水を集める場所は次のようになります。

場所:荒れ狂う川
アクション:水を集める
* 潜在的な結果:*
渇きを満たす-(-95)
濡れる-90
溺れる-60

(40 * -95)+(10 * 90)+(100 * 60)= 3100

そのため、プールから水を集めることは明らかに良い選択です。たぶん、荒れ狂う川が唯一の選択だったとしたら、エンティティはその渇きの優先度が非常に高くなるまで待ってから川を試すでしょう。

あなたは物事をずっと簡単に始めておくことを望むかもしれません。よりグローバルに適用できるいくつかの変数があるだけです。生き続けるように、ニーズを満たします。戦闘または飛行の例では、各エンティティに戦闘評価を与える必要があります。そうすることで、スコア目的で他のエンティティに対して自分自身を効果的にランク付けできます。


どうもありがとう!すべての潜在的な結果を予測することは、私が持っていたものよりも良い考えのように思えます。
フルウォール、

0

私は知っている、私は知っている、それはかなり久しぶりだ。

確かに、2005年にFEARのJeff Orkinによって実装されたGOAP(および続編、拡張、そしてShadow of Mordorで再利用された)のGOAPでは、アクションには0.5〜8の範囲の固定コストがあります。一般に、攻撃のコストは防御のコストよりも高価です。これらの費用は、Free FEAR SDK(2008)のゲームデータベースでアクセスできます。どうぞ:


{{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}、 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}、{GotoTargetLost 、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、co、3}、{LongRecoilHelmetPiercing、3} {LookAtDisturbance、1.5}、{LookAtDisturbanceFromView、3}、{LopeToTargetUncloaked、1}、{MountNodeUncloaked、1}、{MountVehicle、1}、{ReactToDanger、1}、{Reload、5}、{ReloadCovered、1}、{ReloadCrouch 、5}、{ShortRecoilMelee、4}、{Stunned、1}、{SuppressionFire、2}、{SuppressionFireFromCover、1}、{SurveyArea、1}、{TraverseBlockedDoor、1}、{TraverseLink、2}、{TraverseLinkUncloaked、1}、{Uncover、1}、{UseSmartObjectNode、3}、{UseSmartObjectNodeMounted、1}}


ただし、すべてのGOAP実装がそうであるとは限りません。たとえば、トゥームレイダーのコストは変動します(たとえば、Gotoアクションの距離)。

アクションには前提条件があり、GOAPアーキテクチャにもかかわらず一部のアクションを実行する必要があります(たとえば、「敵を殺す」目標とGOAPがその目標を満たすために返す計画にもかかわらず、ヘルスが急速に低下する反応で「気絶」アニメーションを再生します)。あなたの例では、つまり、逃げるvs攻撃する場合、ヘルスレベルは前提条件になる可能性があります(変動するコストを持つ必要はありません)。

または、Michaelの優先順位に基づいて、Check_Costs()メンバー関数が何よりも先に実行され、動的コストを返します。

ここで、Shadow Of Mordorのゲーム開発者は、画面上で実行される内容に影響を与えるために、アクションのコストを試してみたことに注意してください。それはそれほど簡単ではなく、安価なアクションでさえそれほど頻繁に表示されないことがわかります。ゲームのAIはプレイヤーをサポートします。プレーヤーが期待したことを行わない場合、AIはそれをサポートします。画面に表示されるものは、ゲームデザインが期待したものではありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.