有限状态机只是马尔可夫链的实现吗?两者有什么不同?
我有工作要做,我需要你的帮助.我们想要实现一个FSM - Finite State Machine,以识别char序列(如:A,B,C,A,C),并告诉它是否被接受.
我们认为,实行三类:State,Event和Machine.该state班提出的一个节点FSM,我们认为有实现它State design pattern,每个节点将抽象类扩展状态和每一个类可以处理不同类型的事件,并指示过渡到一个新的状态.你认为这是个好主意吗?
第二件事,我们不知道如何保存所有过渡.我们再一次考虑用某种方式来实现它,它具有map起点并且在下一个状态下获得某种向量,但我不确定这是一个好主意.
我很乐意得到一些如何实现它的想法,或者你可以给我一些起点.
我应该如何保存FSM,这意味着我应该如何在程序开始时构建树?我用Google搜索并找到了很多例子但没有任何帮助我的东西.
非常感谢.
与此Stack Overflow问题(C状态机设计)相关,Stack Overflow人员可以与我(以及社区)共享您的Python状态机设计技术吗?
目前,我正在寻找基于以下内容的引擎:
class TrackInfoHandler(object):
def __init__(self):
self._state="begin"
self._acc=""
## ================================== Event callbacks
def startElement(self, name, attrs):
self._dispatch(("startElement", name, attrs))
def characters(self, ch):
self._acc+=ch
def endElement(self, name):
self._dispatch(("endElement", self._acc))
self._acc=""
## ===================================
def _missingState(self, _event):
raise HandlerException("missing state(%s)" % self._state)
def _dispatch(self, event):
methodName="st_"+self._state
getattr(self, methodName, self._missingState)(event)
## =================================== State related callbacks
Run Code Online (Sandbox Code Playgroud)
但我确信在利用Python的动态特性(例如动态调度)的同时,还有很多方法可以实现.
我正在接受"引擎"的设计技术,它接收基于机器"状态"的"事件"和"发送".
我在Android应用程序中使用了几个基于枚举的状态机.虽然这些工作非常好,但我正在寻找的是如何优雅地接收事件,通常是从已注册的回调或从事件总线消息接收到当前活动状态的建议.在有关基于枚举的FSM的许多博客和教程中,大多数都提供了使用数据的状态机(例如解析器)的示例,而不是展示如何从事件驱动这些FSM.
我正在使用的典型状态机具有以下形式:
private State mState;
public enum State {
SOME_STATE {
init() {
...
}
process() {
...
}
},
ANOTHER_STATE {
init() {
...
}
process() {
...
}
}
}
...
Run Code Online (Sandbox Code Playgroud)
在我的情况下,一些状态会触发一项特定对象的工作,注册一个监听器.该工作完成后,该对象将异步回调.换句话说,只是一个简单的回调接口.
同样,我有一个EventBus.希望再次通知事件的类实现回调接口以及listen()EventBus上的那些事件类型.
因此,基本问题是状态机或其各个状态,或包含枚举FSM的类,或某些东西必须实现这些回调接口,以便它们可以表示当前状态的事件.
我使用的一种方法是整个enum实现回调接口.枚举本身在底部具有回调方法的默认实现,然后各个状态可以覆盖他们感兴趣的事件的回调方法.为此,每个状态必须在进入和退出时注册和取消注册,否则在不是当前状态的状态下发生回调的风险.如果我找不到更好的东西,我可能会坚持这一点.
另一种方法是包含类来实现回调.然后,它必须通过调用将这些事件委托给状态机mState.process( event ).这意味着我需要枚举事件类型.例如:
enum Events {
SOMETHING_HAPPENED,
...
}
...
onSometingHappened() {
mState.process( SOMETHING_HAPPENED );
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢这样,因为(a)我需要对每个状态中switch的事件类型进行丑陋,并且process(event)(b)传递其他参数看起来很尴尬.
我想建议一个优雅的解决方案,而不需要使用库.
我最近读过有关boost::statechart库(有限状态机)的内容,我很喜欢这个概念.
C#有类似的机制吗?或者可以使用特定的设计模式实现?
使用yield关键字来实现这里所示的简单状态机是否可行.对我来说,看起来C#编译器为您完成了艰苦的工作,因为它在内部实现了状态机以使yield语句有效.
你可以在编译器已经完成的工作之上捎带并让它为你实现大部分状态机吗?
有没有人这样做,技术上可行吗?
我正在寻找一个复杂的图形FSM编辑器,它可以以一个记录良好的输出格式导出模型,如SCXML或类似的.
任何人都可以推荐我一个工具吗?
在开始之前,请注意我正在使用linux shell(using subprocess.call()来自Python),我正在使用openFST.
我一直在筛选有关openFST的文档和问题,但我似乎无法找到这个问题的答案:如何实际为openFST定义的,编译和组合的FST提供输入?输出在哪里?我只是执行'fstproject'吗?如果是这样,我怎么会给它一个字符串来转换,并在达到最终状态时打印各种转换?
如果这个问题显而易见,我道歉.我还不熟悉openFST.
在Stack Overflow播客#36(http://blog.stackoverflow.com/2009/01/podcast-36/)中,有人表达了这样的观点:一旦你理解了设置状态机是多么容易,你就会知道永远不要试图不恰当地使用正则表达式.
我做了很多搜索.我发现了一些学术论文和其他复杂的例子,但我想找一个简单的例子来帮助我理解这个过程.我使用了很多正则表达式,我想确保我永远不再使用"不恰当".