我有一个二维点的列表,例如:
1,1 2,2 1,3 4,5 2,1
这些点之间的距离已知(例如使用math.hypot)。我想对列表进行排序,以便它们之间的距离最小。只要点在最短顺序中,我可以接受任何可能的解决方案顺序。
最Pythonic的方法是什么?
我考虑计算任何项与任何其他项之间的距离,并每次选择最小值,但这将是我正在处理的列表上的缓慢算法(1000个项目不会很少见)。
我有一个二维点的列表,例如:
1,1 2,2 1,3 4,5 2,1
import itertools as it
import math
def dist(x,y):
return math.hypot(y[0]-x[0],y[1]-x[1])
paths = [ p for p in it.permutations([(1,2),(2,3),(5,6),(3,4)]) ]
path_distances = [ sum(map(lambda x: dist(x[0],x[1]),zip(p[:-1],p[1:]))) for p in paths ]
min_index = argmin(path_distances)
print paths[min_index], path_distances[min_index]
输出:
((1, 2), (2, 3), (3, 4), (5, 6)) 5.65685424949
这里的另一个答案是正确的,这是一些NP问题的类别。如果您真的需要1000个节点,那么您永远不会真正解决它。但是它需要精确吗?如果不需要,也许您可以尝试仅选择一个随机点,并每次从那里走到最近的点?虽然不能保证给您最短的路径,但也许已经足够接近了。例如:
data [ (1,2), (3,4), ... ]
cur = 0
path = [cur]
totalDist = 0
for i in range(1,len(data)):
dists = [(dist(data[i],p), pi) for (pi,p) in enumerate(data) if pi != i and pi not in path]
nextDist, cur = min(dists)
totalDist += nextDist
path.append(cur)
print path, totalDist