如何在Java中创建有限状态机
如何编写一个程序来读取FSM的一组状态。输入数据将来自文本文件,格式为(状态输入下一个状态),最后一行是最终状态。例如:如何在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需要开始状态和结束状态,所以您缺少重要信息 如果您正在生成一个字符串列表,那么您可能正在处理一个非常
s0 a s1
s1 a s2
s2 a s2
s1
程序输出将为:
a) FSM生成的字符串列表
b) 该程序可以确定FSM是DFA还是NDFA,并打印结果我不会给你一个编码的解决方案,但有一些思路 首先,FSM需要开始状态和结束状态,所以您缺少重要信息 如果您正在生成一个字符串列表,那么您可能正在处理一个非常有限的FSM子集,该子集接受有限数量的字符串。因此,尽一切可能是合理的;沿着图形中的每条路径,并在到达结束状态时打印 思考DFSM与NDFSM的区别。如果有多种方法来处理某些输入,那么这是不确定的。因此,在构建图形时,如果有一个节点有两个相同的转换到不同状态,这是不确定的。由于任何非决定论都会使整个系统变得不确定,所以决定论就是完全没有非决定论 所以,您可能想从实际创建表示开始。我想到了两个简单的方法。更直观地说,您可以创建一个图形。最简单的方法是创建一个节点类,然后为每个节点创建一个对象,其中包含一对转换和目标 我更喜欢用哈希映射/字典来表示FSM。使用节点和转换作为键,目标作为值。这使得导航相当容易 祝你好运
编辑:在确定非决定论时,别忘了考虑ε变换(就像我刚才做的那样。:)这是家庭作业吗?你试过什么?@home要求一个完整的解决方案是不好的,他必须表现出相当的努力。谢谢你的指导。我已经使程序可以浏览输入文件,然后检索数据,并存储在数组中的所有状态和输入。但在那之后,我不知道从哪里开始,也无法理解算法将如何。正如您所知,只要路径达到最终状态,字符串就可以不同。这意味着字符串可以不止一个。如何使程序能够计算呢?我不要求完整的编码,至少请给出一些算法的图片,可以帮助我理解它。递归可能是最简单的。所以,写一个方法,在图中穿行。无论启动状态是什么,都要启动该方法。然后让它找到所有可能的过渡。递归地调用您所在的方法,将每个可能的转换转换到一个新状态。您可能会看到这是如何通过大量递归调用进行分支的,以获取通过FSM的所有可能路径(也称为获取它接受的所有可能字符串)。所以现在你的基本情况是:当你达到一个最终状态。然后你可以打印出到达那里的路径。当你浏览图表时,如果你有两个相同的转换(或者一个epsilon转换到一个相同的转换),你已经确定它是不确定的。