【问题标题】:Algorithm that matches people based on multiple possible matches基于多个可能匹配匹配人的算法
【发布时间】:2016-06-14 14:48:06
【问题描述】:

假设我有一组 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 结婚。

再次,可视化为图表:

现在,这是一个玩具示例。如果人数和可能匹配的人数增加,情况会变得更加复杂。

我正在寻找有关如何用计算机解决此类问题的正确方向的推动力。

【问题讨论】:

  • 这是最大的 3-hypergraph 匹配:en.wikipedia.org/wiki/3-dimensional_matching (NP-hard)。可能最大二分匹配可以用作启发式的合理起点。
  • (或者只是图形着色,也是 NP-hard)
  • 谢谢@NiklasB。!这已经很有帮助了。
  • 我为我的问题添加了视觉解释。 @NiklasB.:如果我理解正确,则不可能进行双向匹配,因为我没有尝试匹配的两方,而是一方,每个人都可以与另一方匹配?
  • @DavidEisenstat:谢谢,我去看看。

标签: algorithm match


【解决方案1】:

你可以使用一个有点残酷的递归 Python 函数,比如

# 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})

并记住它(在字典中查找 people 以查看上次输出的内容)。

【讨论】:

  • 感谢您的回答。我会好好看看。
  • 我不确定conflicts 是什么。能详细点吗?
  • @elevendollar 一对没有边的节点。
  • 谢谢!在那种情况下,这是有道理的。它也只是一个贪心算法,我希望有一个更优化的解决方案,但它回答了我的问题,所以它得到了我的支持。
  • @elevendollar 这不是贪婪——它会回溯。
猜你喜欢
  • 2014-08-21
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多