# 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)
示例#2
0
"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)