Я немного застрял
Я реализовал ИИ с 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 завершено.
источник
Я думаю, что goap - это новая версия конечных автоматов, которая пытается настроить состояния для достижения цели. вам просто нужно определить, какие сценарии происходят в каждом штате.
Например, у вас есть несколько врагов ИИ, которые имеют состояния патрулирования, погони, поиска и атаки. Вы можете просто написать код, который, когда один из врагов найдет игрока, все изменится на состояние атаки или погони. В другом примере у вас есть сценарий, когда в состоянии атаки один или два врага должны атаковать игрока с фланга, а другой должен их поддержать. поэтому каждый враг проверяет, есть ли вражеский фланг или какое-то другое условие (вы можете просто определить переменную bool для этого). если нет, идите на фланг, иначе идите на поддержку. все зависит от сценариев и правил, которые вы определяете.
источник
Я не знаю, пытаетесь ли вы добиться слабой связи между агентами, так как это было то, что я интерпретировал, так или иначе, это был бы лучший подход, вы должны проверить шаблон наблюдателя , который представляет собой систему подписки на события, которая избегает зависимостей. Вы можете использовать это следующим образом (я постараюсь быть независимым от языка):
Таким образом, вы должны сделать логику подписки / отписки, когда агент занят и не может создать компанию.
Если вы должны использовать C #, вы должны проверить Event Delegates , который уже реализует вышеупомянутый шаблон.
Надеюсь, это даст вам хотя бы идею.
источник
Вы должны A: использовать шаг и оценить и B: у вас должно быть несколько целей с приоритетами.
Если Agent1 хочет X, а Agent2 никогда не хочет X, они не могут работать вместе . Этого не может случиться ни в одной системе . Чтобы это исправить, вам нужно будет отслеживать несколько целей. Вы можете даже расставить приоритеты для целей, основываясь на том, как далеко они продвинулись к ним и насколько легко могут быть достигнуты другие цели . В вашем сценарии без приоритетов это становится:
Затем Agent1 будет постоянно просить Agent2 говорить, пока он не получит утвердительный ответ, что произойдет после того, как он выполнит свою первую задачу.
Необходимо оценивать шаги по достижению каждой цели, и хотя с одной целью это не имеет большого значения, большее количество целей может замедлить вашу игру.
Чтобы решить эту проблему, вам нужны деревья, сгенерированные при выполнении задач, которые могут скрывать проверку нескольких целей одновременно, ускоряя обработку решений.
источник