What I'm trying to do is to implement a depth search algorithm on a graph to reach a goal state but i keeping getting a KeyError
. It seemed to be working fine with smaller more simplier graphs but this one isn't working.
#The Graph to Search
graph = {
'state1' : set(['state2','state3','state4']),
'state2' : set(['state5']),
'state5' : set(['state10','state11']),
'state10' : set(['state20']),
'state20' : set(['state34','state35']),
'state11' : set(['state21','state22','state23']),
'state21' : set(['state36','state37']),
'state22' : set(['state38','state39']),
'state23' : set(['state40','state41']),
'state3' : set(['state6','state7','state8']),
'state6' : set(['state12','state13']),
'state12' : set(['state24']),
'state24' : set(['state42','state43']),
'state13' : set(['state25']),
'state25' : set(['state44','state45']),
'state7' : set(['state14','state15']),
'state14' : set(['state26']),
'state26' : set(['state46']), #GOALSTATE
'state15' : set(['state27']),
'state8' : set(['state16','state17']),
'state16' : set(['state28']),
'state17' : set(['state29']),
'state4' : set(['state9']),
'state9' : set(['state18','state19']),
'state18' : set(['state30','state31','state32']),
'state19' : set(['state33'])
}
#Depth First Algorithm
def dfs_paths(graph, start, goal):
stack = [(start, [start])]
while stack:
(vertex, path) = stack.pop()
for next in graph[vertex] - set(path) :
if next == goal:
yield path + [next]
else:[enter image description here][1]
stack.append((next, path + [next]))
#Method Call
list(dfs_paths(graph, 'state1', 'state46'))
As timgeb mentions, there are better ways to do this. But as pkpnd mentions, the reason your code sometimes fails is that some of the path states do not have corresponding keys, so they need to be skipped.
I've made a few other minor changes, like using more modern set
syntax, and not using next
as a variable name because that's a built-in function. I also use the set.difference
method rather than the -
operand form so I don't need to convert the path list to a set.
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']
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.