Haskell中的行为树

时间:2012-05-09 22:23:38

标签: haskell

我听说Haskell中有关于树实现的策略,但我没有找到任何有关良好行为树替代方案的信息。

我的目标:给定一个代表一个状态的元组,将这个tuble提供给行为树节点的最佳模式是什么,每个节点都根据元组返回busy / error / completed / running。该行为也可能会更改元组(导致状态更改)。

可以根据父节点的策略执行嵌套节点。例如,如果子节点返回“错误”,则不会再评估子节点。另一种策略是即使返回错误状态也要执行所有子节点。

我希望这是有道理的!

4 个答案:

答案 0 :(得分:3)

不幸的是,你似乎是一个很少有Haskell用户了解的利基专家。所有我对这些技术的了解都是我从非技术人员那里听到的,他们谈论的是不同的商业规则引擎,所以我可能不在基地,但我认为值得一试,因为其他人都很难过。

就前向链接推理系统和特别是Rete算法而言,它们基本上已经是功能性的。他们迭代并向数据库添加更多知识,直到他们完成任务为止。如果你不允许任意效果,它将是一个简单的Control.Monad.State端口;如果你需要任意效果,你可以使用状态monad变换器,而不是中间/高级Haskellers会被吓倒的东西。您可能会发现可以使用on the Haskell site的内容,但如果您最终自己执行此操作,那么 Real World Haskell 的章节将是必不可少的。

我对行为树一无所知,但是在维基百科上,他们看起来像Rete算法加上后台的并发进程。如果这甚至接近正确,那么你必须决定是否需要并发或并行。如果你满足于纯粹的值“神奇地”被更快地计算(并且,通过扩展,所有内容都是用Haskell编写的)那么你可以放弃使用Control.Parallel中的东西而不是很费力但是你不会能够(比如说)查询哪些进程正在运行,哪些进程没有运行。如果你真的需要不同的可观察行为,那么你需要Control.Concurrent并且它不那么神奇,所以更多的记账。 Simon Marlow写了the Monad Transformers关于你在那里的选择。你所描述的内容对我来说听起来比Haskell为你做的大部分很酷的东西都低;如果您决定接受更高级别的界面,您可能会发现它更容易实现。我也不是这个主题的专家。

答案 1 :(得分:3)

我最近发布了关于黑客的聪明人行为树库

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

我敢肯定,还有其他很棒的方法可以在haskell中实现BT,但是我对此设计感到非常满意。注意聪明人仅支持2个节点状态SUCCESS和FAIL。

针对您的问题:

将元组喂入行为树的最佳模式是什么 每个节点根据以下信息返回繁忙/错误/已完成/正在运行 元组。该行为也可能会更改元组(导致状态 更改)。

smarties主要类型是monad,它表示具有内部感知(状态)的节点序列。从这个意义上讲,它与State monad非常相似。也有一些接口可以强制实现不变的感知。

嵌套节点可以根据其父节点的策略执行 节点。例如,如果子节点返回“错误”,则不再有子节点 节点将被评估。另一个策略是处死所有孩子 节点,即使返回错误状态也是如此。

只要遇到故障节点,它就会短路状态和最终输出。但是,它仍然运行其余节点以获取其单返回值,这对于在BT中编写逻辑非常有用。

选择器(代表分支逻辑)是通过传入节点monad的列表并采用具有SUCCESS状态的第一个来实现的。

一元语法在行为树中非常强大。您可以在树中的某个位置读取状态,并在树中稍后使用它的值。这使节点的编写变得容易得多!

答案 2 :(得分:2)

我们对你的问题感到有点困惑,当你说“元组”时,我可能不明白你的意思,但在黑暗中拍摄:

我写了一个名为simple-actors的小型库,用于Actor Model concurrency。如果你可以想象你需要通过“演员”聆听并发“频道”并相互沟通来完成你所需要的东西,那么你可能会有兴趣看一看。

在这里的文档顶部是一个binary search tree of actors的例子(你的问题让我想到了,对不起,如果这一切都不合适的话)。

编辑:我应该提到我发现Behavior Trees上的维基百科页面完全不可理解;也许熟悉企业术语的人可以提供帮助。

答案 3 :(得分:0)

在没有找到BT实现的情况下,我自己在Haskell中开始了一些BT的实现,在这里描述:

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的子树),但可以提供一些具有很强表现力的功能(例如循环作为无限懒惰的名单)。

请注意,它仍然相当alpha或甚至pre-alpha!我开始将它与The Dark Mod(http://thedarkmod.com)整合在一起,我希望能够验证我的假设。如果您最终感兴趣,请随时发送邮件。