複数のエージェントによる目標指向の行動計画


8

私は少し行き詰まっています:

シミュレーションゲームにGOAP(目標指向のアクションプランニング、http: //alumni.media.mit.edu/~jorkin/gdc2006_orkin_jeff_fear.pdf)を使用してAIを実装しました。それはうまくいきます。

今、私はエージェントが協力できることを望みます(例えば、一緒に行動を起こす)。この場合、GoapActionsが緩いカプレットを保持する最高のAIデザインは何ですか?

彼らは一緒に計画すべきですか?(この場合、「世界国家」とは何ですか?)または、彼らは計画を共有する必要がありますか?ある種のメッセージシステム?


Agent1:Worldstate Agent 1:isLonely = true
目標Agent1:isLonely = false

エージェント1の計画:AskAgent2ToTalk-> TalkToAgent2

Agent2 Worldstate Agent 2:hasWood = false
目標hasWood = true

エージェント2の計画:GetAxe-> ChopWood-> BringWoodToSupply

この星座を取得するにはどうすればよいですか?

Agent1プラン:TalkToAgent2
Agent2プラン:TalkToAgent1-> GetAxe-> ChopWood-> BringWoodToSupply

または、彼らが話していて、エージェントの1つが(たとえば、攻撃する敵によって)中断された場合、他のエージェントは、彼のTalktoAgent2アクションが終了したことを知っている必要があります。

回答:


1

活動計画を使用しないことを強くお勧めします。拡張、設計、およびバグ修正は非常に困難です。DwarfCorpの非常に早い段階でタスク計画を放棄しました。これは、周りの新しい動作をすばやく設計するには複雑すぎるためです。ただし、必要な場合は、これをマルチエージェント計画の問題として解釈する必要があります。

これを達成する1つの方法は、階層計画を使用することです。下位レベルのエージェントにサブ問題を割り当てるためのメタエージェントを作成する必要があります。メタエージェント、つまり「タスクプランナー」は全体的な目標を達成しようとし、その制御下にあるサブエージェントをメタアクションとして使用します。

たとえば、メタエージェントの目標が「家を建てる」であるとします。エージェントと木材を収集する場所を入力として取るアクション「木材を収集する」があります。次に、異なるエージェントを異なるサブタスクに割り当てることができます。たぶん、1人のエージェントが行って木を集め、もう1人が集めた木を使って家を建てます。

「孤独を減らす」のような他の目標があるかもしれません。これらの目標は、相互に包含できるように、優先度順に並べる必要があります。中央のタスクプランナーは、最も重要な目標をいつでも決定し、さまざまなサブゴールを使用してエージェントをエージェントに割り当てます。アイドル状態のエージェントを探し、エージェントに割り当てるのに最適なサブタスクを見つけて、ケースに入れます。


dwarfCropで使用しているプレーニングシステムは何ですか?階層型計画システムには問題があります。エージェントの「自由意志」をどのように修正するのですか?エージェントは、「メタエージェント」が要求することを常に行う必要はありません。
ジェームズ

1
したがって、メタエージェントは「これらは私があなたにしてほしいタスクです」と言います。エージェントには、「退屈している」や「お腹が空いている」などの一連の設定もあります。これらは優先キューに入れられます。メタエージェントの優先順位がエージェントの優先順位をオーバーライドする場合もあれば、エージェントがメタエージェントをオーバーライドする場合もあります。
mklingen

0

goapは、状態をセットアップして目標を達成しようとする新しいバージョンの状態マシンだと思います。すべての状態で発生しているシナリオを定義する必要があります。

たとえば、パトロール、チェイス、検索、攻撃の状態を持つAIの敵がいるとします。敵の1人がプレーヤーを見つけたときに、すべての状態が変化して攻撃または追跡の状態になるコードを記述するだけです。他の例として、攻撃状態で、1人または2人の敵がプレイヤーの側面にいる必要があり、他の敵がそれらをサポートする必要があるというシナリオがあります。したがって、すべての敵は、敵の側面またはその他の条件があるかどうかを確認します(そのためのブール変数を定義できます)。ない場合は、側面に行き、サポートに行きます。すべては、定義したシナリオとルールに依存します。


しかし、以下の状況を想像してみてください。agent1がagent2と話したい、agent2が木材を集めている。どうすればこれを達成できますか?
ジェームズ2017

私は例を追加しました
ジェームズ2017

0

エージェント間の疎結合を実現しようとしているかどうかはわかりません。それが私が解釈したものであり、とにかく、それが最善のアプローチであるため、依存関係を回避するイベントサブスクリプションシステムであるObserverパターンを確認する必要があります。次のように使用できます(言語にとらわれないようにします)。

public interface ILonelyObserver
{
    void ItsLonely();
}

public class Agent implements ILonelyObserver
{
    private static List<ILonelyObserver> observers;
    private bool busy;

    public static void IAmLonely()
    {
        for(int i = 0; i < observers.Count; i++)
        {
            observers.ItsLonely();
        }
    }

    public static void Subscribe()
    {
        if(observers == null) observers = new List<IObserver>();
        observers.Add(this);
    }

    public static void Unsubscribe()
    {
        if(observers != null) observers.Remove(this);
    }

    public void ItsLonely()
    {
        /// Do what it takes to make company...
    }

    public Agent()
    {
        Subscribe();
    }

    ~Agent()
    {
        Unsubscribe();
    }
}

そのため、エージェントがビジーで会社を作ることができない場合は、サブスクライブ/サブスクライブ解除のロジックを作成する必要があります。

C#を使用する場合は、前述のパターンを既に実装しているイベントデリゲートを確認する必要があります。

それがあなたに少なくともアイデアを与えることを願っています。


0

A:ステップを使用して評価し、B:優先順位を付けて複数の目標を設定する必要があります。

Agent1がXを必要とし、Agent2がXを必要としない場合、それらは一緒に動作できません。それはどのシステムでも起こりえません。これを修正するには、複数の目標を追跡する必要があります。目標に向かってどれだけ進んだか、他の目標をどれだけ簡単に達成できるかに基づいて、目標に優先順位を付けることもできます。優先度のないシナリオでは、これは次のようになります。

Agent1:Worldstate Agent 1:isLonely = trueゴール:isLonely = false

エージェント1の計画:AskAgent2ToTalk-> TalkToAgent2

Agent2 Worldstate Agent 2:hasWood = false、isLonely = true

目標:hasWood = true

目標:isLonely = false

エージェント2の計画:GetAxe-> ChopWood-> BringWoodToSupply、AskAgent1ToTalk-> TalkToAgent1

その後、エージェント1は、エージェント2が最初のタスクを完了した後に発生する肯定的な応答が得られるまで、継続的にエージェント2に話すように要求します。

各目標に向けてステップを踏むことは評価される必要があり、目標が1つだけの場合、これは大した問題ではありませんが、目標を増やすとゲームが遅くなる可能性があります。

この問題を解決するには、一度に複数の目標のチェックを非表示にし、意思決定の処理を高速化するタスク実行し生成されたツリーが必要です。

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