首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套子FSM在某些状态下防止父级转换

嵌套子FSM在某些状态下防止父级转换
EN

Stack Overflow用户
提问于 2021-01-20 02:20:47
回答 1查看 139关注 0票数 1

我正在使用pytransitions来创建一个具有许多嵌套子FSM的分层状态机。当子FSM进入临界状态时,我希望在子FSM完成其活动之前抑制父FSM上的转换。我找不到任何关于这种行为的参考例子,希望有人能提供一个实现这一点的最佳方法的建议。

镜像Nested FSM Example提供了一个简单的场景。在这里,父FSM处于运行状态,这有一个子FSM处于顶部状态。此状态本身具有一个子FSM,该子FSM具有off或on状态。我想抑制或忽略第一个子FSM和父FSM上的所有转换,在这种情况下,当子FSM的第二个处于“开”状态时,第一个子FSM上的“向下”转换和父FSM上的“停止”转换。您可以想象,在更复杂的场景中,父状态或子状态可能会有相当多的转换。

你有什么好办法来实现这一点吗?

提前谢谢你,

EN

回答 1

Stack Overflow用户

发布于 2021-01-22 20:05:45

根据我的经验,将转换(或更好的触发器)视为应该根据其当前状态进行处理的事件是一个很好的实践。例如,当您的机器处于init状态时,将不会处理事件stopping,并且根据您的配置,甚至可能引发异常。

因此,与其“抑制”转换,不如将你的用例重新表述为“我的机器在处于running_top_on状态时应该以不同的方式处理事件stopdown”。Pytransitions按以下顺序评估潜在的转换:

仅当所有parents

  • Transitions返回added

  • Transitions且所有conditions回调都返回False

时,才会执行在子状态中定义的

  • 转换,然后才会按照状态中conditions定义的转换顺序对其进行评估

策略一:在running_top中处理down/stop事件,以覆盖父对象中的处理策略。

例如,您可以添加基本上什么也不做的内部转换:

代码语言:javascript
复制
state_config = {
    'name': 'top',
    'children': ['on', 'off'],
    'initial': 'off',
    'transitions': [['begin', 'off', 'on'],
                    ['end', 'on', 'off'],
                    ['down', 'on', None],
                    ['stop', 'on', None]]
    }

但是,您可能希望将回调添加到转换中,以便在指示计算机停止时记录事件,即使计算机处于严重状态。

策略二:在您的转换中引入unless

代码语言:javascript
复制
transitions = [  # ...,
    {'trigger': 'stop', 'source': 'running', 'dest': 'stopping', 'unless': 'is_running_top_on'}

通常,在这种情况下,我们不必编写自定义条件回调,因为我们的模型已经用状态检查功能进行了修饰。

策略3:在泛型转换之前添加处理特殊情况的转换。

代码语言:javascript
复制
transitions = [['start', 'init', 'running'],
               ['stop', 'running_top_on', None],
               ['stop', 'running', 'stopping']]

该图看起来像第一个图,但转换实际上是在根级别上定义的,这意味着只有当子状态尚未处理事件时,才会对其进行评估。这意味着如果我们在这里添加['bottom', 'running_top_up', Nome],当bottom处理在running状态中被定义为['bottom', 'top', 'down']时,它将不会被调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65797252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档