我听说Haskell中有关于树实现的策略,但我没有找到任何有关良好行为树替代方案的信息。
我的目标:给定一个代表一个状态的元组,将这个tuble提供给行为树节点的最佳模式是什么,每个节点都根据元组返回busy / error / completed / running。该行为也可能会更改元组(导致状态更改)。
可以根据父节点的策略执行嵌套节点。例如,如果子节点返回“错误”,则不会再评估子节点。另一种策略是即使返回错误状态也要执行所有子节点。
我希望这是有道理的!
答案 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
在此进行特定测试:
请注意标准行业BT的一些不同功能:
使用Haskell有一些问题(例如,我仍然无法弯曲类型系统来表示树处理事件类型T1只能包含触发事件类型T1的子树),但可以提供一些具有很强表现力的功能(例如循环作为无限懒惰的名单)。
请注意,它仍然相当alpha或甚至pre-alpha!我开始将它与The Dark Mod(http://thedarkmod.com)整合在一起,我希望能够验证我的假设。如果您最终感兴趣,请随时发送邮件。