C++ 随机约束图的生成

C++ 随机约束图的生成,c++,algorithm,random,graph,C++,Algorithm,Random,Graph,我需要生成一个顶点数目固定的随机图。每次我都很难找到解决办法 图形规则 每个顶点将有一个随机数目的连接,最多为N-1,其中N是顶点总数 顶点不能包含与其自身的直接连接 顶点不能包含与其他顶点的重复连接 如果顶点a连接到顶点B,则顶点B必须连接到顶点a 每个顶点必须连接到至少3个其他顶点。因此每个顶点将有[3,N-1]条边 我得到了一个正确的解决方案,大约70%的时间,但其他时候,我相当深入的图形,然后没有有效的顶点留下。要保证解决方案,顶点连接上需要哪些约束 到目前为止我在做什么 将[3,N-1

我需要生成一个顶点数目固定的随机图。每次我都很难找到解决办法

图形规则

  • 每个顶点将有一个随机数目的连接,最多为N-1,其中N是顶点总数
  • 顶点不能包含与其自身的直接连接
  • 顶点不能包含与其他顶点的重复连接
  • 如果顶点a连接到顶点B,则顶点B必须连接到顶点a
  • 每个顶点必须连接到至少3个其他顶点。因此每个顶点将有[3,N-1]条边
  • 我得到了一个正确的解决方案,大约70%的时间,但其他时候,我相当深入的图形,然后没有有效的顶点留下。要保证解决方案,顶点连接上需要哪些约束

    到目前为止我在做什么

  • 将[3,N-1]之间每个顶点的连接数随机化
  • 检查连接总数是否为偶数。如果A指向B,B指向A,则图中的连接总数应为偶数,否则没有解决方案。如果是奇数,请修改顶点,使总数为偶数
  • 填充完全约束的每个顶点。因此,具有N-1个连接的顶点必须指向所有其他顶点。填充从该顶点到所有其他顶点的连接,并为所有其他顶点提供到完全约束顶点的连接
  • 根据每个顶点的约束程度对其进行处理。因此,通过生成随机顶点索引,处理所有具有N-2个连接、N-3个连接、N-4个连接的顶点
  • 如果新的随机索引有效,请连接它们,然后继续,如果无效,请重新随机索引,直到获得有效值。(图的最大节点数仅为7-15个左右,因此不会花费很长时间) 通常,我会到达最后两个顶点,但使用此方法后,没有留下有效值。每个都需要1个连接,但它们已相互连接。有谁对连接数值有更好的算法或附加约束可以帮助我解决问题

    如果有偶数条边,应该有很多解,但我上面的算法显然不能保证找到一条

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

  • “图形不能包含与自身的直接连接”。您可能想说顶点不能包含与自身的直接连接?编辑,oops。是的,顶点不能有直接连接到自身的循环。但是,如果线下有2个连接,则没有问题,因为有一个由3个或更多顶点组成的循环。我不明白如何在最后1个或2个顶点上耗尽有效连接,因为您的要求允许连接到其他每个顶点?配对连接的需要似乎不会产生问题,因为您可以同时添加两个方向(或者用一个数据点构造数据以暗示两个方向)。没有办法耗尽有效值。是否有未列出的约束,例如如何选择顶点是否具有N-2、N-3、N-4等连接;或者,是否存在需要指向所有顶点的路径的约束?对于第4个列表项,您是指直接连接(边)还是通过其他顶点的连接(路线)?你的图表应该有多密集;顶点和边的数量是多少?你对连接号码有限制吗?马特:当我把一个连接添加到a时,我也会把它添加到B,这样他们都知道两者之间有连接。问题是,当我到达最低级别时,出于某种原因,可能有时所有顶点都已满或已连接到已连接到仍有打开连接的顶点。所以当它失败时,我通常有两个顶点,每个顶点有一个打开的连接,但是它们已经连接在一起,所以它们不再是有效的连接。