匹配算法

8
我正在编写一个应用程序,将用户人群分成配对组合以共同完成任务。每个用户可以指定关于其伙伴的各种偏好,例如:
- 性别 - 语言 - 年龄 - 地点(通常在用户所在地的X英里/公里内)
理想情况下,我希望用户能够指定每个偏好是“好有”还是“必须有”,例如:“我更喜欢与母语为英语的人匹配,但我不能与女性匹配”。
我的目标是最大化匹配的整体平均质量。例如,假设系统中有4个用户A,B,C,D。这些用户可以通过以下3种方式进行匹配:
在这个人为构造的例子中,第三个选项会被选择,因为它具有最高的整体匹配质量,即使A和D之间的匹配非常不好。
是否有一种算法可以帮助我: - 计算上述“匹配得分” - 选择将最大化平均匹配得分的配对(同时尊重每个用户的绝对约束条件)
并不是必须匹配每个用户,因此,在显著降低匹配整体质量和留下一些未匹配用户之间进行选择时,我会选择后者。
显然,我希望计算匹配的算法能够尽快完成,因为系统中的用户数量可能相当大。
最后,这种计算匹配得分和最大化整体平均值的系统只是我自己想出来的一种启发式方法。如果有更好的计算配对的方法,请告诉我。
更新
我描述的问题似乎类似于稳定婚姻问题,针对该问题已有一个众所周知的解决方案。但是,在这个问题中,我不需要选择的配对是稳定的。我的目标是选择配对,以使平均“匹配分数”最大化。

你能定义一下“相当大”是指几百、几千还是几百万吗? - Ivan
@Ivan,理想情况下,我希望这个系统能够在几个小时内为数百万用户执行匹配算法。 - Dónal
我正在处理一个类似的问题(不同之处在于我的“男人”和“女人”必须与异性配对,而且人口不平衡)- 我看到你还没有接受解决方案 - 你采取了哪种方法? - Rowland Shaw
5个回答

2
你看过哪些最大匹配算法?一开始我匆忙地读了你的问题:看起来你不一定限制自己只使用二分图。这似乎更加棘手。

特别是在这里,最小费用最大流问题可能会很有用,其中匹配的成本可能与其好处成反比。 - templatetypedef

1

1

我相信这个问题可以被表示为一个线性规划问题。然后你可以使用单纯形法来解决它。


只有当“匹配分数”是每个用户偏好的线性函数时,这个问题才能被描述为线性规划问题。 - Dónal

0

我在这里提供了一个类似问题的可能解决方案。这是一种用于测量不相似性的算法--被测数据与期望数据越相似,结果数值就越小。

对于你的应用程序,你可以将一个人的偏好设置为期望数据,而每个你要比较的其他人则是被测数据。在运行比较之前,你需要过滤掉那些像你在原始问题中提到的“不能与女性匹配”的情况。

另一个选择可能是使用卡方算法。


0
看起来你的问题不是二分图,因此我认为你正在寻找一般图中的最大权匹配。我并不羡慕编写这个算法的任务,因为Edmond's blossum shrinking算法不容易理解或高效实现。有这个算法的实现,其中一个例子是C++库LEMON(http://lemon.cs.elte.hu/trac/lemon)。如果你想要最大基数最大权重匹配,你将需要使用最大权重匹配算法,并在每条边上添加一个大的权重(所有权重的总和),以强制最大基数成为第一优先级。
另外,正如你在上面的评论中提到的,你的匹配项不是线性的,所以线性规划不适用,你可以采用约束编程方法。

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