Arrays 排序数组中的最小代价路径
给定排序数组Arrays 排序数组中的最小代价路径,arrays,algorithm,traveling-salesman,Arrays,Algorithm,Traveling Salesman,给定排序数组a,例如{4,9,10,11,19}。从i->j移动的成本是abs(A[j]-A[i])。从给定元素开始,例如10。找出成本最低的路径,而无需访问同一元素两次。因此,在这个示例中,解决方案是10->9->4->11->19,即1+5+7+8=21 我试图用最近邻法解决这个问题 i = start; While (array is not empty) ldiff = A[i] - A[i-1] rdiff = A[i+1] - A[i] (ldiff &l
a
,例如{4,9,10,11,19}
。从i->j
移动的成本是abs(A[j]-A[i])
。从给定元素开始,例如10
。找出成本最低的路径,而无需访问同一元素两次。因此,在这个示例中,解决方案是10->9->4->11->19
,即1+5+7+8=21
我试图用最近邻法解决这个问题
i = start;
While (array is not empty)
ldiff = A[i] - A[i-1]
rdiff = A[i+1] - A[i]
(ldiff < rdiff) ? sum += ldiff : sum += rdiff
remove A[i]
i=start;
While(数组不是空的)
ldiff=A[i]-A[i-1]
rdiff=A[i+1]-A[i]
(ldiff
这种解决方案并非在所有情况下都有效。我已经意识到这是TSP问题。解决这个问题的最佳方法是什么?我应该使用像赫里斯托菲德这样的TSP启发式算法还是其他算法?对于您的情况,最小成本是21,请参阅
10->9->4->11->19 ==> 1 + 5 + 7 + 8 = 21.
我认为,对于一般情况,若你们从第I位开始,最小的成本是路径,最小的
A[i]->A[i-1]-> ...->A[1] -> A[i+1] -> A[i+2] -> ...->A[n] and
A[i]->A[i+1]-> ... ->A[n] ->A[i-1] ->A[i-2] -> ...->A[1]
处理较小或最大的元素,这取决于哪个元素更接近起始元素(在值上,而不是索引上),然后简单地处理右侧或左侧的剩余元素(取决于我们处理的是最小的还是最大的元素) 因此,给定从
10
开始的4,9,10,11,19
:
从10
到最小元素4
的距离是6,从10
到最大元素19
的距离是9,因此移动到4
然后按排序顺序处理剩余的元素-9、11、19
这给了我们10->4->9->11->19
,成本6+5+2+8=21
这可以在O(n)
中完成
注意:
值得注意的是,只要我们先向最近的一侧移动,然后再向另一侧移动(无论何时处理哪些元素,只要我们不多次改变方向),我们就会得到最佳结果
这就是为什么
10->9->4->11->19
也给出了21
一种低效的方法是使用递归,因为在每一步中,有两种可能性(去左边或右边最近的邻居)~2^N种可能性。@AbhishekBansal是的,这是我试图实现的,但效率非常低。我想知道是否可以用一些好的方法来解决这个问题。为什么成本为-6的解决方案10->19->11->9->4不是最低成本(或者比示例解决方案更好)?@chill假设成本为正。编辑文章。10->11->9->4->19
中的第三个术语不应该是1+2+5
?另外,你的第二部分是一个完全不同的问题,可能最好为此发布一个新问题。这种方法应该有效,因为这是TSP的一个特例,所有城市都在一条直线上。我想这在我的情况下应该有效。然而,它却让我的思绪变得更加嘈杂。谢谢。我接受这个,因为它回答了我问题的第一部分。谢谢