# find all paths from start to goal in graph def search(start, goal, graph): solns = [] generate([start], goal, solns, graph) # collect paths solns.sort(lambda x, y: cmp(len(x), len(y))) # sort by path length return solns def generate(path, goal, solns, graph): state = path[-1] if state == goal: # found goal here solns.append(path) # change solns in-place else: # check all arcs here for arc in graph[state]: # skip cycles on path if arc not in path: generate(path + [arc], goal, solns, graph) if __name__ == '__main__': import gtestfunc gtestfunc.tests(search)
"graph search, using paths stack instead of recursion" def search(start, goal, graph): solns = generate(([start], []), goal, graph) solns.sort(key=lambda x: len(x)) return solns def generate(paths, goal, graph): # returns solns list solns = [] # use a tuple-stack while paths: front, paths = paths # pop the top path state = front[-1] if state == goal: solns.append(front) # goal on this path else: for arc in graph[state]: # add all extensions if arc not in front: paths = (front + [arc]), paths return solns if __name__ == '__main__': import gtestfunc gtestfunc.tests(search)