情况:用户选择多个其他用户作为项目的可能合作伙伴。用户没有偏好他挑选的另一个用户(即他的列表中的任何用户对于合作伙伴来说足够好)。例如:
| user_id | preferred_partners |
| 1 | 2 4 |
| 2 | 3 1 |
| 3 | 4 2 1 |
| 4 | 1 |
真正的清单会更大。
我的问题:给定一组用户及其首选合作伙伴(如上面的列表),我想生成一个最终合作对的数组。最终合作对的数量必须最大化(我希望尽可能多的人成对)。
这是我认为我需要的算法:Edmonds's matching algorithm,但由于我不是数学背景,我在解释和实现它时遇到了麻烦。
任何帮助将不胜感激。提前谢谢。
答案 0 :(得分:0)
Edmonds的匹配算法确实是你想要的。这是一个提供详细解释的good link
答案 1 :(得分:0)
Edmonds的算法可能就是你想要的,但话说再说,它可能不是。你有没有去寻找三元组?你是否会想要偏好?你有没有想要对你的机制有所保证,比如,如果有人放下更多的偏好,他们就不能从匹配到不匹配?合作伙伴必须是相互优先的吗?如果没有,那么相互优先的合作伙伴会有更多的分量吗?
这些变体中的一些可以通过Edmonds的算法或其加权表亲来解决,它使用Edmonds来解决“受限制的原始”,就像匈牙利算法使用二分匹配算法一样,但有些特别是3D匹配,很难,也不适合可爱的组合算法。通过从Ruby调用整数编程求解器,您可能会发现更容易解决多时间情况。