最短路径程序,Python 2.7

时间:2015-11-20 17:57:22

标签: python python-2.7 path-finding

我正在为我的学校机器人团队做一个项目。我需要找到一种方法来找到起点,三个停车场和一个终点之间的最短路线。这就是我到目前为止所做的:

d = {'A': ['B'], #Block1
         'B': ['R', 'C', 'D', 'E', 'F', 'G', 'X' 'H'],
         'C': ['D', 'E', 'F', 'G', 'X', 'H'],
         'D': ['I', 'Q', 'P', 'O', 'E', 'F', 'G', 'X', 'H'],
         'E': ['F', 'Q', 'G', 'X', 'H'],
         'F': ['Q', 'P', 'G', 'X', 'H'],
         'G': ['Q', 'O', 'I', 'X', 'H'],
         'H': ['V', 'I'],
         'I': ['J', 'K', 'L', 'M', 'N', 'W'],
         'J': ['K', 'L', 'M', 'N', 'W', 'P', 'H', 'G'],
         'K': ['L', 'M', 'N', 'W', 'O', 'P', 'Q', 'f'],
         'L': ['M', 'N', 'W', 'O', 'P', 'Q', 'E'],
         'M': ['N', 'W', 'O', 'T', 'P', 'Q', 'D'],
         'N': ['W', 'O', 'Q', 'C'],
         'O': ['D', 'L', 'K', 'J', 'G'],
         'P': ['G', 'F', 'K', 'L', 'D', 'M', 'Z'],
         'Q': ['N', 'S', 'M', 'D', 'L', 'E', 'K', 'U', 'F', 'J', 'G', 'H'],
         'R': ['B'], #Parking Lot
         'S': ['Q'], #Parking Lot
         'T': ['M'], #Parking Lot
         'U': ['Q'], #Parking Lot
         'V': ['H'], #Parking Lot
         'W': ['A'],
         'X': ['H'], #block2
         'Z': ['Q']}


def find_shortest_path(d, start, end, path=[]):
    path = path + [start]
    if start == end:
        return path
    if not d.has_key(start):
        return None
    shortest = None
    for node in d[start]:
        if node not in path:
            newpath = find_shortest_path(d, node, end, path)
            if newpath:
                if not shortest or len(newpath) < len(shortest):
                    shortest = newpath
    return shortest

x = find_shortest_path

现在,它能够从头到尾绘制一条路径,现在我需要让它停在三个指定的位置。不过,我不知道该怎么做。我可以使用任何帮助,或者如果您有任何改进我的代码的建议。我知道它可能很乱,但我只是需要它才能工作。谢谢!

2 个答案:

答案 0 :(得分:1)

如您所知,如何找到介于两者之间的路 两点,你可以用它来找到从起点到的方式 第一个特定点,然后从那里到下一个等。

如果你不知道访问这三个地点的最佳顺序和 在所有情况下都需要最短的方式,你可以尝试所有3!= 3 * 2 * 1 = 6种组合,然后选择最短的。

答案 1 :(得分:0)

另一个建议是添加一个停靠列表(称之为A)作为输入并运行测试以查看它们是否全部到达,然后继续执行其余的find_shortest_path。一个这样的测试可能是将到达的所需停靠点添加到列表中(称之为B),并在继续执行find_shortest_path()定义的第3行之前检查是否B = A.