【发布时间】:2016-01-02 02:25:06
【问题描述】:
我试图在 Python 中从头开始编写一个蛮力算法,以解决加权完整图的最短哈密顿路径问题,如下所示:
def min_route(cities, distances):
"""Finds the Shortest Hamiltonian Path for a weighted complete graph.
Args:
cities (list of string):
The vertices of the graph.
distances (dict):
The distances between any two cities. Maps each origin city to a
dictionary that maps destination cities to distances, sort of like
an adjacency matrix. Type: Dict<string, Dict<string, int>>.
Returns:
(list of string, int):
The list of cities in the optimal route and its length.
"""
if len(cities) < 2:
return cities, 0
best_route, min_dist = None, float('inf')
for i in range(len(cities)):
first, rest = cities[i], cities[:i] + cities[i+1:]
sub_route, sub_dist = min_route(rest, distances)
route = [first] + sub_route
dist = sub_dist + distances[first][sub_route[0]]
if dist < min_dist:
best_route, min_dist = route, dist
return best_route, min_dist
事实证明,这个算法不起作用,而且它对初始城市列表的顺序很敏感。这让我很困惑,因为我认为它会枚举所有n! 可能的城市排列,其中n 是城市的数量。似乎我太早地修剪了一些路线;相反,我应该这样做:
def min_route_length(cities, distances):
routes = get_a_list_of_all_permutations_of(cities)
return min(compute_route_length(route, distances) for route in routes)
问题:有什么简单的反例可以说明为什么我的算法不是最优的?
跟进:我的次优算法是否至少是某种使用某种贪婪启发式的近似算法?还是真的只是一个糟糕的
O(n!)算法?
【问题讨论】:
标签: python algorithm greedy traveling-salesman