我正在寻找以下任务的算法:
我们正在玩以下游戏:在我们面前绘制了一个平面图,例如:
我们可以看到边缘在3个地方相互交叉。我们将移动顶点而不删除任何边缘,因此边缘不再相互交叉。例如对于给定的图形,我们可以通过首先移动顶点E,在以下两个步骤中完成,
然后移动顶点B
这是一个非常简单的例子。给出的平面图可能要复杂得多。
必须转换为
任何人都可以通过反复试验来做到这一点,但在给定任何平面图结构的情况下,需要遵循的一般算法是什么。
欢迎任何提示或解决方案。提前致谢! :)
答案 0 :(得分:2)
如果解决方案的复杂性无关紧要,则存在线性时间算法以找到每个顶点的坐标,使得绘图是直线平面的。不幸的是,它相当复杂;第一步是使用例如Boyer-Myrvold(On the Cutting Edge:Simplified O(n)Planarity by Edge Addition,2004)找到组合平面嵌入,然后通过Chrobak将这种组合嵌入转换为几何嵌入 - Payne(用于在网格上绘制平面图的线性时间算法,1995)。这些算法在Boost Graph Library中实现。
一种更简单的算法,大部分时间都可用于连接良好的图形,例如样本spectral layout。计算eigenvectors的第二个和第三个Laplacian matrix,并将它们用作X和Y坐标。
答案 1 :(得分:0)
如果您对最低成本感兴趣,那么本论文中描述的算法Planarity Testing By Path Addition将找到可能生成所有可能的平面嵌入的排列(在O(|Edges|)
时间和内存中生成包含数据结构的数据结构循环边排序的所有排列,以给出平面嵌入和O(|Edges|)
时间和内存,以便为每个单独的排列生成嵌入)。然后,您可以遍历这些排列并找到最低成本。
如果图形总是最大平面,则这是过度的(因为只有一个可能的循环边缘排序),但您可能仍需要考虑许多可能的外面。
[顺便说一下:第一张图可以重新排列成一次移动中的平面嵌入 - 移动(C)到(A)和(E)之间的中点