简体   繁体   中英

KeyError when searching the graph using DFS

这是我要实现为图形的照片

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM