在节点组之间创建边

时间:2017-10-10 20:04:20

标签: python algorithm graph-theory

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

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

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

是否有人能够建议是否存在针对此类流程的特定算法或方法?似乎有一种既定的方法,但到目前为止我一直找不到任何东西。

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

简要说明'伪代码':

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

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

我经常遇到的问题是,如果组的数量大于每个组中的节点数,则在后续配对有机会赶上之前,迭代的第一对配对中的节点已满。我试过随机化顺序我迭代可能的对,但它没有帮助。

我通过根据约束在组的形成中得出一些限制,稍微缓解了这个问题。

1 个答案:

答案 0 :(得分:0)

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

根据OP评论更新

这个“早期节点”和“后期节点”是什么?如果您有关于此问题的更多信息,请提供。你分阶段这样做:

  1. 将每个组描述为节点集合。
  2. 创建连接所有组的N *(N-1)条边;用关联的组标记每个端点。
  3. 对于每个组,迭代关联的端点,以循环方式将它们分配给组的节点。
  4. 这为您提供了所需的映射,同时最小化了每组中的最大程度。如果存在,这将生成最佳解决方案。

    10月11日OP更新的细化

    <强>分析

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

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

    引理:较小的组(具有P个节点)可以支持k P连接。 如果k P&lt; 2(N-1),那么你没有解决方案的要求。 否则(即2(N-1)<= k * P),那么你可以通过施工获得公平的解决方案。

    <强>解决方案

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

    对于每个组,迭代端点。对于每个端点号 i ,将其分配给节点 i mod P (或更大的组的P + 1)。这将在节点之间均匀分配所有端点。

    Q.E.D。