正在打开模型库
正在打开模型库
从一点出发走遍所有点再回来,使总路程最短。
这是组合爆炸问题,小规模可精确,大规模用启发式近优。
必须访问所有点并且回到起点时,不要硬套普通最短路。
Python 代码
import itertools, math
pts = [(0, 0), (1, 3), (4, 1), (2, 5)]
def tour_len(order):
s = 0
seq = order + (order[0],)
for i in range(len(order)):
a, b = pts[seq[i]], pts[seq[i + 1]]
s += math.hypot(a[0] - b[0], a[1] - b[1])
return s
best = min(itertools.permutations(range(len(pts))), key=tour_len)
print(best, round(tour_len(best), 3))