基于多个可能匹配匹配人的算法

时间:2016-06-14 14:48:07

标签: algorithm match

我们说我有一组5人P = {1, 2, 3, 4, 5},我知道有以下可能性将它们匹配在一起:

{1,2}, {1,3}, {1,5}, {2,1}, {2,4}, {2,5}, {3,1}, {3,4}, {4,2}, {4,3}, {4,5}, {5,1}, {5,2}, {5,4}
  

例如,他们可以象征谁喜欢谁(每个人都是双性恋,   性别并不重要。)

可视化为图表: enter image description here

现在我想知道谁能相互匹配,以便每个人都能与某人相匹配。理想情况下,没有人被排除在外。

  

基于这个例子:谁应该和谁结婚?理想情况下,没有人应该保持单身。

有点麻烦:最多可以有3个人匹配。

  

基于这个例子:允许多情婚姻。

所以我可以手动完成并获得有效的结果。所以我知道,由于{1,2}{1,5}{2,5}我可以将{1,2,5}匹配在一起。

现在这意味着1,2和5人出局,只剩下以下组合:

{3,4}, {4,3}

导致{3,4}

所以最终结果可能是:{1,2,5}和{3,4}

  

基于这样的例子:第1,2和5人结婚,第3人结婚   和5结婚。

再次,可视化为图表: enter image description here

现在,这是一个玩具的例子。如果人数和可能的比赛增加,情况就会变得复杂得多。

我正在寻找如何用计算机解决这个问题的正确方向。

1 个答案:

答案 0 :(得分:1)

你可以采取一些残酷的递归Python函数,如

webpack

并记住它(在字典中查找# people is a frozenset # conflicts is a set of frozenset pairs def match(people, conflicts): if not people: # people is empty return {} for group in next_groups(people, conflicts): solution = match(people - group, conflicts) if solution is not None: solution.add(group) return solution return None def next_groups(people, conflicts): a = min(people) for b in people - {a}: if frozenset({a, b}) in conflicts: continue yield frozenset({a, b}) for c in people - {a, b}: if frozenset({a, c}) in conflicts or frozenset({b, c}) in conflicts: continue yield frozenset({a, b, c}) 以查看上次输出的内容)。