路径规划 - 多个目的地

时间:2012-08-23 01:14:00

标签: c++ algorithm path-finding motion-planning

问题在于:

我有一张图G =(V,E)。顶点U <= V的子组和起始顶点s。边缘的重量函数w。

我需要找到通过U中所有顶点的's'的最短路径。

  • 可以近似计算,计算时间和路径长度之间应该有一些平衡。 我需要一种快速算法/启发式算法,它可以为最短路径产生精细的近似值。
  • 这个算法不应该太复杂(在C ++中)。例如,我已经想过一种方法可以将它变成旅行推销员问题,并使用TSP求解器库或使用某种启发式的东西,但找不到任何东西,并且我自己实现启发式也是如此硬。

谢谢高级! =]

2 个答案:

答案 0 :(得分:3)

这是旅行商问题的变体,称为Set TSP问题,或广义TSP。这是维基百科link

上述文章的引用链接到method,用于将广义TSP问题转换为TSP问题,而不会使图中的节点数量增加一倍。

记录保存TSP求解器是免费提供的,称为Concorde,可以从here下载,它可以作为命令行工具运行(可能作为库,不确定)。 / p>

我尝试为游戏RevolvoMan4k创建解算器时遇到了GTSP,只需按下最少的按钮数就可以获得每个级别的所有资金。 (这是一个有趣的游戏,但在50级之后,等级是随机的,所以有些可能是不可能的,需要用'N'跳过。)

答案 1 :(得分:0)

想象一下,你有3个顶点:S,A和B. 现在,假设我们需要找到从S到A和B的最短路径。最简单的方法是找到哪个点更靠近S:A或B.如果你的图形实际上有一些空间数据,你可以使用顶点的坐标来估计这个,否则,您将必须获得从S到每个目的地的最短路径。选择最近的目的地,在这种情况下,让我们说是A,并在那里旅行。现在你唯一剩下的地方是B.计算从A到B的最短路径,然后去那里。

现在,在具有2个以上目的地的情况下,您可以递归地执行此操作。我不知道C ++,但这里有一些可以让你开始的伪代码

function pathThrough(startNode,destinationNodes[])
    closestNode = getClosestNode(startNode,destinationNodes)
    newDestinations = removeFromArray(destinationNodes,closestNode)
    return joinPaths(getShortestPath(startNode,closestNode),pathThrough(closestNode,newDestinations.))

对于nearestNode和getShortestPath函数,你可以使用任何适合你的图形的搜索算法,A *,dijkstra算法,......