生成随机约束图

时间:2016-04-29 21:40:03

标签: c++ algorithm random graph

我需要生成一个具有固定数量顶点的随机图。我每次都难以获得解决方案。

图表规则

  1. 每个顶点的随机数最多为N-1,其中N是顶点的总数。
  2. 顶点不能包含与自己的直接连接
  3. 顶点不能包含与其他顶点的重复连接。
  4. 如果顶点A连接到顶点B,则顶点B必须连接到顶点A.
  5. 每个顶点必须连接至少3个其他顶点。所以每个顶点都有[3,N-1]个边。
  6. 我在大约70%的时间内得到了正确的解决方案,但有时我在图中相当远,然后没有留下有效的顶点。我需要对顶点连接有什么约束来保证解决方案?

    到目前为止我做了什么

    1. 随机化[3,N-1]之间每个顶点的多个连接。
    2. 检查连接总数是否均匀。如果A指向B,B指向A,那么图中的连接总数应该是偶数,否则就没有解决方案。如果是奇数修改顶点,那么总数是偶数。
    3. 填写完全约束的每个顶点。因此,具有N-1个连接的顶点必须指向所有其他顶点。填写从该顶点到所有其他顶点的连接,并为所有其他顶点提供与完全约束顶点的连接。
    4. 按照约束的程度处理每个顶点。因此,通过生成的随机顶点索引处理所有具有N-2个连接的顶点,N-3连接,然后是N-4等。
    5. 如果新的随机索引有效,则连接它们然后继续,如果无效则重新随机索引,直到获得有效值。 (图表最多只有7-15个节点,所以这不会花费很长时间)。
    6. 一般来说,我到达最后2个顶点,但是这个方法没有剩下有效值。每个都需要1个连接,但它们已经相互连接。任何人都有一个更好的算法或对连接数量的额外约束,这将有助于我?

      如果存在偶数个边缘,应该有很多解决方案,但我上面的算法显然不能保证找到一个。

1 个答案:

答案 0 :(得分:1)

  1. 创建边缘少于3个的所有顶点的矢量。
  2. 随机选择矢量中的顶点。
  3. 复制已移除所选顶点的矢量(您可以交换选定的椎骨和最后一个并调整大小)。
  4. 同时删除已连接到所选顶点的所有目标顶点。
  5. 从复制的矢量中选择一个顶点,并在两个选择的n个顶点之间的每个方向上创建一个边
  6. 只要边缘少于3个的所有顶点的矢量不为空,重复步骤1..5