问题标签 [behavior-tree]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1426 浏览

optimization - 从嵌套状态转换到嵌套状态的最佳实践(见图)

我正试图围绕以单线程编程语言(Actionscript)实现嵌套状态转换的最佳方法。假设我有这样的行为树结构:行为树

现在假设每个叶子节点是网站上的一个目标点,就像画廊中的图像,或者嵌套在页面视图中的帖子视图中的评论......目标是能够从叶子运行动画过渡节点到叶节点,通过动画出前一棵树(从下到上),并在当前树中动画化(从上到下)。

所以,如果我们在最左下角的叶子节点,并且我们想去最右下角的叶子节点,我们必须:

  • 转出左下节点
  • 完成时(比如在一秒钟的动画之后),过渡到它的父级,
  • 完成后,转出它的父级
  • 完成后,过渡到最右边的父级
  • 完成后,最右边的过渡
  • 完成时,叶中的过渡

我的问题是:

如果您将这些节点中的每一个想象成 HTML 视图(叶子是“部分”,借用 rails 的术语)或 MXML 视图,您在其中嵌套子组件,并且您不一定知道嵌套级别应用程序根目录,如上所述为过渡设置动画的最佳方式是什么?

一种方法是全局存储所有可能的路径,然后说“应用程序,过渡到这条路径,过渡到这条路径”。如果应用程序非常简单,那就可以了。这就是Gaia的做法,一个 Actionscript 框架。但是,如果您希望它能够转换进/出任意嵌套路径,则不能全局存储它,因为:

  1. Actionscript 无法处理所有这些处理
  2. 似乎不是很好的封装

所以这个问题可以改写为,你如何动画出最左边的叶子节点及其父节点,从叶子开始,并在最右边的叶子节点中动画,从根开始? 该信息存储在哪里(要输入和输出什么)?

另一种可能的解决方案是只说“应用程序,转出上一个子节点,完成后,转入当前子节点”,其中“子节点”是应用程序根的直接子节点。然后应用程序根的最左边的子节点(它有两个子节点,每个子节点都有两个子节点)将检查它是否处于正确的状态(如果它的子节点被“转出”)。如果没有,它会在它们上调用“transitionOut()”......这样所有东西都将被完全封装。但这似乎是处理器密集型的。

你怎么看?你还有其他选择吗?或者你能指出我关于AI 行为树或分层状态机的任何好的资源,这些资源描述了它们如何实际实现异步状态转换:

  • 他们从哪里调用对象上的“transitionOut”?从根源还是特定的孩子?
  • 状态存储在哪里?全球,本地?定义所谓的“transitionIn()”和“transitionOut()”的范围是什么?

我已经看过/阅读了许多关于 AI 和状态机的文章/书籍,但我还没有找到描述它们如何在复杂的 MVC 面向对象项目中实际实现异步/动画转换的内容,其中有 100 多个视图/图形参与行为树。

我应该从最父对象还是从子对象调用转换?

以下是我检查过的一些内容:

虽然这不一定是 AI 问题,但没有其他资源描述如何将嵌套状态架构应用于网站;这些是最接近的东西。

问题的另一种表述方式:如何将状态更改广播到应用程序?你把事件监听器放在哪里?当它被任意嵌套时,你如何找到动画的视图?

注意:我不是在尝试构建游戏,只是在尝试构建动画网站。

0 投票
3 回答
956 浏览

ruby-on-rails - 模型-视图-控制器是否与人工智能和行为树很好地配合?

我来自 MVC 背景(Flex 和 Rails),喜欢代码分离、可重用性、封装等思想。它使快速构建事物和在其他项目中重用组件变得容易。然而,在尝试构建复杂的、状态驱动的、异步的、动画的应用程序时,很难坚持 MVC 原则。

我正在尝试在应用程序中的许多嵌套视图之间创建动画转换,这让我开始思考我是否在误导自己……你能将 MVC 的原理应用到人工智能的原理(行为树、分层状态机)吗? , 嵌套状态),喜欢游戏吗?这两个学科一起玩得好吗?

当事物是静态的(例如 HTML CMS 系统或其他)时,很容易让视图/图形对自身之外的任何事物都一无所知。但是当您开始添加复杂的状态驱动转换时,似乎所有内容都需要了解其他所有内容,而 MVC 几乎会妨碍您。你怎么看?

更新:

一个例子。好吧,现在我正在使用 Flex 开发一个网站。我得出的结论是,为了正确地为应用程序中的每个嵌套元素设置动画,我必须将它们视为 AI 代理。然后,每个“视图”都有自己的行为树。也就是说,它根据上下文执行一个动作(显示和隐藏自己)(选择的数据是什么等)。为了做到这一点,我需要一个 ViewController 类型的东西,我称它为 Presenter。所以我有一个视图(在 MXML 中布局的图形)、一个演示器(定义视图可以根据应用程序的状态和嵌套状态执行的动画和操作)和一个演示模型,用于将数据呈现给视图(通过主持人)。我还有用于值对象的模型和用于处理 URL 和数据库调用等的控制器……所有普通的静态/html 类 MVC 东西。

有一段时间,我试图弄清楚如何构建这些“代理”,以便它们可以响应周围的环境(选择了什么等)。似乎一切都需要了解其他一切。然后我读到了游戏的路径/导航表/列表,并立即认为他们有一个集中存储的表,其中包含每个代理可以采取的所有预先计算的操作。所以这让我想知道他们实际上是如何构建代码的。

所有 3D 视频游戏的东西都是一个大秘密,据我所见,其中很多都是通过图形 UI/编辑器完成的,比如定义行为树。所以我想知道他们是否使用某种 MVC 来构建他们的代理如何响应环境,以及他们如何保持他们的代码模块化和封装。

