我们说我有
以尽可能少的重复来满足尽可能多的人的方式。
我试图自己做一些研究,但找不到任何听起来像我正在寻找的东西。
如果您需要更多信息,请告诉我们。
提前致谢
答案 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 i
和j
相遇。
假设您希望最大化至少满足一次的人数。然后,您的目标变为sum(M[i,j] for i, j in N)
。
您可以线性地表达您的约束:
forall g in G, forall t in T, sum(A[i,g,t] for i in N) <= quota[g,t]
。forall i, forall t, sum(A[i,g,t] for g in G) = 1
。有几个开源解算器应该在您建议的规模上表现良好。