如果您可以访问一个好的 MIP 求解器(cplex/gurobi 通过学术倡议,但 coin OR 和 LP_solve 是开源的,而且也不错),我肯定会尝试 simplex。我看了看将您的问题表述为一个混合整数程序,我的感觉是它会有相当强的松弛,因此分支和切割以及价格对您来说会有很长的路要走。如今,这些求解器提供了非常可扩展的解决方案,尤其是商业解决方案。优点是它们还提供了一个上限,因此您可以了解解决方案的质量,而启发式方法并非如此。
公式:
将 z(i,j)(二进制)定义为一个变量,表示 i 和 j 在 {1,2,...,N} 中的至少一个事件 n 中在一起。定义 z(i,j,n)(二进制)以指示它们在事件 n 中在一起。定义 z(i,n) 表示 i 参加 n。Z(i,j) 和 z(i,j,m) 仅在 i 和 j 应该相遇时才存在。
对于每个 t,M^t 是同时举行的时间事件的子集。因此,如果事件 1 是从 9 到 11,事件 2 是从 10 到 12,事件 3 是从 11 到 13,则 M^1 = {事件 1,事件 2) 和 M^2 = {事件 2,事件 3} . 即没有人可以同时参加 1 和 2,或 2 和 3,但 1 和 3 很好。
Max sum Z(i,j)
z(i,j)<= sum_m z(i,j,m)
(every i,j)(i and j can meet if they are in the same location m at least once)
z(i,j,m)<= z(i,m) (for every i,j,m)
(if i and j attend m, then i attends m)
z(i,j,m)<= z(j,m) (for every i,j,m)
(if i and j attend m, then j attends m)
sum_i z(i,m) <= C(m) (for every m)
(only C(m) persons can visit event m)
sum_(m in M^t) z(i,m) <= 1 (for every t and i)
(if m and m' are both overlapping time t, then no person can visit them both. )