0 投票
3 回答
308 浏览

artificial-intelligence - 当 NPC 部分随机但受偏好影响时,确定 NPC 将采取什么行动?

我想让游戏中的角色执行部分随机但也受偏好影响的动作。例如,如果一个角色感到生气,他们大喊大叫的机会比讲笑话的机会高。所以我正在考虑如何确定角色将采取的行动。以下是我的想法。

解决方案#1:迭代每一个可能的动作。对每个动作进行随机滚动,然后将偏好值添加到该随机数。具有最高价值的行动是角色采取的行动。

解决方案#2:为一个动作分配一个数字范围,更有可能的动作范围更广。因此,如果随机掷骰结果从 1 到 5 的任意位置返回,则该角色会讲笑话。如果它返回 6-75,他们会大喊大叫。等等。

解决方案#3:将所有动作分组并制作一个分支树。他们会采取友好行动还是敌对行动?随机滚动(添加了偏好值)表示敌对。他们会进行身体攻击还是口头攻击?随机掷骰子说是口头的。继续往下走,直到你到达行动。

解决方案#1 是最简单的,但几乎没有效率。我认为解决方案#3有点复杂,但它不是更有效吗?

有没有人对这个特定问题有更深入的了解?#3 是最好的解决方案吗?有更好的解决方案吗?

0 投票
6 回答
12208 浏览

algorithm - Behavior Tree Implementations

I am looking for behavior tree implementations in any language, I would like to learn more about how they are implemented and used so can roll my own but I could only find one Owyl, unfortunately, it does not contain examples of how it is used.

Any one know any other open source ones that I can browse through the code see some examples of how they are used etc?

EDIT: Behavior tree is the name of the data structure.

0 投票
2 回答
4701 浏览

c# - Treesharp C# 行为树库 - 从哪里开始?

最近我一直在尝试使用apoc 发布的 treesharp 库来实现一个健壮的行为树。我一直在我的书中讨论迭代器和接口,但我什至不知道如何测试,更不用说使用这个库了。接口如何相互连接以及如何用它们实际执行测试/构建树让我感到困惑。

通常在这种情况下,我会寻找代码示例并从查看其他人的工作中获得启发,但是对于这个库,似乎没有任何示例代码。

谁能帮我弄清楚如何开始使用这个库构建行为树?如果这个问题非常无聊(我认为可能是),我很抱歉,但我现在很难理解接口中的枚举器和渐进式接口。

0 投票
3 回答
18536 浏览

c# - 在 C# 中创建 AI 行为树 - 如何?

我正在尝试使用 C# 创建一个“行为树”。

对于任何不知道的人来说,行为树基本上是一个框架,你可以围绕它构建一个 AI。有序列器、选择器、装饰器、复合动作和其他东西。

我找到了一个在 C# 中实现了“行为树”的库,位于此处(http://code.google.com/p/treesharp/),但我无法理解如何实际使用它,因为没有示例代码我可以借鉴。这里的任何人都可以制作一些简单的示例代码来展示如何实际使用这个框架..或者您可能知道在 C# 中实现行为树的另一种方法?

非常感谢!

0 投票
3 回答
1822 浏览

actionscript-3 - 什么设计模式最适合 AS3 中的 RTS 游戏?

我正在寻找一些关于设计模式的好书,我想知道你会为实时战略游戏(如星际争霸)、MVC 推荐哪种特定模式?.

我想在某个时候在 Flash 中制作一个基本的 RTS,我想开始研究最好的模式。

干杯!

0 投票
3 回答
6534 浏览

android - 行为树与状态机

我想实现一个复杂的分支逻辑 Android 业务应用程序,用作营销问卷工具,有很多问题,并根据用户的反应在其中进行分支。我很困惑是将对话逻辑实现为 FSM 还是行为树。作者使用树来实现状态机。例如,在 Ian Millington 等人的人工智能游戏中,作者建议将决策树用于 FSM。但是,我认为 FSM 可以有闭包,例如在“发出警报”和“防御”之间进行转换将使其成为图表而不是树。我的第一个问题是树和状态机有什么区别?第二个是什么对我的应用程序来说是一个好的实现,管理高水平的分支复杂性?

结合决策树和状态机

0 投票
2 回答
3520 浏览

artificial-intelligence - 自上而下的游戏人工智能

我正在创建一个游戏,它要求屏幕上的单位根据团队和每个团队的指定敌人相互战斗。玩家不控制任何坦克或团队。

问题是单位之间的战斗(目前是坦克)应该对玩家来说足够有趣,以至于他们可以在不做任何事情的情况下观看并享受乐趣。

我目前让坦克完全随机移动并在射程内互相射击,但我正在寻找更智能的东西。

我应该研究哪些类型的人工智能和人工智能算法?欢迎所有想法,我只是想让每场战斗都有趣。

0 投票
1 回答
508 浏览

python - 将声明性 DSL 转换为嵌套函数调用

我有一个 python 库,它从嵌套函数调用中构建特殊的迭代器(行为树)。虽然 API 具有相当不错且轻量级的语法(由于它是 python),但它确实可以使用声明性 DSL。

这是我所设想的粗略草图:

DSL(使用 YAML):

将导致以下嵌套函数调用:

我无法准确地想象如何做到这一点。因为 DSL 必须表示一棵树,所以简单的深度优先遍历似乎是合适的。但是为了构建嵌套的函数调用,我必须以某种方式将其翻过来。它可能涉及一些巧妙的中间堆栈或类似的东西,但我不能完全掌握它。执行此转换的正确方法是什么?