在顶点之间生成随机边而无交集

时间:2018-12-21 19:54:50

标签: algorithm graph

我在2D空间中有任意一组顶点。我想在这些顶点之间几乎随机地生成边,以使以下三个条件成立:

  1. 每个顶点都有至少一条边。
  2. 除了可能在同一顶点外,没有两条边相交。
  3. 除了初始集合外,无需添加新顶点。

一般来说,我不太清楚如何解决这个问题。我最初试图将顶点强制构造为整齐的列(尽管同一列中的顶点之间具有任意垂直间距),然后一次形成一列的边缘,而顶点仅连接到下一列中的顶点。我以为我可以检查当前行中较高的顶点是否连接到下一行中较低的顶点,如果可以,则防止出现满足该条件的任何边。 (换句话说,如果V [j,k]是“从列j的顶部开始的第k个顶点”,那么如果出现以下情况,我将防止V [j,k1]和V [j + 1,k2]之间的任何边在任何顶点V [j,k3]和V [j + 1,k4]之间存在边,其中k4> k2和k3

但是它似乎没有用,甚至更糟的是,它留下了一些没有任何边缘的顶点。我该如何解决呢? (如果可能的话,根本没有那种强制的列结构;我希望它尽可能地处理一组顶点。)

1 个答案:

答案 0 :(得分:2)

从极坐标和间隔运算的角度进行攻击。列出未连接的顶点;随机洗牌。

对于每个未连接的点P

  • 列出P对所有“可见”的点的列表:那些没有被边缘遮挡的点(请参见下文)。
  • 随机选择一个“可见”点Q;将边缘PQ添加到图中

确定一个点是否“可见”可能很乏味,但实际上可以大大提高搜索空间。

  • 平移所有坐标,使P为原点。
  • 计算彼此点的极坐标(r,theta)。
  • 对于每个边缘AB,角度(A.theta,B.theta)的夹角为(0,2 * pi)的范围描述了一个扇形空间,其顶点位于P。琐碎的是,如果C.r> max(A.r,B.r),则该切片中的任何点C不可见的 -如果它距P的距离比任一端点都远。同样,如果它比两个端点都更近,则仍在考虑中。对C的每个点进行检查会严重减少您的候选人名单。

对于其余可能可见的点:  -最接近P 的点是可见的。  -对于任何其他点C,对覆盖其角度(θ)的所有边缘AB进行相交检查,以使r.A

剩下的是P中所有可见点的列表(请注意,至少必须有一个点,除非P是图中的唯一点;如果该图有至少2个与P的角度不同的点,必须至少有2个这样的点。随机选择一个并添加边缘。


这可能不是计算效率最高的算法。但是,它很容易可视化,易于实现每个步骤,并且很容易为特定问题提供解决方案。