Algorithm 使用回溯算法寻找获得至少x个奖励点数的最快周期
这是一张有点的地图: 每个点旁边的绿色数字是该点的ID,红色数字是该点的奖励。我必须找到最快的循环,从点1开始和结束,在这种情况下至少获得x 15奖励点。我可以多次使用城市;但是,我只会获得一次奖励积分。 我必须使用回溯算法,但我真的不知道从哪里开始。我对此感到困惑,但我看不出这与回溯之间的联系 输出如下所示:Algorithm 使用回溯算法寻找获得至少x个奖励点数的最快周期,algorithm,path,backtracking,Algorithm,Path,Backtracking,这是一张有点的地图: 每个点旁边的绿色数字是该点的ID,红色数字是该点的奖励。我必须找到最快的循环,从点1开始和结束,在这种情况下至少获得x 15奖励点。我可以多次使用城市;但是,我只会获得一次奖励积分。 我必须使用回溯算法,但我真的不知道从哪里开始。我对此感到困惑,但我看不出这与回溯之间的联系 输出如下所示: (1,3,5,2,1) (11.813 length) 回溯是一种用于减少问题搜索空间的技术。所以,你有一个问题,你有一个最优和非最优解的空间,你必须选择一个最优解 在你的问题中,一个
(1,3,5,2,1) (11.813 length)
回溯是一种用于减少问题搜索空间的技术。所以,你有一个问题,你有一个最优和非最优解的空间,你必须选择一个最优解
在你的问题中,一个简单的策略是生成所有可能的解决方案。然而,该解决方案将遍历整个解决方案空间,并且有时意识到不会找到最佳解决方案
这就是回溯的主要作用:你遍历解决方案的空间,当你到达一个给定的点,你知道如果在同一条路径上继续搜索,将不会得到最佳答案,你可以简单地后悔所采取的步骤,回到遍历中,选择紧跟在你发现无助的步骤之后的步骤
在您的问题中,由于可以多次访问节点,因此我们的想法是为每个顶点维护一个顶点列表,该列表按与列表顶点所有者的距离递减排序
然后,你只需从一个顶点开始,在图上逐点行走,始终检查目标是否仍然可以实现,当发现某一点上不可能有解决方案时,在解决方案中进行回溯。您可以使用递归回溯算法列出所有可能的循环,并保留最佳答案:
visitCycles(list<Int> cycleSoFar)
{
if cycle formed by closing (cycleSoFar) > best answer so far
{
best answer so far = cycle formed by closing (cycleSoFar)
}
if (cannot improve (cycleSoFar))
{
return
}
for each point that makes sense
{
add point to cycleSoFar
visitCycles(cycleSoFar)
remove point from cycleSoFar
}
}
要添加更多细节,请执行以下操作:
1除非至少有15个积分,否则一个周期是不好的。如果它是好的,那么它比目前最好的答案短一些要好
2当你给一个循环增加更多的点数时,你只会使它变长,而不是变短。因此,如果您已经找到了一个可能的答案,并且cycleSoFar已经至少与该可能的答案一样长,那么您无法改进它,您最好返回
3由于重复使用循环中已有的积分不会获得任何额外积分,因此尝试两次添加积分是没有意义的
4您可以通过以合理的顺序迭代每个有意义的点来加速程序,例如,首先选择距离当前点最近的点。您可以通过预先计算每个点的所有其他点(按距离升序排列)列表来节省时间,也可以不这样做-您可能需要通过实验尝试不同的方案