Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何存储复杂的状态机_Python_Graph_Decision Tree_Dsl - Fatal编程技术网

Python 如何存储复杂的状态机

Python 如何存储复杂的状态机,python,graph,decision-tree,dsl,Python,Graph,Decision Tree,Dsl,我有一个相当复杂的状态机,需要用Python实现。到目前为止,我所尝试的一切都非常混乱,有一百万个循环和if语句。我有大约100个节点,每个节点可以有多个传入和传出弧 首先,我已经有了状态机的设计,这不是需要学习的东西。其次,我不想使用任何像scikit-learn这样的软件包。显然,pandas和numpy都很好,但我想用Python勾勒出这一点,然后将其引入C#,所以它不能太依赖Python包 我也尝试过使用图,但感觉不太对,因为有循环,遍历算法依赖于决策,而不是成本。我也在考虑写一种特定领

我有一个相当复杂的状态机,需要用Python实现。到目前为止,我所尝试的一切都非常混乱,有一百万个循环和
if
语句。我有大约100个节点,每个节点可以有多个传入和传出弧

首先,我已经有了状态机的设计,这不是需要学习的东西。其次,我不想使用任何像
scikit-learn
这样的软件包。显然,
pandas
numpy
都很好,但我想用Python勾勒出这一点,然后将其引入C#,所以它不能太依赖Python包

我也尝试过使用图,但感觉不太对,因为有循环,遍历算法依赖于决策,而不是成本。我也在考虑写一种特定领域的语言,但在我投入大量时间之前,我想确定我已经做了一些研究

用于存储状态机的典型数据结构是什么?它需要能够解释周期和汇。DSL是一种发展方向吗?如果有,你有什么建议吗

谢谢

p、 它看起来像这样。


来源:

状态机最简单的表示形式是图形

在大多数语言中,可以使用其索引表示状态的数组,其元素是到其他状态的转换列表。将人类可读的状态名称与每个索引关联以支持调试通常是很方便的。转换需要两部分:转换条件和目标状态号

我们通过命名所需的图构造函数和元素,在python中设计了一个“内部”DSL。我们可以定义一个状态机(请原谅我的Python,我不是专家):

我们可以构造一个状态机来识别典型的标识符名称(与regexp“[a-Z][a-Z0-9]*”)相同:

运行状态机很容易。我们首先将当前_状态设置为状态机的初始状态:

     current_state = "ScanFirstIdentifierCharacter"
然后给定一个输入字符:

     character = ...
我们在状态机中定位当前的_状态,然后处理转换,寻找满足于更改当前_状态的转换:

     for s in StateMachine.states   // find the actual state matching current_state
         if s.name == current_state
            state = s
            break
     for t in state.transitions // process all transitions (assumed mutually exclusive)
          if t.condition(character)
             current_state=t.target
             break  // adding this line means "take the first valid transition"
您可以在定义状态机后运行一个小“编译器”,用数组索引替换文本状态名,从而提高效率。然后,状态查找可以是直接数组索引

如果解释此状态机的速度不够快,则可以将各个状态编译为等效的目标语言代码并导入该代码。如果操作得当,这实际上会产生非常快的状态机

[注:在我完成回答后,作者在他的问题中添加了一个流程图示例。我让他用状态机符号转换他的流程图]

OP最初提出的与决策树相关的问题引发了另一个考虑:转换谓词是如何存储的?在我这里的版本中,它们是“不透明”的Python lambda,可以满足一些需求。 如果OP希望以非不透明的方式存储复杂的转换谓词,
他需要“transition”字段包含一个抽象语法树,表示感兴趣的布尔条件。有关如何解析(布尔)和执行布尔表达式的详细信息,请参见

决策树通常指的是其他内容(作为一棵树,它的定义不会包含循环)。如果你把它改成“状态机”,你会更幸运。谢谢!我将继续提问,并将其重新表述为“状态机”。这是一个“状态机”的糟糕示例:它似乎只有两个(红色)状态,除非OP打算将方形框也用作状态。有很多条件,但这意味着状态之间的转换有复杂的谓词。这就留下了一个悬而未决的问题:OP是想明确地建模转换的结构(例如,作为一个抽象语法树),还是愿意将这些转换作为不透明的谓词。橙色框是bird做出的决定或动作,这些决定或动作也会影响bird的状态更新。这股水流也会根据鸟类的行为来显示其行为的结果。这就是我所了解的哇,谢谢你的详尽回答!我没有这样想过,所以defs会继续使用这种方法吗
     character = ...
     for s in StateMachine.states   // find the actual state matching current_state
         if s.name == current_state
            state = s
            break
     for t in state.transitions // process all transitions (assumed mutually exclusive)
          if t.condition(character)
             current_state=t.target
             break  // adding this line means "take the first valid transition"