Деревья поведения в Haskell

Я слышал, что в Haskell есть стратегии для реализации дерева, но я не нашел никакой информации о хорошей альтернативе дерева поведения.

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

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

Я надеюсь в этом есть смысл!


person Jonathan Dunlap    schedule 09.05.2012    source источник
comment
Я не уверен на 100%, что понимаю вопрос, но unfoldTree вас интересует?   -  person Daniel Wagner    schedule 10.05.2012
comment
У вас есть ссылки или пример кода? Немного непонятно, о чем вы спрашиваете.   -  person Don Stewart    schedule 10.05.2012


Ответы (4)


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

Что касается систем рассуждений с прямой цепочкой и, в частности, алгоритма Рете, то они в основном уже функционируют. Они выполняют итерации и добавляют новые знания в базу данных по мере их продвижения, пока у них не закончатся дела. Если вы не разрешаете произвольные эффекты, это будет простой порт Control.Monad.State; если вам нужны произвольные эффекты, вы можете вместо этого использовать преобразователь монады состояния, и это не что-то промежуточное/продвинутое, Haskellers будет всем, что запугано. Вы можете найти то, что можете использовать на сайте Haskell, но если вам придется делать это самостоятельно глава Monad Transformers книги Real World Haskell незаменим.

Я ничего не знаю о деревьях поведения, но, взглянув на Википедию, они выглядят как алгоритм Рете плюс параллельные процессы в фоновом режиме. Если это даже близко к правильному, вам нужно решить, нужен ли вам параллелизм или параллелизм. Если вы довольны тем, что чистые значения "волшебным образом" вычисляются быстрее (и, соответственно, все, что написано на Haskell), то вы можете обойтись без использования материала в Control.Parallel без особых усилий, но вы не сможете ( скажем) узнать, какие процессы запущены, а какие нет. Если вам действительно нужно другое наблюдаемое поведение, вам понадобится Control.Concurrent, и это менее волшебно, поэтому больше учета. Саймон Марлоу написал довольно хороший учебник о ваших возможностях. То, что вы описываете, звучит для меня более низкоуровнево, чем большинство интересных вещей, которые Haskell может сделать для вас; если вы решите принять интерфейс более высокого уровня, вам будет проще его реализовать. Я тоже далеко не специалист в этом вопросе.

person Daniel Lyons    schedule 10.05.2012

Недавно я опубликовал библиотеку дерева поведения умников на hackage.

https://hackage.haskell.org/package/smarties

Я уверен, что есть и другие отличные способы реализации BT в Haskell, но я очень доволен дизайном. Обратите внимание, что Smarties поддерживает только 2 состояния узла SUCCESS и FAIL.

В ответ на ваши вопросы:

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

Основной тип smarties — это монада, представляющая последовательность узлов с внутренним восприятием (состоянием). В этом смысле она очень похожа на монаду State. Существуют также интерфейсы для обеспечения неизменного восприятия.

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

Он закорачивает статус и окончательный вывод каждый раз, когда достигает узла FAIL. Тем не менее, он по-прежнему запускает оставшиеся узлы, чтобы получить свое монадическое возвращаемое значение, что очень полезно для составления логики в BT.

Таким образом, селекторы (которые представляют логику ветвления) реализуются путем передачи списка монад узлов и выбора первой из них с состоянием SUCCESS.

Монадический синтаксис оказывается действительно мощным в деревьях поведения. Вы читаете состояние в какой-то точке вашего дерева и используете его значение намного позже в дереве. Это значительно упрощает компоновку узлов!

person cmspice    schedule 28.03.2020

Мы все немного сбиты с толку вашим вопросом, и я, возможно, не понимаю, что вы имеете в виду, когда говорите «кортеж», но снято в темноте:

Я написал небольшую библиотеку под названием simple-actors, предназначенную для параллельного взаимодействия с моделью акторов. Если вы можете себе представить, что вам нужно, чтобы «актеры» слушали параллельные «каналы» и общались друг с другом, тогда вам может быть интересно взглянуть.

В верхней части документации приведен пример своего рода бинарное дерево поиска актеров (ваш вопрос напомнил об этом, извините, если все не так).

Правка: я должен упомянуть, что полностью нашел страницу википедии в деревах поведения. непостижимый; возможно, кто-то, знакомый с корпоративным жаргоном, может помочь.

person jberryman    schedule 10.05.2012

Не найдя реализаций BT, я сам начал какую-то реализацию BT на Haskell, описанную здесь:

http://www.brainific.com/blog/2015/09/twisting-your-trees/

и хранится здесь:

https://bitbucket.org/brainific/action-fw/src

С конкретными тестами здесь:

https://bitbucket.org/brainific/action-fw/src/a6081b740dc4b8258f67f49df473458737fc4240/test/BehaviourTrees21Test.hs?at=master&fileviewer=file-view-default

Обратите внимание на некоторые отличия от стандартных отраслевых BT:

  • Деревья управляются событиями, что больше похоже на дерево процессов обработки событий, чем на более обычное дерево опроса;
  • Типы событий являются общими: состояния «Успех/Отказ/Выполнение» образуют просто еще один тип события, обрабатываемый с помощью функций перехода, поэтому вы можете фактически смешивать и сопоставлять узлы BT и узлы FSM без особых хлопот;
  • Узлы событий не статичны, а генерируются из некоторого типа данных Env во время выполнения (я не проводил глубоких проверок производительности, но, надеюсь, Haskell RTS должен быть здесь полезен);
  • Узлы задаются с помощью кода, поэтому они могут быть немного более экзотическими, чем обычно (один из них может порождать процесс планирования и ждать запуска «продолжения», прерывая работу BT по умолчанию во время выполнения планирования);
  • Доска объявлений или межагентские сообщения еще не реализованы (хотя добавить карты и каналы должно быть достаточно просто).

Использование Haskell имеет некоторые проблемы (например, я все еще не могу изменить систему типов, чтобы выразить, что дерево, обрабатывающее событие типа T1, может содержать только поддеревья, которые запускают событие типа T1), но может предоставить некоторые функции с большой выразительной силой (например, циклы как бесконечные ленивые списки).

Обратите внимание, что это все еще альфа или даже пре-альфа! Я начинаю интегрировать его с The Dark Mod (http://thedarkmod.com), где я надеюсь подтвердить свои предположения. . Не стесняйтесь отправить письмо, если вы в конечном итоге заинтересованы.

person Javier Torres    schedule 11.12.2017