我试图为这个问题提出合理的算法:
我们说我们有很多地方。我们知道每对位置之间的距离。每个位置也有一个点。目标是在从起始位置到目的地位置旅行时最大化点数之和,而不超过给定的距离。
这是一个简单的例子: 起始位置:C,目的地:B,给定距离:45
解决方案:C-A-B路线9点
我只是好奇是否存在针对此类问题的某种动态算法。这个问题的最佳方法或最简单方法是什么?
非常感谢任何帮助。
修改:您不得多次访问同一位置。
答案 0 :(得分:6)
编辑:根据新添加的限制,每个节点只能访问一次,问题绝对是NP-hard通过缩减到Hamilton路径:对于一般的无向,未加权的图,设置全部边权重为零,每个顶点权重为1.然后,如果原始图中存在汉密尔顿路径,则最大可达分数为 n 。
因此,研究integer linear programming求解器可能是一个好主意,例如那些并非专门构造为难的家族。
下面的解决方案假设可以多次访问一个顶点,并利用节点权重受常量限制的事实。
设 p(x)为顶点 x 的点值, w(x,y)为边缘的距离权重{x,y}或 w(x,y)=∞如果 x 且 y 不相邻。
如果我们被允许多次访问一个顶点,如果我们可以假设 p(x)&lt; = C 对于某些常量 C ,我们可能会离开具有以下重复:让 f(x,y,P)是我们在收集<时从 x 到 y 所需的最小距离em> P 点。我们有
对于所有P对于所有x
,f(x,x,p(x))= 0
f(x,y,P)= MIN(z,w(x,z)+ f(z,y,P - p(x)))
我们可以使用动态编程来计算 f 。现在我们只需要找到最大的 P ,这样
f(开始,结束,P)&lt; =距离上限
此 P 是解决方案。
这种算法具有天真实现的复杂性是 O(n ^ 4 * C)。如果图形稀疏,我们可以通过使用 MIN 聚合的邻接列表来获得 O(n ^ 2 * m * C)。