Algorithm 在不移动点的情况下向最小生成树添加循环?

Algorithm 在不移动点的情况下向最小生成树添加循环?,algorithm,geometry,graph-theory,game-maker-studio-2,game-maker-language,Algorithm,Geometry,Graph Theory,Game Maker Studio 2,Game Maker Language,我正在为一个视频游戏生成一个地牢布局。我已经创建了房间,使用分离控制将它们隔开,并创建了一个完全连接的房间加权无向图。然后我用Prim的算法计算了一个MST,所有的算法都使用GML(GameMaker语言)。我想念Python 我的意图是添加额外的边来重新引入循环,这样玩家就不必总是沿着路径返回,并使布局更有趣。问题是,这些边不能交叉,我宁愿不必移动这些点。有人建议我使用Delaunay三角剖分法,但如果我诚实的话,这完全超出了我的理解范围,在GML中可能不是一个可行的解决方案。我在征求关于算法

我正在为一个视频游戏生成一个地牢布局。我已经创建了房间,使用分离控制将它们隔开,并创建了一个完全连接的房间加权无向图。然后我用Prim的算法计算了一个MST,所有的算法都使用GML(GameMaker语言)。我想念Python

我的意图是添加额外的边来重新引入循环,这样玩家就不必总是沿着路径返回,并使布局更有趣。问题是,这些边不能交叉,我宁愿不必移动这些点。有人建议我使用Delaunay三角剖分法,但如果我诚实的话,这完全超出了我的理解范围,在GML中可能不是一个可行的解决方案。我在征求关于算法的任何建议,我可以使用这些算法来识别我可以添加的与先前创建的边不相交的边

我已经包括了MST的图像(这些线连接到红色标记的角,即使图像显示它们短停)


如果我正确理解了你的问题,那么我们看的更多的是几何问题,而不是图论问题。现有点和线段在二维空间中具有具体位置,并且希望添加不与现有线段相交的新线段

为了检查是否可以连接节点1和节点2这两个节点,可以遍历所有现有边,查看线段node1--node2是否与线段edge.endpoint1--edge.endpoint2相交。检查两条线段是否相交的关键函数可以使用此处找到的任何解决方案来实现:

这需要O(E)时间,看起来像

def canAddEdge(节点1、节点2): 卡纳德=真 对于图形中的边: canAdd=canAdd而非doesIntersect([node1.location(), node2.location(),edge.endpoint1.location(),edge.endpoint2.location()) 你可以得到一个有效边的列表,添加到O(EV^2)中,比如

def getListofValidges(图形):
有效期=[]
对于索引,枚举中的firstEndpointNode(graph.nodes()):
对于graph.nodes()中的secondEndpointNode[索引:]:
如果(canAddEdge(firstEndpointNode,secondEndpointNode)):
append([firstEndpointNode,secondEndpointNode])
返回有效期

当然,每次添加新边后,您都需要重新计算有效边。

此MST是否有根?(是否有一个节点可以说这是开始)?@Yonlif是的,根节点始终是最靠近中心(围绕所有节点的圆)的节点。在节点中添加2个元数据编号如何-首先是距离中心的距离。第二,为每一层(与中心的距离相等)编制索引。而不允许仅在距离中心和连续索引相同的节点之间随机通过。你可以选择多少,但通过这种方式,你可以保证不会有交叉点。