确保部分连通有向图是强连通的

11

背景

我正在使用程序生成构建一个3D游戏。我试图以这样的方式连接一些预先生成的房间,以便无论如何,玩家都可以到达地图中的任何其他房间。房间有“可能的入口点”,连接走廊必须附加到这些点上。然而,并非所有入口点都可以从房间内的所有其他入口点到达。例如,可能会有一个陷阱,因此位于底部的玩家将无法穿过房间到达顶部,必须找到另一种绕路的方法。

问题

给定嵌入在3D空间中的一组预先存在的有向图,添加一组最小总长度的(双向)路径,将子图连接成一个更大的图。如果失败(因为某些研究表明这是NP-Hard),则使路径尽可能短,以在短时间内计算出来。

已完成工作

我的最佳解决方案基于这篇过程生成文章,其中他创建了所有节点的Delaney Triangulation。我将房间的每个强连通分量(例如陷阱坑的顶层和底层)视为单独的节点,并基于此构建MST,但这限制了一些更有趣的可能性(例如,必须通过两个1方向路径才能回到起点)。

有没有人知道解决这个问题的更好方法?


所以你有两种类型的节点,一个是房间,一个是走廊,有向边表示可达性...如果你想在房间内也处理可达性,你需要将节点的定义从房间更改为玩家可以堆叠的块,并且问题可以用游戏的物理/机械模拟来建模。 - Khaled.K
2个回答

1
也许你可以更好地利用建模三维空间的事实。这意味着你可以将问题划分为一组平面图,每个平面图代表一个不同的楼层。你可以从构建每个楼层开始,使其成为强连通的。然后,在连接楼层时(可能只需要几个楼梯和陷阱),通过移除一些边来扰动解决方案,同时仍然保持整体上的强连通图。有趣的边缘选择是那些会导致该楼层本身失去强连通性但在考虑其他楼层时仍然保持属性的边缘。这些被称为桥梁,有一个线性算法来找到它们
如果只计算边而不考虑它们的长度,解决平面图(地板)的难题将转化为多个欧几里得斯坦纳树问题,虽然仍然是NP难问题,但可以使用近似最优的多项式时间逼近方案来解决。然而,您提到您想要最小化路径的总长度,这使得这成为一个直角斯坦纳树问题。由于其在电路设计中的适用性,已经进行了许多研究。存在可以接近最优解1.5倍的逼近算法,这可能对您的需求更有效:略长一些的走廊,而不是所有入口都在同一处。

0

这个问题的嵌入部分让它变得非常混乱,所以我假设我们估计连接成本以获得一个有向图,其中我们想要一个最小成本的强连通弧子图。然后使用贪心算法找到一个嵌入。

对于多项式时间内的2近似解:选择任意根节点,然后使用由Chu-Liu和Edmonds提出的算法计算最小成本的根向和叶向生成树。返回它们的并集。这是一个2近似解,因为每个强连通弧子图都包含根向和叶向生成树(虽然不一定是最小成本的)。我现在从你的链接中看到Keith Randall也有这个想法。

你可以实现任意数量的启发式算法。它们可能表现得很好,但对我来说并不真正感兴趣。如果你担心它们表现不佳,那么你可以用前面提到的2近似解作为备选方案。

如果你真的想要最优解,那么你最好的选择可能是整数规划。作为整数规划问题,这个问题与TSP有些相似。TSP的程序如下。

minimize sum_{v -> w} cost(v -> w) x(v -> w)
subject to
(-) for all v, sum_{v -> w} x(v -> w) = 1
(-) for all w, sum_{v -> w} x(v -> w) = 1
for all subsets S of vertices, sum_{v -> w, v in S, w not in S} x(v -> w) >= 1
for all v -> w, x(v -> w) >= 0

针对您的问题程序,我们会舍弃标记为(-)的约束条件,该条件会强制所选择的弧形成一条旅行线路。
minimize sum_{v -> w} cost(v -> w) x(v -> w)
subject to
for all subsets S of vertices, sum_{v -> w, v in S, w not in S} x(v -> w) >= 1
for all v -> w, x(v -> w) >= 0

这个程序的对偶如下。

maximize sum_{subsets S of vertices} y(S)
subject to
for all v -> w, sum_{subsets S of vertices, v in S, w not in S} y(S) <= cost(v -> w)
for all subsets S of vertices, y(S) >= 0

现在我们可以为TSP调整分支定界算法的解决方案,有很多教程材料可以使用。你不必做任何根本上的新事物;实际上,你可以将重点放在生成子环约束/变量上,因为组合不等式之类的方法并不适用于这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接