【问题标题】:Generating Random Constrained Graph生成随机约束图
【发布时间】:2016-08-25 04:14:44
【问题描述】:

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

图表规则

  1. 每个顶点将具有最多为 N-1 的随机连接数,其中 N 是顶点的总数。
  2. 顶点不能包含与其自身的直接连接
  3. 顶点不能包含与其他顶点的重复连接。
  4. 如果顶点 A 连接到顶点 B,则顶点 B 必须连接到顶点 A。
  5. 每个顶点必须连接到至少 3 个其他顶点。所以每个顶点的边都在 [3,N-1] 之间。

大约 70% 的时间我得到了正确的解决方案,但其他时候我进入图表相当远,然后没有留下有效的顶点。为了保证解决方案,我需要对顶点连接进行哪些限制?

我目前在做什么

  1. 为 [3,N-1] 之间的每个顶点随机化多个连接。
  2. 检查连接总数是否为偶数。如果 A 指向 B 并且 B 指向 A 则图中的连接总数应该是偶数,否则没有解决方案。如果是奇数,则修改一个顶点,使总数为偶数。
  3. 填充每个完全约束的顶点。因此,具有 N-1 个连接的顶点必须指向所有其他顶点。填充从该顶点到所有其他顶点的连接,并为所有其他顶点提供与完全受约束的顶点的连接。
  4. 根据约束的紧密程度处理每个顶点。因此,通过生成的随机顶点索引处理所有具有 N-2 连接、N-3 连接、然后 N-4 等连接的顶点。
  5. 如果新的随机索引有效,则连接它们,然后继续,如果无效,则重新随机索引,直到获得有效值。 (图表最多只有 7-15 个节点左右,因此不会花费很长时间)。

通常我会到达最后 2 个顶点,但此方法没有剩余的有效值。每个都需要 1 个以上的连接,但它们已经相互连接。任何人都有更好的算法或对连接数值的额外限制可以帮助我吗?

考虑到边数是偶数,应该有很多解决方案,但我上面的算法显然不能保证找到一个。

【问题讨论】:

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

标签: c++ algorithm random graph


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

【讨论】:

    猜你喜欢
    • 2012-04-06
    • 2014-03-25
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 2016-05-06
    相关资源
    最近更新 更多