将首选合作伙伴匹配成三人小组的算法

12

有什么好的算法可以解决这个问题?

我有三组人 - A组,B组和C组。每组中的人数相同。他们各自拥有一份愿意与其他组合作的人员名单。我想将所有这些人分成三组(来自A,B和C的各一个),使得每个组中的每个人都希望与其它组中的人合作。

如何快速找到这些组?如果没有办法让每个人都开心,那么该算法应首先尽可能使更多的组有三个愿意互相合作的人,然后再尽可能让其他组中的人满意。

最后一点:人们就他们想要与谁合作达成了协议(如果x想要与y合作,则y也想要与x合作)。如果您能够给出算法运行时间的大O表示法,那就太好了!


3
我认为你应该重新命名标题以真实描述你的问题,这样在相关搜索中才会出现实际结果。 - mmcdole
6个回答

19
这就像稳定婚姻问题,但有三个参与方而不是两个。
看一下前一个问题(二分图匹配)的高效解决方案,并根据您的需要进行调整。

http://en.wikipedia.org/wiki/Stable_marriage_problem

一种适应方法是先仅从A组和B组中构建工作配对。然后将这些配对与C组的工作者配对。让这些配对只选择两个成员都同意的工作者(根据他们的列表)。请注意,这只会得到一个局部最优解。

k-部分匹配的最优解很难找到:

http://www.math.tau.ac.il/~safra/PapersAndTalks/k-DM.ps

请参考这篇论文,了解k部分匹配问题的非最优解决方案:

http://books.google.com/books?id=wqs31L1MF4IC&pg=PA309&lpg=PA309&dq=k-partite+matching&source=bl&ots=kgBuvi7ym_&sig=j3Y-nyo51y8qp0-HwToyUlkao4A&hl=de&sa=X&oi=book_result&resnum=1&ct=result

我相信你现在已经知道要搜索的术语,可以在Google上找到其他相关内容。我不知道是否有一种有效的算法可以给出k=3的最优解。


10

这与稳定婚姻问题的扩展不同,因为根据我理解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


2

很快地解决这个问题。首先,这不是稳定婚姻问题的例子,也不是它的扩展(即三维稳定匹配问题)。无论如何,这是一个已知为NP难题的三维匹配问题(见Garey和Johnson)。要合理地解决这样一个问题,你可能需要使用一些形式的约束、整数或线性编程(其他方法也存在)。有用的东西可能是新的Microsoft Solver Foundation,请查看。


0

也许下面的文章可以帮助您:https://en.wikipedia.org/wiki/Lattice_of_stable_matchings

在其最简单的形式中,稳定匹配问题的一个实例包括两个相同数量的元素集合,它们需要相互匹配,例如医生和医院职位。每个元素对另一种类型的元素都有一个偏好排序:每个医生都对他们想要工作的医院有不同的偏好(例如基于他们想要居住的城市),而每个医院都对他们想要为他们工作的医生有偏好(例如基于专业或推荐)。目标是找到一个稳定的匹配:没有一对医生和医院会更喜欢彼此而不是他们分配的匹配。这个问题的版本被用于将美国医学生与医院匹配的全国住院医师匹配计划等。

通常情况下,可能会有许多不同的稳定匹配。例如,假设有三名医生(A、B、C)和三家医院(X、Y、Z),它们的偏好如下:

A: YXZ   B: ZYX   C: XZY  
X: BAC   Y: CBA   Z: ACB

这个匹配安排有三种稳定的解决方案:

  • 医生得到他们的第一选择,而医院得到他们的第三选择:AY,BZ,CX。
  • 所有参与者都得到他们的第二选择:AX,BY,CZ。
  • 医院得到他们的第一选择,而医生得到他们的第三选择:AZ,BX,CY。

稳定匹配的格子将这些解决方案组织起来,对于任何稳定匹配实例,它赋予了分配格子的结构。


0
首先,您可以排除任何双方在第三组中将要合作的人员列表不相交的事实。然后开始一次暴力深度优先搜索,始终从最不受欢迎的人开始选择。
或者,与上述排除等效的是,形成所有可能的三人组列表,然后从那里开始工作。

0

我遇到了一个类似的问题,只是写了一个蛮力破解它的脚本... http://grouper.owoga.com/

我的初步想法是:对于一个太大而无法进行蛮力破解的较大群体,可以使用某种遗传算法吗?进行N次随机交换M次。通过一些“幸福”功能为每个新排列打分。选取最好的几个,进行交叉配对,重复进行。

对于小团体,我最终得到了更好的结果,方法是对几个小组进行循环,找到“最佳”交换(产生最高整体“幸福度”增益的交换),进行操作,然后重复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接