【问题标题】:Creating edges between groups of nodes在节点组之间创建边
【发布时间】:2023-04-02 15:50:01
【问题描述】:

我有一组 N 个节点,分为 S 个子组。每个子组中的节点数并不总是相等,但划分尽可能均匀。

我想创建边以在组之间形成连接,但受约束:

  • 每个节点的最大度数为k。
  • 每组之间至少有 2 个连接。

有人能建议这种过程是否存在特定的算法或方法吗?似乎有一种既定方法可以解决的事情,但到目前为止我一直找不到任何东西。

* 更新以提供更多信息 (10/11)*

简而言之“伪代码”:

  • 确定所有 N(N-1)/2 组可能的组合,例如 AB、AC、BC 等。

    • 遍历每一对
    • 对于每一对:
      • 随机选择组 1 中的一个节点
      • 随机选择第 2 组中的一个节点
      • 在以下情况下建立这些节点之间的连接:
        • 两个节点的度数
        • 边缘不存在
  • 重复直到出现所需数量的连接。

我经常遇到的问题是,如果组数大于每个组的节点数,那么在后面的pairings有机会赶上之前,第一个pairings迭代通过的节点就已经满了。我已经尝试随机化我遍历可能的对的顺序,但它没有帮助。

我通过在基于约束的组的形成中推导出一些限制来稍微缓解这个问题。

【问题讨论】:

  • 您的意思是“每个组之间至少有2个连接”吗?
  • 您似乎在这里描述的是一个微不足道的问题。您在每组节点周围绘制一条“超级节点”曲线。在每对超级节点之间制作两条边。最后,获取每个组/超级节点的边缘端点,并将它们均匀地分布在组的节点之间。
  • 是的。谢谢你的纠正。我曾考虑过这种方法,但我(可能天真地)认为在“超级节点”之间重新分配连接比直接将边分配给节点更难实现。这种方法的问题是边缘的分布变得非常不均匀,因为早期节点在后面的节点之前填满。谢谢你的小费,普鲁恩。我会考虑并试一试。

标签: python algorithm graph-theory


【解决方案1】:

您似乎在这里描述的是一个微不足道的问题。您在每组节点周围绘制一条“超级节点”曲线。在每对超级节点之间制作两条边。最后,获取每个组/超级节点的边缘端点,并将它们均匀地分布在组的节点之间。

根据 OP 评论更新

什么是“早期节点”和“晚期节点”?如果您有更多关于该问题的信息,请提出。您分阶段执行此操作:

  1. 将每个组描述为节点的集合。
  2. 创建连接所有组的 N*(N-1) 条边;用相关组标记每个端点。
  3. 对于每个组,遍历关联的端点,以循环方式将它们分配给组的节点。

这为您提供所需的映射,同时最小化每个组中的最大度数。如果存在,这将生成一个最优解。

根据 10 月 11 日的 OP 更新进行优化

分析

您有 N 个节点和 S 个子组(组)。这意味着您在每个组中有 N/S 个节点。如果这不是整数,您将在某些组中具有 P=floor(N/S) 鼻子,而在其他组中具有 P+1 节点。

你有一个最大度数k;您至少有 N(N-1) 个边,每组中需要 2(N-1) 个边端点。

引理:较小的组(具有 P 个节点)可以支持 kP 个连接。 如果 kP

解决方案

以您喜欢的任何方式对每个组中的节点进行排序;让我们将它们编号为 0 到 P-1 或 P(取决于群体人口)。再次在每个组内,将组的端点编号为 0 到 2(N-1) - 1。

对于每个组,遍历端点。对于每个端点编号 i,将其分配给节点 i mod P(或较大组的 P+1)。这将在节点之间平均分配所有端点。

Q.E.D.

【讨论】:

  • 抱歉,我应该提供更多关于我尝试过的信息。我非常确定,我走错了路,并且这个问题会有一个简单的“标准”答案。
  • 感谢您的扩展回复。我真的很感激,尽管我想澄清几点。 - 使用您的术语(S 表示子组的数量)我将 S(S-1) 作为必要的边数,导致 k*P >= 2(S-1)。我错过了什么吗? - 当您说“端点”时,您指的是我们的节点连接到的节点(在其他子组中)吗?即组中节点 i mod P 的端点是节点 i?再次感谢。您的帮助确实帮助我提高了对此的思考。
  • 一个“端点”只是一条边的一端。每条边都有两个端点,您需要将它们附加到两个不同的节点。
猜你喜欢
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2016-12-16
  • 2023-02-23
相关资源
最近更新 更多