这与稳定婚姻问题的扩展不同,因为根据我理解OP的问题,每个群组中的人没有一个有序的列表,列出他们想要与谁共事的优先顺序;而是一个二进制关系(愿意/不愿意)。
它可以被表示为一个整数规划问题,可以很快地解决。我在下面给出了问题的数学公式;您可以使用像glpk或AMPL/CPLEX这样的软件包来处理数据。
定义以下矩阵:
M1 = |A| x |B|
矩阵,其中
M1(a,b) = 1
,如果a(A组的特定成员)愿意与b(B组的特定成员)一起工作,则为1,否则为0
M2 = |A| x |C|
矩阵,其中 M2(a,c) = 1
如果a(A组的特定成员)愿意与c(C组的特定成员)一起工作,则为1,否则为0
M3 = |B| x |C|
矩阵,其中
M3(b,c) = 1
如果b(B组的特定成员)愿意与c(C组的特定成员)一起工作,则为1,否则为0
现在定义一个新矩阵,我们将用它来进行最大化:
X = |A| x |B| x |C|
矩阵,其中
X(a,b,c) = 1
如果我们让a、b和c共同工作。
现在,定义我们的目标函数:
//最大化小组数量
maximize Sum[(all a, all b, all c) X(a,b,c)]
遵循以下约束条件:
//确保没有人被分配到两个组
对于所有的a值:Sum[(all j, k) X(a, j, k)] <= 1
对于所有b的值:Sum[(所有i,k) X(i, b, k)] <= 1
对于所有c的值:Sum[(所有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