用户之间的非二分非加权最大匹配

时间:2012-04-21 21:40:52

标签: ruby algorithm matching weighted bipartite

情况:用户选择多个其他用户作为项目的可能合作伙伴。用户没有偏好他挑选的另一个用户(即他的列表中的任何用户对于合作伙伴来说足够好)。例如:

| user_id | preferred_partners |
| 1       | 2 4                |
| 2       | 3 1                |
| 3       | 4 2 1              |
| 4       | 1                  |

真正的清单会更大。

我的问题:给定一组用户及其首选合作伙伴(如上面的列表),我想生成一个最终合作对的数组。最终合作对的数量必须最大化(我希望尽可能多的人成对)。

这是我认为我需要的算法:Edmonds's matching algorithm,但由于我不是数学背景,我在解释和实现它时遇到了麻烦。

任何帮助将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:0)

Edmonds的匹配算法确实是你想要的。这是一个提供详细解释的good link

答案 1 :(得分:0)

Edmonds的算法可能就是你想要的,但话说再说,它可能不是。你有没有去寻找三元组?你是否会想要偏好?你有没有想要对你的机制有所保证,比如,如果有人放下更多的偏好,他们就不能从匹配到不匹配?合作伙伴必须是相互优先的吗?如果没有,那么相互优先的合作伙伴会有更多的分量吗?

这些变体中的一些可以通过Edmonds的算法或其加权表亲来解决,它使用Edmonds来解决“受限制的原始”,就像匈牙利算法使用二分匹配算法一样,但有些特别是3D匹配,很难,也不适合可爱的组合算法。通过从Ruby调用整数编程求解器,您可能会发现更容易解决多时间情况。