Целевое планирование действий с несколькими агентами

8

Я немного застрял

Я реализовал ИИ с GOAP (планирование действий, ориентированное на цели, http://alumni.media.mit.edu/~jorkin/gdc2006_orkin_jeff_fear.pdf ) для игры-симулятора. Это отлично работает.

Теперь я хочу, чтобы агенты могли сотрудничать (например, делать действия вместе). Каков в этом случае лучший AI-дизайн, который GoapActions хранит свободным куплетом?

Должны ли они планировать вместе? (что в данном случае означает «состояние мира»?) Или они должны поделиться своими планами? какая-то система сообщений?

Пример
Agent1: Worldstate Agent 1: isLonely = true
Цель Agent1: isLonely = false

Plan Agent1: AskAgent2ToTalk -> TalkToAgent2

Agent2 Worldstate Agent 2: hasWood = false
Цель hasWood = true

Plan Agent2: GetAxe -> ChopWood -> BringWoodToSupply

Как мне получить это созвездие?

План агента
1: TalkToAgent2 План агента 2: TalkToAgent1 -> GetAxe -> ChopWood -> BringWoodToSupply

Или, если они разговаривают, и один из агентов прерван (например, атакующим врагом), другой агент должен знать, что его действие TalktoAgent2 завершено.

Джеймс
источник

Ответы:

1

Я настоятельно рекомендую вам не использовать планирование деятельности. Это очень сложно расширять, проектировать и исправлять. Мы очень рано отказались от планирования задач в DwarfCorp, потому что он слишком сложен, чтобы быстро разрабатывать новые модели поведения. Но если вам нужно, вы должны интерпретировать это как проблему планирования с несколькими агентами.

Один из способов достижения этого - иерархическое планирование . Вам нужно создать метаагент для назначения подзадач вашим агентам более низкого уровня. Метаагент, или «Планировщик задач», пытается достичь общей цели и использует подагенты под своим контролем в качестве мета-действий.

Например, ваш метаагент может иметь цель «Построить дом». Он имеет действие «собирать дрова», которое принимает в качестве входных данных агента и место для сбора дров. Затем он может назначить разных агентов для разных подзадач. Возможно, один агент идет и собирает дрова, а другой использует собранные дрова для строительства дома.

У него могут быть другие цели, такие как «уменьшить одиночество». Эти цели должны быть упорядочены по приоритету, чтобы они могли объединять друг друга. Центральный планировщик задач в любой момент времени решает, каковы наиболее важные цели, и назначает для них агентов, используя различные подзадачи. Он ищет незанятых агентов, выясняет, какую лучшую подзадачу назначить агенту, а затем помещает их в дело.

mklingen
источник
Какую систему строгания вы используете в dwarfCrop? У системы иерархического планирования есть проблема: как вы определяете «свободную волю» агента? агент не всегда должен делать то, о чем просит «метагент».
Джеймс
1
Поэтому метаагент говорит: «Это задачи, которые я хочу, чтобы вы выполняли». Агент также имеет набор предпочтений, таких как «мне скучно» или «я голоден». Они попадают в приоритетную очередь. Иногда приоритеты метаагента переопределяют приоритеты агента, в других случаях агент переопределяет метаагент.
Mklingen
0

Я думаю, что goap - это новая версия конечных автоматов, которая пытается настроить состояния для достижения цели. вам просто нужно определить, какие сценарии происходят в каждом штате.

Например, у вас есть несколько врагов ИИ, которые имеют состояния патрулирования, погони, поиска и атаки. Вы можете просто написать код, который, когда один из врагов найдет игрока, все изменится на состояние атаки или погони. В другом примере у вас есть сценарий, когда в состоянии атаки один или два врага должны атаковать игрока с фланга, а другой должен их поддержать. поэтому каждый враг проверяет, есть ли вражеский фланг или какое-то другое условие (вы можете просто определить переменную bool для этого). если нет, идите на фланг, иначе идите на поддержку. все зависит от сценариев и правил, которые вы определяете.

virtouso
источник
Но представьте себе следующую ситуацию: агент1 любит разговаривать с агентом2, агент2 собирает дрова. В этом случае агент2 должен знать, что агент1 любит общаться с агентом1, а агент1 должен знать, отвечает ли агент2 на ответ или просто игнорирует его. как мне этого добиться?
Джеймс
Я добавил пример
Джеймс
0

Я не знаю, пытаетесь ли вы добиться слабой связи между агентами, так как это было то, что я интерпретировал, так или иначе, это был бы лучший подход, вы должны проверить шаблон наблюдателя , который представляет собой систему подписки на события, которая избегает зависимостей. Вы можете использовать это следующим образом (я постараюсь быть независимым от языка):

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 #, вы должны проверить Event Delegates , который уже реализует вышеупомянутый шаблон.

Надеюсь, это даст вам хотя бы идею.

LifGwaethrakindo
источник
0

Вы должны A: использовать шаг и оценить и B: у вас должно быть несколько целей с приоритетами.

Если Agent1 хочет X, а Agent2 никогда не хочет X, они не могут работать вместе . Этого не может случиться ни в одной системе . Чтобы это исправить, вам нужно будет отслеживать несколько целей. Вы можете даже расставить приоритеты для целей, основываясь на том, как далеко они продвинулись к ним и насколько легко могут быть достигнуты другие цели . В вашем сценарии без приоритетов это становится:

Agent1: Worldstate Agent 1: isLonely = true Цель: isLonely = false

Plan Agent1: AskAgent2ToTalk -> TalkToAgent2

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

Цель: hasWood = true

Цель: isLonely = false

Plan Agent2: GetAxe -> ChopWood -> BringWoodToSupply, AskAgent1ToTalk -> TalkToAgent1

Затем Agent1 будет постоянно просить Agent2 говорить, пока он не получит утвердительный ответ, что произойдет после того, как он выполнит свою первую задачу.

Необходимо оценивать шаги по достижению каждой цели, и хотя с одной целью это не имеет большого значения, большее количество целей может замедлить вашу игру.

Чтобы решить эту проблему, вам нужны деревья, сгенерированные при выполнении задач, которые могут скрывать проверку нескольких целей одновременно, ускоряя обработку решений.

WHN
источник