我正在制作一个基本的DFA(确定性有限自动机)生成器。如果你不知道它是什么,它或多或少是一个基本的状态机。生成节点并系统地链接到另一个节点,其中一些数据在JSON中指定。
为此,我有一个节点字典。保证每个节点都有唯一的ID,因此我使用ID作为密钥,并将节点作为值。
我填充了我的字典,然后从那里开始将每个节点链接到它可以传输到的后续节点(状态)。转换状态具有它开始的节点的ID,以及它结束的节点的ID。每个节点都有一个对节点的引用映射,其中转换为散列值(由于是DFA,它也保证是唯一的)。
问题在于,当我将地图中的一个节点与后续节点链接时,每个其他节点同时也会获得链接!
所以,如果我有节点
[q0] [q1] [q2]
我将q0与q1链接,转换为1,这种情况发生了:
[q0] -> [q1] <- [q2]
↺
我知道我没有碰撞错误。如果我在此处对节点执行任何其他操作,则不会对我的每个其他节点执行操作。
我像这样创建节点字典:
dict_nodes = {}
alphabet = json_values["alphabet"]
for state in json_values["possible_states"]:
dict_nodes[state["state_key"]] = node()
然后像这样链接他们:
for transition in json_values["transitions"]:
lexicon = transition["transition"]
if lexicon not in alphabet:
raise ValueError("Nodes with transitions outside of alphabet are not accepted")
dict_nodes[transition["start_key"]].add_following_state(dict_nodes[transition["end_key"]], lexicon)
节点类如下所示:
class node(object):
""" Following node paths that can be walked and their states """
following_states = {}
""" Determine if node is an accept state or not """
is_accept_state = False
def __init__(self):
pass
def add_following_state(self, new_node, state):
self.following_states[state] = new_node
""" Extra methods omitted """
知道为什么一切都会立即联系起来吗?