Как упоминает Тимгеб, есть лучшие способы сделать это.Но, как упоминает pkpnd, причина того, что ваш код иногда дает сбой, заключается в том, что некоторые состояния пути не имеют соответствующих ключей, поэтому их необходимо пропустить.
Я внес несколько других незначительных изменений, например использование moreсовременный синтаксис set
, не использующий next
в качестве имени переменной, потому что это встроенная функция.Я также использую метод set.difference
вместо формы операнда -
, поэтому мне не нужно преобразовывать список путей в набор.
graph = {
'state1': {'state3', 'state2', 'state4'},
'state2': {'state5'},
'state5': {'state11', 'state10'},
'state10': {'state20'},
'state20': {'state34', 'state35'},
'state11': {'state22', 'state21', 'state23'},
'state21': {'state37', 'state36'},
'state22': {'state39', 'state38'},
'state23': {'state40', 'state41'},
'state3': {'state8', 'state7', 'state6'},
'state6': {'state13', 'state12'},
'state12': {'state24'},
'state24': {'state43', 'state42'},
'state13': {'state25'},
'state25': {'state45', 'state44'},
'state7': {'state14', 'state15'},
'state14': {'state26'},
'state26': {'state46'},
'state15': {'state27'},
'state8': {'state17', 'state16'},
'state16': {'state28'},
'state17': {'state29'},
'state4': {'state9'},
'state9': {'state19', 'state18'},
'state18': {'state30', 'state32', 'state31'},
'state19': {'state33'},
}
#Depth First Algorithm
def dfs_paths(graph, start, goal):
stack = [(start, [start])]
while stack:
vertex, path = stack.pop()
if vertex not in graph:
continue
for nxt in graph[vertex].difference(path):
if nxt == goal:
yield path + [nxt]
else:
stack.append((nxt, path + [nxt]))
for a in dfs_paths(graph, 'state1', 'state46'):
print(a)
output
['state1', 'state3', 'state7', 'state14', 'state26', 'state46']