Algorithm 最小化加权和

Algorithm 最小化加权和,algorithm,data-structures,greedy,Algorithm,Data Structures,Greedy,我最近遇到了这个问题。 假设x轴上有n个点,x[0],x[1]。。x[n-1]。 设与这些点中的每个点相关的权重为w[0],w[1]。。w[n-1]。 从0到n-1之间的任何点开始,目标是覆盖所有点,以使w[i]*d[i]之和最小化,其中d[i]是从起点到第i个点所覆盖的距离 示例: 假设这些点是:1 5 10 20 40 假设权重为:1 2 10 50 13 如果我选择从第10点开始,然后移动到第20点,然后移动到第5点,然后移动到第40点,最后移动到第1点,那么加权和将变成10*0+50*(

我最近遇到了这个问题。 假设x轴上有n个点,x[0],x[1]。。x[n-1]。 设与这些点中的每个点相关的权重为w[0],w[1]。。w[n-1]。 从0到n-1之间的任何点开始,目标是覆盖所有点,以使w[i]*d[i]之和最小化,其中d[i]是从起点到第i个点所覆盖的距离

示例:
假设这些点是:1 5 10 20 40
假设权重为:1 2 10 50 13
如果我选择从第10点开始,然后移动到第20点,然后移动到第5点,然后移动到第40点,最后移动到第1点,那么加权和将变成10*0+50*(10)+2*(10+15)+13*(10+15+35)+1*(10+15+35+39)


我尝试用贪婪的方法来解决这个问题,从关联权重最大的点开始,移动到第二个最大权重点,依此类推。但该算法不起作用。有人能告诉我解决这个问题必须采取的方法吗

也许你应该详细说明算法“不起作用”的含义。你所描述的贪婪方法的基本思想对我来说似乎是可行的。你的意思是贪婪的方法不一定会找到最优的解决方案吗?正如评论中所指出的,这可能是一个NP完全问题——尽管可以肯定的是,人们必须对其进行进一步分析:一些动态规划,以及一些用于距离计算的前缀和,也可能导致多项式时间解

我很快用Java实现了贪婪的解决方案(希望我能正确理解一切…)

您描述的贪婪方法给出了

For [3, 4, 2, 1, 0] sum 929.0
最好的解决办法是

For [3, 2, 4, 1, 0] sum 849.0 

我通过检查索引的所有排列(当然,这对于较大的
n
是不可行的)

有一个非常重要的事实导致了多项式时间算法:

由于这些点位于某些轴上,因此它们生成路径图,这意味着对于每3个顶点
v1、v2、v3
,如果
v2
介于
v1
v3
之间,然后
v1
v3
之间的距离等于
v1
v2
之间的距离加上
v2
v3
之间的距离。因此,例如,如果我们从
v1
开始,obj。先到
v2
再到
v3
的路径的函数值将始终小于先到
v3
再回到
v2
的路径值,因为:

第一条路径的值=w[2]*D(v1,v2)+w[3]*(D(v1,v2)+D(v2,v3))

第二条路径的值=w[3]*D(v1,v3)+w[2]*((v1,v3)+D(v3,v2))=w[3]*D(v1,v2)+w[3]*D(v2,v3)+w[2]*(D(v1,v2)+2*D(v3,v2))

如果我们从第二个路径中减去第一个路径值,剩下的是<代码> w(2)*2 *D(v3,v2)< /代码>,等于或大于0,除非考虑到负权重。

所有这一切都意味着,如果我们位于某个点,我们应该考虑的选项总是只有两个:前往左侧最近的未访问点或右侧最近的未访问点

这非常重要,因为它留给我们的是
2^n
可能的路径,而不是
n可能的路径(如旅行推销员问题)

在路径图上求解TSP/最小权重哈密顿路径可以使用动态规划在多项式时间内完成,您应该应用完全相同的方法,但修改计算目标函数的方式


由于您不知道起始顶点,因此必须运行此算法
n
时间,每次都从不同的顶点开始,这意味着运行时间将乘以
n

假设您已完成一个解决方案的一部分,并已行驶了距离D。如果你再走一段距离x,看到一个重量为w的点,你就要付出(D+x)w的代价。如果你再往前走一段距离y,看到一个重量为v的点,它会花费你(D+x+y)v。。如果将所有这些相加,则有一个分量取决于距离D:xw+xv+yv+之后的路径,还有一个分量取决于距离D和需要携带的点的权重之和:D(v+w+…)。但是,依赖于距离D的分量不依赖于除需要访问的点的权重之和之外的任何其他因素,因此它是固定的,从这个意义上讲,它是相同的,不管你走完距离D后走的是什么路

访问我们在访问时经过的点总是有意义的,因此最佳路径将从单个点开始(可能在要访问的点集的边缘,也可能在中心),然后将其扩展到访问点的间隔,然后将其扩展到访问所有点。为了预先计算访问间隔以外所有点的相对成本,我们只需要知道当前位置和间隔的大小,而不是到目前为止行驶的距离

因此,一种昂贵但多项式动态规划方法的状态是当前位置(必须是其中一个点)、当前位置左侧第一个未访问点(如果有)的位置以及当前点右侧第一个未访问点(如果有)的位置。我们最多应该考虑两个点:下一个点:当前点的右边点和当前点的左边点。我们可以通过查看剩余点数较少的州的预计算成本,计算出这两种方案的成本,并将最佳结果存储为该点的最佳可能成本。我们可以在假设达到当前点时D=0的情况下计算这些成本。当我们查找存储成本时,它们也存储在该假设下(但在其当前点D=0,而不是我们的当前点),但我们知道权重之和
For [3, 4, 2, 1, 0] sum 929.0
For [3, 2, 4, 1, 0] sum 849.0