Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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
如何在Java中创建有限状态机_Java_Fsm_State Machine - Fatal编程技术网

如何在Java中创建有限状态机

如何在Java中创建有限状态机,java,fsm,state-machine,Java,Fsm,State Machine,如何编写一个程序来读取FSM的一组状态。输入数据将来自文本文件,格式为(状态输入下一个状态),最后一行是最终状态。例如: s0 a s1 s1 a s2 s2 a s2 s1 程序输出将为: a) FSM生成的字符串列表 b) 该程序可以确定FSM是DFA还是NDFA,并打印结果我不会给你一个编码的解决方案,但有一些思路 首先,FSM需要开始状态和结束状态,所以您缺少重要信息 如果您正在生成一个字符串列表,那么您可能正在处理一个非常

如何编写一个程序来读取FSM的一组状态。输入数据将来自文本文件,格式为(状态输入下一个状态),最后一行是最终状态。例如:

    s0   a   s1
    s1   a   s2 
    s2   a   s2 
    s1 
程序输出将为:

a) FSM生成的字符串列表


b) 该程序可以确定FSM是DFA还是NDFA,并打印结果

我不会给你一个编码的解决方案,但有一些思路

首先,FSM需要开始状态和结束状态,所以您缺少重要信息

如果您正在生成一个字符串列表,那么您可能正在处理一个非常有限的FSM子集,该子集接受有限数量的字符串。因此,尽一切可能是合理的;沿着图形中的每条路径,并在到达结束状态时打印

思考DFSM与NDFSM的区别。如果有多种方法来处理某些输入,那么这是不确定的。因此,在构建图形时,如果有一个节点有两个相同的转换到不同状态,这是不确定的。由于任何非决定论都会使整个系统变得不确定,所以决定论就是完全没有非决定论

所以,您可能想从实际创建表示开始。我想到了两个简单的方法。更直观地说,您可以创建一个图形。最简单的方法是创建一个节点类,然后为每个节点创建一个对象,其中包含一对转换和目标

我更喜欢用哈希映射/字典来表示FSM。使用节点和转换作为键,目标作为值。这使得导航相当容易

祝你好运


编辑:在确定非决定论时,别忘了考虑ε变换(就像我刚才做的那样。:)

这是家庭作业吗?你试过什么?@home要求一个完整的解决方案是不好的,他必须表现出相当的努力。谢谢你的指导。我已经使程序可以浏览输入文件,然后检索数据,并存储在数组中的所有状态和输入。但在那之后,我不知道从哪里开始,也无法理解算法将如何。正如您所知,只要路径达到最终状态,字符串就可以不同。这意味着字符串可以不止一个。如何使程序能够计算呢?我不要求完整的编码,至少请给出一些算法的图片,可以帮助我理解它。递归可能是最简单的。所以,写一个方法,在图中穿行。无论启动状态是什么,都要启动该方法。然后让它找到所有可能的过渡。递归地调用您所在的方法,将每个可能的转换转换到一个新状态。您可能会看到这是如何通过大量递归调用进行分支的,以获取通过FSM的所有可能路径(也称为获取它接受的所有可能字符串)。所以现在你的基本情况是:当你达到一个最终状态。然后你可以打印出到达那里的路径。当你浏览图表时,如果你有两个相同的转换(或者一个epsilon转换到一个相同的转换),你已经确定它是不确定的。