现在我有一个无向图。每条边表示顶点之间的距离。每个顶点都包含一个数字(让我们称之为点数)。我想在使用最小距离时获得最大点数。我对最大距离有约束,因此我不需要到达每个顶点。我可以从任何顶点开始并在任何顶点结束(我不需要回到原点)。
现在我认为通过动态编程可以实现,但我并不完全确定如何设置问题。
非常感谢任何有关如何设置/使用正确算法的帮助!
答案 0 :(得分:0)
我认为一个好方法可能是在图上构建最小生成树。之后你可以选择一个根节点(选择是我自己的算法/启发式算法)并遍历树。然而,这可能不是最佳解决方案,因为我认为问题是NP完成。 或者,您可以尝试搜索TSP(旅行商问题)的解决方案算法,并提取获得最多积分的路径。
答案 1 :(得分:0)
使用recursive function,您可以迭代点,并对第一个点连接的每个点执行相同的功能,依此类推。
pts = [[(1,8), (2,5), (3,6)...]...] //each sublist of points needs to be sorted by the second index in each value contained
paths = []
def Branch(history, distance):
for index, dist in pts[history[-1]][1:tree_branches_per_iteration]: //make the shorter distances go first
if not index in history: //check for repetition
new_distance = distance + dist
if new_distance > limit: //check for distance limit
paths.append((history + [index], new_distance))
else:
Branch(history + [index], new_distance)
else:
paths.append((history, distance))
Branch([0], 0)
此函数调用自身,在所有可能的方向上组装点链(并且不会两次到达同一点),并在到达相同点两次或达到距离限制时终止。
通过基本上制作从每个坐标到彼此的所有距离的矩阵来生成距离。
这种方法使用贪婪的销售人员。
答案 2 :(得分:0)
所以在这次经历之后,我发现你应该研究蚁群算法并将其应用于旅行商问题。您也可以使用修改后的贪婪算法,该方法从随机点开始,并根据给您最佳点的位置选择基于随机双方骰子的下一个位置。然后,您可以进一步修改算法以存储先前的结果并迭代以获得更好的结果。