使用python画自动机的图,并得到自动机从初始状态到达终止状态所有可接受序列
class Automaton:
def __init__(self, transitions, start, accepting):
self.transitions = transitions
self.start = start
self.accepting = accepting
def is_accepting(self, state):
return state in self.accepting
def get_next_states(self, state, char):
next_states = []
for s, c, t in self.transitions:
if s == state and c == char:
next_states.append(t)
return next_states
def get_all_sequences(self):
sequences = []
stack = [(self.start, "")]
while stack:
state, seq = stack.pop()
if self.is_accepting(state):
sequences.append(seq)
for char in set(t[1] for t in self.transitions if t[0] == state):
next_states = self.get_next_states(state, char)
for next_state in next_states:
stack.append((next_state, seq + char))
return sequences
def draw(self):
from graphviz import Digraph
dot = Digraph()
dot.node(str(self.start), shape="doublecircle" if self.is_accepting(self.start) else "circle")
for state in self.transitions:
dot.node(str(state[0]), shape="doublecircle" if self.is_accepting(state[0]) else "circle")
dot.node(str(state[2]), shape="doublecircle" if self.is_accepting(state[2]) else "circle")
dot.edge(str(state[0]), str(state[2]), label=state[1])
dot.render("automaton.gv", view=True)
transitions = [(0, 'a', 1), (1, 'b', 2), (1, 'c', 3), (2, 'd', 4), (3, 'e', 4)]
start = 0
accepting = {4}
automaton = Automaton(transitions, start, accepting)
automaton.draw()
sequences = automaton.get_all_sequences()
print("All accepting sequences:", sequences)
结果:
![](https://img-blog.csdnimg.cn/img_convert/0dd379045d6c09ce393cede572de54d3.png)
![](https://img-blog.csdnimg.cn/img_convert/6525c879f6c71107ee9583caea0f0dd5.png)