【发布时间】:2020-01-14 20:24:30
【问题描述】:
我有一组点(用复数值表示),我需要找到通过这些点的最短路径。它看起来有点像旅行推销员问题,但我似乎无法找到(或理解)不在 O(n!) 中的解决方案。我知道如何在 O(n^3)、O(n²) 中计算足够短的解决方案,但我想知道是否有可能拥有最好的解决方案。谢谢 ! 这是我用于“足够短的路径”的代码
def insert(x,liste,taille):
max_add = 10**9
n = len(liste) -1
for i in range(n):
test = abs(liste[i] -x) + abs(liste[i+1] - x) - taille[i]
if test < max_add:
max_add = test
i_max = i
taille[i_max] = abs(liste[i_max]-x)
taille.insert(i_max+1,abs(liste[i_max+1] - x))
liste.insert(i_max+1,x)
def sort(x,i=0):
taille = [0]
tri = [x[i]]*2
for y in x[:i]+x[i+1:]:
inserer(y,tri,taille)
return tri, taille
def the_best(liste):
n = len(liste)
shortest = 10**9
for i in range(n):
a,b = sort(liste,i)
if sum(b) < shortest:
back = a,b
return back
` 当然“the_best”函数在 O(n^3) 中,所以我通常只使用“sort”函数 名为“taille”的列表是这样构建的:
taile[i] = abs(liste[i] - liste[i+1])
列表[-1] = 列表[0]
【问题讨论】:
-
既然您认识到这是旅行商问题,那么您如何期望一个有效的算法能够找到准确的答案?
-
您对问题的解释不完整。如果您需要找到通过点的最短路径,则需要知道点之间的路径长度。与用于的每个点相关联的复数是多少?你不解释。
标签: python-3.x algorithm sorting optimization big-o