这与稳定婚姻问题的扩展不同,因为据我了解 OP 的问题,每个组中的人都没有从最多到最少要与谁一起工作的有序列表;这是一个二元关系(愿意/不愿意)。
这可以表述为一个可以很快解决的整数规划问题。我给出了以下问题的数学公式;您可以使用 glpk 或 AMPL/CPLEX 之类的包来处理数据。
定义以下矩阵:
M1 = |A| x |B|
矩阵,其中
M1(a,b) = 1
如果 a(A 的给定成员)愿意与 b(B 的给定成员)一起工作,否则为 0
M2 = |A| x |C|
矩阵,M2(a,c) = 1
如果a(A的给定成员)愿意与c(C的给定成员)一起工作,否则为0
M2 = |B| x |C|
矩阵,其中
M3(b,c) = 1
如果 b(B 的给定成员)愿意与 c(C 的给定成员)一起工作,否则为 0
现在定义一个我们将用于最大化的新矩阵:
X = |A| x |B| x |C|
矩阵,其中
X(a,b,c) = 1
如果我们让 a、b 和 c 一起工作。
现在,定义我们的目标函数:
//最大化组数
最大化Sum[(all a, all b, all c) X(a,b,c)]
受以下约束:
//确保没有人被分成两组
对于 a 的所有值:Sum[(all j, k) X(a, j, k)] <= 1
对于 b 的所有值:Sum[(all i, k) X(i, b, k)] <= 1
对于 c 的所有值:Sum[(all i, j) X(i, j, c)] <= 1
//确保所有组由兼容的个体组成
对于所有 a、b、c:X(a,b,c) <= M1(a,b)/3 + M2(a,c)/3 + M3(b,c)/3