我们说我有一组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}
例如,他们可以象征谁喜欢谁(每个人都是双性恋, 性别并不重要。)
现在我想知道谁能相互匹配,以便每个人都能与某人相匹配。理想情况下,没有人被排除在外。
基于这个例子:谁应该和谁结婚?理想情况下,没有人应该保持单身。
有点麻烦:最多可以有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结婚。
现在,这是一个玩具的例子。如果人数和可能的比赛增加,情况就会变得复杂得多。
我正在寻找如何用计算机解决这个问题的正确方向。
答案 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})
以查看上次输出的内容)。