Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.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
C# 确保部分连通有向图是强连通的 上下文_C#_Algorithm_Unity3d_Procedural Generation - Fatal编程技术网

C# 确保部分连通有向图是强连通的 上下文

C# 确保部分连通有向图是强连通的 上下文,c#,algorithm,unity3d,procedural-generation,C#,Algorithm,Unity3d,Procedural Generation,我正在使用程序生成构建一个3d游戏。我试图以这样一种方式连接一些预先生成的房间,无论发生什么,玩家都可以到达地图上的任何其他房间。这些房间有“可能的入口点”,必须连接走廊。但是,并非所有入口点都可以从房间内的所有其他入口点到达。例如,可能有一个陷阱,因此底部的玩家将无法通过房间到达顶部,必须找到另一种方法 问题 给定嵌入在3d空间中的一组预先存在的有向图,添加一组总长度最小的(双向)路径,将子图连接到一个较大的图中。如果不能做到这一点(因为这表明这是NP难的),则会使路径尽可能短,以便在短时间内

我正在使用程序生成构建一个3d游戏。我试图以这样一种方式连接一些预先生成的房间,无论发生什么,玩家都可以到达地图上的任何其他房间。这些房间有“可能的入口点”,必须连接走廊。但是,并非所有入口点都可以从房间内的所有其他入口点到达。例如,可能有一个陷阱,因此底部的玩家将无法通过房间到达顶部,必须找到另一种方法

问题 给定嵌入在3d空间中的一组预先存在的有向图,添加一组总长度最小的(双向)路径,将子图连接到一个较大的图中。如果不能做到这一点(因为这表明这是NP难的),则会使路径尽可能短,以便在短时间内进行计算

工作至今 我的最佳解决方案是基于,他创建了所有节点的Delaney三角剖分。我将房间的每个强连接组件(例如,陷阱的顶层和底层)视为单独的节点,并以此为基础构建MST,但这限制了一些更有趣的可能性(例如,必须通过两个单向路径才能回到起点)



有谁知道解决这个问题的更好的方法吗?

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

对于多项式时间内的2-近似解:选择任意根顶点,然后使用计算最小成本根向和叶向生成树状图。返回这些元素的并集。这是一个2-近似,因为每个强连通弧子图都包含一个向根和一个向叶的跨越树状图(尽管不一定具有最小代价)。我现在从你的一个链接中看到基思·兰德尔也有这个想法

您可以实现任意数量的启发式。它们可能工作得很好,但我对它们并不感兴趣。如果你担心他们的行为不好,那么你可以用前面提到的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
最大化和{顶点子集S}y(S)
从属于
对于所有v->w,和{顶点的子集S,v在S中,w不在S}y(S)w中)
对于顶点的所有子集,y(S)>=0

现在我们可以调整TSP的分枝定界解,应该有足够的教程材料。你不必做任何全新的事情;事实上,您可以将重点放在生成子任务约束/变量上,因为梳不等式等不适用于此问题。

也许您可以更好地利用在三维空间建模这一事实。这意味着您可以将问题划分为一组平面图,每个平面图表示不同的楼层。你可以先把每一层建筑成紧密相连的。然后,当您连接楼层(可能只有几个楼梯和陷阱)时,通过删除一些边来扰动解决方案,同时仍然保持整体强连接图。要删除的边的有趣选择可能会导致楼板本身失去强连通性,但在考虑其他楼板时会保持特性。这些被称为桥梁,有一个


如果只计算边,而不计算边的长度,则单独求解平面图(楼层)会将其转换为多个边,而这仍然是NP难的,可以使用。但是,您提到您希望最小化路径的总长度,这使得这成为一个问题。由于它在电路设计中的适用性,人们在这个问题上做了很多工作。存在的近似值可能在最佳值的1.5倍范围内,这可能更适合您的工作:稍微长一点的走廊,而不是一个地方的所有入口。

因此您有两种类型的节点,一个房间和一个走廊,一个定向边表示可达性。。如果您也想在房间内处理可访问性问题,则需要将节点的定义从房间更改为玩家可以堆叠的块,并且可以使用游戏的物理\力学对问题进行建模