给出起始节点的所有边缘的算法

时间:2013-09-13 20:00:38

标签: algorithm graph path shortest-path edges

我正在与一位朋友一起开发一款游戏算法,但我们陷入困境。目前,我们有一个循环无向图,我们试图从起始节点S找到覆盖每个边缘的最快路径。我们不是在寻找旅游,而且可能会有重复的边缘。

关于算法或近似的任何想法?我确定这个问题是NP难的,但我不相信它是TSP。

3 个答案:

答案 0 :(得分:4)

路线检查

这被称为route inspection problem,它确实有多项式解决方案。

基本思想(参见链接了解更多细节)是很容易解决欧拉路径(我们访问每个边缘一次),但欧拉路径只能用于某些图形。

特别是,图形必须连接并且具有奇数度的0或2个顶点。

但是,可以通过以最便宜的方式添加额外的边来将其推广到其他图,这将产生具有欧拉路径的图。 (请注意,我们添加了更多边缘,因此我们可能会在原始图形的边缘上多次移动。)

选择添加附加边的最佳方法的方法是可以在O(n ^ 3)中解决的最大匹配问题。

P.S。

我在今天早些时候写了一个简单的演示(link to game)来解决平面最大割问题。对此的解决方案基于完全相同的路由检查问题:)

修改

我刚从评论中发现,在您的特定情况下,您的图表可能是一棵树。

如果是这样,那么我相信答案要简单得多,因为你只需要在树上做一个DFS,确保首先访问最浅的子树。

例如,假设您的树具有边S-> A和S-> A-> B。 S有两个子树,你应该首先访问A,因为它较浅。

访问的总边数将等于在完整DFS中访问的边数减去最后一次访问的叶的深度,这就是为什么要最小化要最大化最后一个叶的深度的总边数,从而访问最浅的子树首先。

答案 1 :(得分:0)

这有点像Eulerian Path。主要区别在于可能存在死胡同,您可以修改算法以满足您的需求。修剪死角是一种选择,或者您可以将图形缩减为多个连接的组件。

答案 2 :(得分:0)

DFS将在这里工作。但是,您必须具有良好的评估功能,以便尽早修剪分支。否则你无法快速解决这个问题。您可以在http://www.capacode.com/?p=650

中参考我在Java中的讨论和实现

我的评估功能的详细信息 我的第一次尝试是,如果当前路径的长度加上从U到G的距离不短于我们发现的最小长度(存储在minLength变量中),我们将不会访问U,因为它不能引导更短的路径。 / p>

实际上,上述评估功能效率不高,因为它只在我们访问过大多数城市时才有效。我们需要计算更精确的最小长度,以便在访问过所有城市时达到G.

假设s是从S到U的长度,从U到访问G并通过所有城市,长度至少是s'= s +ΣminDistance(K)其中K是未访问的城市并且与U不同; minDistance(K)是从K到未访问状态的最小距离。基本上,对于每个未访问的州,我们假设我们可以以最短的边缘到达那个城市。请注意,那些最短边可能不构成有效路径。然后,如果s'≥minLength,我们将不会访问U.

使用该评估功能,我的程序可以在1秒内处理20个城市的问题。我还添加了另一个优化,以提高性能。在运行程序之前,我使用贪婪算法为minLength获得一个好的值。具体来说,对于每个城市,我们将访问最近的城市。原因是当我们有一个较小的minLength时,我们可以修剪更多。