基于偏好和能力的配对算法

时间:2015-12-12 20:57:44

标签: algorithm pairing

根据他们的喜好和能力,从两组不同的人中成对。

一组人可以同时执行任务A和任务B,但大多数人只执行任务B.在另一组中,大多数人只能执行任务A.

找到一个算法,用于配对能够并且愿意执行相同任务的人。

2 个答案:

答案 0 :(得分:0)

根据我的理解,问题可以建模为unweighted matching问题;如果两个参与者共享一种共同语言,他们将处于优势地位。然而,这个问题比bipartite graphs中的相同问题更难解决,它可以通过algorithm Edmonds在{{3}}绑定的多项式运行时内解决。

答案 1 :(得分:0)

我知道你想要所有可能的夫妻名单。如果它是正确的,你可以尝试:

  1. 创建所有具有langages能力的辩手的列表
  2. 创建一个包含所有可能的辩论者的列表,而不考虑语言能力。
  3. 通过删除不兼容的情侣来过滤上一个列表。
  4. 可以合并步骤2和3

    在python中,它可以用函数形式编写:

    import itertools as it
    
    # list of debaters as tupple
    # [(name, speak english, speak french), ...]
    debaters=[
        ('ef1', True, True), ('e2', True, False), ('f3', False, True),
        ('e4', True, False), ('f5', False, True) ]
    
    result=map(
        lambda x: (x[0][0], x[1][0]),
        filter(lambda x: (x[0][1] and x[1][1]) or (x[0][2] and x[1][2]),
               it.combinations(debaters,2)))
    
    print(result)
    

    它将打印:

    [('ef1', 'e2'), ('ef1', 'f3'), ('ef1', 'e4'), ('ef1', 'f5'), ('e2', 'e4'), ('f3', 'f5')]
    

    您也可以使用以下命令编写此算法:

    def compute(d):
        result = list()
        for i in range(len(d)):
            for j in range(i+1, len(d)):
                if (d[i][1] and d[j][1]) or (d[i][2] and d[j][2]):
                    result.append((d[i][0], d[j][0]))
        return result
    print(compute(debaters))