Создание дерева поведения ИИ в C # - Как? - PullRequest
9 голосов
/ 22 ноября 2010

Я пытаюсь создать «дерево поведения» с использованием C #.

Для тех, кто не знает, дерево поведения - это, по сути, фреймворк, вокруг которого вы можете создать ИИ.Существуют секвенсоры, селекторы, декораторы, составные действия и другие вещи.

Я нашел одну библиотеку, в которой реализовано «дерево поведения» в C #, расположенную здесь (http://code.google.com/p/treesharp/), но я не могупонять, как на самом деле использовать его, поскольку нет примера кода, из которого я могу извлечь. Может ли кто-нибудь здесь, возможно, сделать несколько простых примеров кода, который показывает, как на самом деле использовать эту платформу ... или, возможно, вы знаете другой способ реализации дерева поведения в C #?

Большое спасибо!

Ответы [ 2 ]

14 голосов
/ 22 ноября 2010

Я только что посмотрел на эту реализацию, и мне стало интересно, почему столько кода требуется для чего-то относительно простого.

Исходя из того, что вы говорите, вам нужен простой способ составления поведения.Поведение здесь, я полагаю, является отображением состояния в ноль или более действий агента.Вы можете легко смоделировать это, используя C # lambdas.Например:

Action Selector(Func<bool> cond, Action ifTrue, Action ifFalse) {
  return () => { if cond() then ifTrue() else ifFalse() };
}

Action Sequencer(Action a, Action b) {
  return () => { a(); b(); }
}

Листья вашего дерева - это простые Действия, которые делают что-то соответствующее состоянию.Вы «запускаете» дерево, просто выполняя его.

Если вы хотите проявить фантазию, вы можете параметризовать эту схему, чтобы сделать состояние явным.

Надеюсь, это поможет.

---- Приложение ----

Джейсон попросил привести пример того, как вы могли бы использовать этот подход, так что вот простой пример патрулирования "AI" (я предполагаю, что WorldState соответствует описанию среды)во время оценки дерева поведения):

Func<bool> ifPlayerIsInSight = () => ...true iff WorldState shows guard can see player...;

Action shootAtPlayer = () => { ...aim guard's weapon at player and fire... };

Func<bool> ifUnderFire = () => ...true iff WorldState shows guard hears player gunfire...;

Action takeCover = () => { ...guard runs for nearest shelter... };

Action walkBackAndForthGuardingDoorway = () => { ...default guard patrol behaviour... };

Action patrollingGuardBehaviour =
  Selector(ifPlayerIsInSight, shootAtPlayer,
    Selector(ifUnderFire, takeCover,
      walkBackAndForthGuardingDoorway));

Чтобы заставить охранника что-то сделать, просто позвоните patrollingGuardBehaviour().Обратите внимание, что различные подзадачи и тесты могут быть реализованы в виде методов с правильными подписями, а не в виде лямбдВы можете добавить другие комбинаторы к Selector и Sequencer, например, для параллельной деятельности.

4 голосов
/ 22 ноября 2010

Похоже, у одного из разработчиков TreeSharp, apocdev , есть некоторый код , который использует TreeSharp для какого-то колдовского игрока World of Warcraft .

Вот фрагмент:

public Composite CreateSpellCheckAndCast(string name)
{
    return new Decorator(
        ret => Spells.CanCast(name),
        new Action(ret => Spells.Cast(name)));
}

Я не уверен, но использование здесь кажется довольно простым: класс Decorator выглядит так, как будто он проверяет предикат (Spells.CanCast) перед попыткой выполнить какое-либо действие(Spells.Cast).

Так что Composite - это, возможно, Action, который может делать несколько вещей, например, заранее проверять предикат или выполнять несколько действий последовательно.

В блоге apocdev упоминается этот обзор деревьев поведения , который ссылается на более общие описания последовательностей , селекторов и декораторов .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...