问题标签 [state-machine]

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 投票
4 回答
2514 浏览

java - Java中的线程状态机

有没有办法让线程处于等待更改的状态?我的意思是等待某些事情发生(更改 var、调用方法等),也许它需要使用事件侦听器或同步对象/方法。

像这样的状态机的常用方法

状态机示例

这使用了一个 do{..}while(true) 循环,它可以用于单线程(并且没有 GUI)应用程序,但它不能与线程一起使用..(至少你想为每个线程状态机使用一个核心)

因此,为了避免处理器消耗任务,一种简单(且丑陋)的方式是“定期检查器”,我的意思是添加一个 Sleep 其他想法是定义一个同步对象并使用等待而不是线程 Sleep

例子:

缺点是使用同步增加了复杂性,或者在 TIME_CONST 内发生的任何事情都是不可见的

我想知道这样做的其他想法,谢谢!

0 投票
6 回答
16703 浏览

java - 涉及 N 个状态和它们之间的转换的设计模式问题

我手头有一个问题,我不知道要使用哪种设计模式。问题是这样的:

我必须构建一个具有“N”个状态的系统,并且我的系统必须根据某些条件从任何状态转换到任何其他状态。例如:在条件 1 下,从状态 1 移动到 3,在条件 2 下从状态 1 移动到 4。

甚至从一种状态到另一种状态的转换也可以在 2 个或更多不同的条件下完成。

例如,从状态 1 到状态 3 的转换可以在以下情况下完成:
条件 1:“星期天”
条件 2:“下雨”
条件 3:“下雨和星期天”
在每个条件下,状态 3 的处理可以是不同的。

我希望我能够清楚地理解这个问题。请帮忙。

非常感谢

0 投票
1 回答
142 浏览

c# - 在 HandleExternalEventActivity 中获取已处理的事件实例

我有状态机,一些状态由 HandleExternalEventActivity 拥有。它接受一些带有简单字符串标志的事件。基于这个字符串,我需要调度必须激活下一个状态。最明显的是使用 IfElseActivity,但我不知道如何从 IfElse 获取此字符串。将属性放置在整个状态机上的最简单方法,但出于某种原因我想避免。

0 投票
2 回答
1307 浏览

ruby - 为无限流封装(纯 Ruby)Ragel 解析器?

我想使用 Ragel 使用状态机解析连续的字节流(来自套接字)

但是,我发现的所有示例要么一次性解析完整文件(如Gherkin 词法分析器,要么使用 Ragels C Target(如mongrel HTTP1.1 Parser

我正在寻找一些关于如何实例化 Ragel 状态机然后向其添加字节以保持现有状态完整的建议或示例。

我正在寻找的最终界面类似于:

非常感谢有关如何在 Ragel 中执行此操作的任何建议。我宁愿使用它,也不愿手动编写另一个状态机。

也许 Ragel 不是正确的工具?如果不是:我应该改用什么?

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 投票
12 回答
52486 浏览

python - Python 状态机设计

这个 Stack Overflow 问题(C 状态机设计)相关,Stack Overflow 的人能否与我(和社区)分享您的 Python 状态机设计技术?

目前,我正在寻找基于以下内容的引擎:

但我确信在利用 Python 的动态特性(例如动态调度)的同时,有很多方法可以解决这个问题。

我追求的是“引擎”的设计技术,它接收“事件”和“调度”,而不是基于机器“状态”的那些。

0 投票
1 回答
1269 浏览

vb.net - 状态机工作流程 - VB.NET

我正在 vb.net 中创建一个非常简单的状态机类库项目。这只有 3 个状态 - CreateApplication、ProcessApplication 和 CompleteApplication。我在同一个项目中创建了一个接口。我通过调用 ApplicationService.CreateApplication(obj of ApplicationDetail) 从 Web 应用程序调用它

我在 ApplicationService.vb 中也有它的实现

我的问题是,当我尝试运行它时,我得到了 workflowInstance 的值。InstanceId 为空。

自过去 2 天以来,我一直在尝试解决此问题。有人可以帮忙吗。

提前致谢!

0 投票
1 回答
48 浏览

algorithm - 及时使用和分析集合数据的方法

我正在为一个画廊设计一个交互式装置,我将在其中接收输入,告诉我 8 个输入传感器中的哪一个已被桥接。例如,如果有人触摸了 1 号条,我将能够检测到。为方便起见,我们将其记为 {1}。如果他们同时触摸 1 和 2,我将能够检测到该连接,我们称之为 {1-2}。如果一个人触摸条带 1 和 2,另一个人触摸条带 3 和 5,我可以检测到状态 {1-2, 3-5}。

在这些连接列表中,集合之间的任何重叠只会创建集合的并集,即。{1-2, 2-3} 永远无法检测到,相反我会看到 {1-2-3}。

我的工作是编写代码,使事件响应这些条件而发生。我将轮询输入并获取触摸条组的列表,然后...

所以我的问题是——像这样的子集列表有什么有趣的属性?我可以观察什么样的模式?枚举可能的连接组列表的公式是什么?我对这些数据属性的了解越丰富,我就越能将其映射到有趣和适当的事件。映射可以是无记忆的(即,对于给定的输入状态是确定性的),或者它可以回复序列,甚至是序列的时序。我有一些方向的线索,但我希望一些对算法和序列有更多了解的人能够在这里给我一些指示。

0 投票
4 回答
1590 浏览

.net-4.0 - 在 Windows Workflow Foundation 3.5 中创建的状态机是否与 4.0 版兼容?

如果我在 3.5 版中创建了状态机,我能否升级到 .NET/ Windows Workflow Foundation 4.0,还是必须重新创建功能?我听说/读到 4.0 不支持状态机。最后,如果您在 3.5 中有状态机,那么您迁移到 4.0 的计划是什么?