【问题标题】:shortest path tsp algorithm最短路径 tsp 算法
【发布时间】:2016-04-28 00:44:57
【问题描述】:

现在下面是一个字典,我正在尝试找到最短的路径。我们必须根据最短的时间去所有 5 个房子。每个键都是一个房子,每个值列表都是以秒为单位的时间。例如,第一宫的时间为 0,因为很明显,现在从第一宫到第二宫有 74 秒……以此类推。每个索引都是到下一个房子的时间表示。

现在是第二行,以 2 作为键。从第二宫到第一宫是 74 秒,现在从第二宫到第三宫是 4069 秒,如下图所示。

我正在尝试为此找到最佳算法我很困惑我应该使用什么?组合?排列组合?

我们的目标是找到从房子到房子的最短路径,下面的表示和在你找到的最短路径中旅行的所有时间的总和

list = 0, 74 , 2213, 816, 1172 ,

最短路径。

1 -> 2 -> 5 -> 4 -> 3 -> 1 

我们必须再次返回第一个房子,这就是为什么再次显示 1

数字 1 到 5,代表房屋 列表

  1. 遍历每个键,值找到最小值和最小值的索引。将时间添加到 time_list

  2. 使用上一个找到的索引访问下一个主页(键)

  3. 将 min 的索引匹配到下一个 home,在 home 忽略零和 以前的家乡时间已经遇到的时间

【问题讨论】:

  • 这是一个比较有名的问题,被称为旅行商问题。 simple.wikipedia.org/wiki/Travelling_salesman_problem 简而言之,是的,您必须测试所有路径组合才能找到最快的路径。
  • 你为什么不测试 combinationspermutations 实际做了什么,从结果中找出哪个更有意义?

标签: python algorithm


【解决方案1】:

您可以尝试通过跟踪当前房屋和到目前为止访问的所有房屋来减少要检查的路径数量。假设您有路径[1, 2, 3, 4][1, 3, 2, 4],您可以检查哪一个更短,然后继续。这是您提供的数据示例,它将距离存储在二维数组中,而不是 dict,但原理是相同的:

dist = [
    [0, 74, 4109, 3047, 2266], 
    [74, 0, 4069, 2999, 2213],
    [4109, 4069, 0, 1172, 1972], 
    [3047, 2999, 1172, 0, 816], 
    [2266, 2213, 1972, 816, 0]
]

# Helper function to calculate path length
def path_len(path):
    return sum(dist[i][j] for i, j in zip(path, path[1:]))

# Set of all nodes to visit
to_visit = set(xrange(len(dist)))

# Current state {(node, visited_nodes): shortest_path}
state = {(i, frozenset([0, i])): [0, i] for i in xrange(1, len(dist[0]))}

for _ in xrange(len(dist) - 2):
    next_state = {}
    for position, path in state.iteritems():
        current_node, visited = position

        # Check all nodes that haven't been visited so far
        for node in to_visit - visited:
            new_path = path + [node]
            new_pos = (node, frozenset(new_path))

            # Update if (current node, visited) is not in next state or we found shorter path
            if new_pos not in next_state or path_len(new_path) < path_len(next_state[new_pos]):
                next_state[new_pos] = new_path

    state = next_state

# Find the shortest path from possible candidates
shortest = min((path + [0] for path in state.itervalues()), key=path_len)
print 'path: {0}, length: {1}'.format(shortest, path_len(shortest))

它将输出最短路径之一和总距离:

path: [0, 2, 3, 4, 1, 0], length: 8384

请注意,对于您提供的数据,有两种可能的解决方案具有相同的长度:[0, 2, 3, 4, 1, 0][0, 1, 4, 3, 2, 0]

【讨论】:

  • 太棒了,但您能提供任何资源或您可能用来获得此算法的东西吗?\
  • 没用任何资源,想起来也没有那么难。快速谷歌搜索看起来像Held-Karp algorithm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-09
相关资源
最近更新 更多