将n个人分成m组k次,重叠次数最少

时间:2018-05-22 14:49:22

标签: algorithm combinatorics

我们说我有

  • 60到100人,我想分成
  • 3至5组
  • 每组10至25人,我想这样做
  • 3至5次

以尽可能少的重复来满足尽可能多的人的方式。

我试图自己做一些研究,但找不到任何听起来像我正在寻找的东西。

如果您需要更多信息,请告诉我们。

提前致谢

2 个答案:

答案 0 :(得分:3)

这是社交高尔夫球手问题的近似变体。由于Triska和Musliu运行良好,因此有一种算法;请参阅https://github.com/FelixHenninger/socialgolfer.js/tree/master了解实施情况。

答案 1 :(得分:0)

您可以将此框架设置为整数编程问题。

如果人A[i,g,t] = 1在时间i in N属于g in G组,则{+ 1}}定义二进制变量t in T,否则为0。然后,M[i,j] = sum(A[i,g,t] * A[j,g,t] for g in G, t in T) 1 iff ij相遇。

假设您希望最大化至少满足一次的人数。然后,您的目标变为sum(M[i,j] for i, j in N)

您可以线性地表达您的约束:

  1. 群组规模有限:forall g in G, forall t in T, sum(A[i,g,t] for i in N) <= quota[g,t]
  2. 每个人在每个时期都被分配到一个组:forall i, forall t, sum(A[i,g,t] for g in G) = 1
  3. 有几个开源解算器应该在您建议的规模上表现良好。