Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用回溯算法寻找获得至少x个奖励点数的最快周期_Algorithm_Path_Backtracking - Fatal编程技术网

Algorithm 使用回溯算法寻找获得至少x个奖励点数的最快周期

Algorithm 使用回溯算法寻找获得至少x个奖励点数的最快周期,algorithm,path,backtracking,Algorithm,Path,Backtracking,这是一张有点的地图: 每个点旁边的绿色数字是该点的ID,红色数字是该点的奖励。我必须找到最快的循环,从点1开始和结束,在这种情况下至少获得x 15奖励点。我可以多次使用城市;但是,我只会获得一次奖励积分。 我必须使用回溯算法,但我真的不知道从哪里开始。我对此感到困惑,但我看不出这与回溯之间的联系 输出如下所示: (1,3,5,2,1) (11.813 length) 回溯是一种用于减少问题搜索空间的技术。所以,你有一个问题,你有一个最优和非最优解的空间,你必须选择一个最优解 在你的问题中,一个

这是一张有点的地图:

每个点旁边的绿色数字是该点的ID,红色数字是该点的奖励。我必须找到最快的循环,从点1开始和结束,在这种情况下至少获得x 15奖励点。我可以多次使用城市;但是,我只会获得一次奖励积分。 我必须使用回溯算法,但我真的不知道从哪里开始。我对此感到困惑,但我看不出这与回溯之间的联系

输出如下所示:

(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您可以通过以合理的顺序迭代每个有意义的点来加速程序,例如,首先选择距离当前点最近的点。您可以通过预先计算每个点的所有其他点(按距离升序排列)列表来节省时间,也可以不这样做-您可能需要通过实验尝试不同的方案