如果您可以访问一个好的MIP求解器(通过acedamic计划使用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。
只有当i和j应该见面时,z(i,j)和z(i,j,m)才存在。
对于每个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. )