【问题标题】:Algorithm for a planar graph game平面图游戏的算法
【发布时间】:2014-08-26 18:02:44
【问题描述】:

我正在寻找以下任务的算法:

我们正在玩以下游戏:在我们面前绘制了一个平面图,例如

我们可以看到边在 3 个地方相交。我们将在不删除任何边的情况下移动顶点,以使边不再相互交叉。例如对于给定的图,我们可以通过以下两个步骤来完成,首先移动顶点 E,

然后通过移动顶点B

这是一个非常简单的例子。给出的平面图可能要复杂得多。

必须转换为

任何人都可以通过反复试验来做到这一点,但是在给定任何平面图结构的情况下,需要遵循的一般算法是什么。

欢迎任何形式的提示或解决方案。提前致谢! :)

【问题讨论】:

  • @SteveBennett 我不相信这是重复的。在这个问题中,移动节点是有代价的,因此找到一种减少边缘交叉的方法通常不一定是解决这个问题的正确方法。
  • @templatetypedef 同意没有一步一步的解决方案。
  • 同意,这应该已经发布在程序员上。不幸的是,它不是,现在已经在这里回答并接受了答案。不鼓励在这种情况下交叉发帖
  • 顺便说一句,我玩过这个游戏。疯狂的节点,或者类似的东西?

标签: algorithm planar-graph


【解决方案1】:

如果解决方案的复杂性无关紧要,则存在一种线性时间算法来查找每个顶点的坐标,从而使绘图是直线平面。不幸的是,它相当复杂。第一步是使用例如 Boyer--Myrvold (On the Cutting Edge: Simplified O(n) Planarity by Edge Addition, 2004) 找到组合平面嵌入,然后通过 Chrobak 将该组合嵌入转换为几何嵌入—— Payne(用于在网格上绘制平面图的线性时间算法,1995 年)。这些算法在 Boost Graph Library 中实现。

spectral layout 是一种更简单的算法,大部分时间都适用于连接良好的图,例如您的样本。计算Laplacian matrix 的第二个和第三个eigenvectors 并将它们用作X 和Y 坐标。

【讨论】:

  • 我认为这些算法会找到一种使图形平面化的方法,但它们不一定会找到最小化必须移动的节点数量的布局。
  • 有没有其他更优雅的方法,更直观?
  • @David_Eisenstat 你能解释一下光谱布局方法吗,是否也可以检查天气图是平面的(有光谱布局)?如果是,该算法的效率如何?
【解决方案2】:

如果您对最低成本感兴趣,那么本文Planarity Testing By Path Addition 中描述的算法将找到可能的排列以生成所有可能的平面嵌入(在O(|Edges|) 时间和内存中生成包含所有排列的数据结构循环边缘排序以提供平面嵌入,O(|Edges|) 时间和内存为每个单独的排列生成嵌入)。然后,您可以遍历这些排列并找到达到的最低成本。

如果图形总是最大平面,那么这是大材小用(因为只有一种可能的循环边排序),但您可能仍需要考虑许多可能的外表面。

[顺便说一句:第一个图可以在一次移动中重新排列为平面嵌入 ​​- 将 (C) 移动到 (A) 和 (E) 之间的中点]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多