问题在于:
我有一张图G =(V,E)。顶点U <= V的子组和起始顶点s。边缘的重量函数w。
我需要找到通过U中所有顶点的's'的最短路径。
谢谢高级! =]
答案 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算法,......