微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Munkres Python 包未生成最大总数

如何解决Munkres Python 包未生成最大总数

我目前正在编写一个算法来根据兼容性评分匹配用户。所以每个用户都有一个与其他每个用户的兼容性分数。目标是最大化总兼容性分数。我正在使用 munkres python 包来获取索引,然后过滤重复项。 (即如果用户 1 与用户 2 匹配,我们将删除用户 2 和用户 1 的匹配)。

这是一个示例矩阵:(在用户无法与自己匹配的地方不允许使用。)

matrix = [[disALLOWED,2,5,7,13,10],[2,disALLOWED,25,14],[5,21,100,17],[7,70,2],[13,200],[10,14,17,200,disALLOWED]]

这是我尝试过的。它适用于我给出的这个较小的矩阵示例,但没有给出较大数据集的最佳分数。我知道总分不是最优的,因为未优化的算法(简单地对分数进行排序并按顺序匹配每个用户)会产生更高的分数。

def optimize(matrix):
    optimal_matrix = make_cost_matrix(matrix,lambda cost: (sys.maxsize - cost) if
                                    (cost != disALLOWED) else disALLOWED)

    m = Munkres()
    indexes = m.compute(optimal_matrix)
    
    matches = []
    for row,column in indexes:
        value = matrix[row][column]
        match = [row,column,value]
        matches.append(match)

    matches.sort(key=thirdValue,reverse=True)

    seen = []
    total = 0
    for match in matches:

        if match[0] not in seen and match[1] not in seen:
            total += match[2]
            seen.append(match[0])
            seen.append(match[1])
    print(total)

是否有某种矩阵会破坏我的代码?任何帮助或指示将不胜感激。

解决方法

匈牙利算法适用于“二部”图,但您没有二部图。二部图是其中有两组不同节点的图。例如:将工人分配给工作。集合中的节点不相互连接;可以将工人分配给工作,或将工作分配给工人,但工人不会分配给工人,也不会将工作分配给工作。在您的情况下,您正在尝试将用户分配给其他用户。也就是说,你只有一套,而不是两套。

通过标记对角线 DISALLOWED,您可以防止用户与自己匹配,但并不能阻止用户与多个其他用户匹配。例如,只有四个用户都具有相同的兼容性:

A B C D
A 0 0 0
B 0 0 0
C 0 0 0
D 0 0 0

A 与 C 匹配
B 搭配 D
C与B匹配
D 与 A 匹配

是匈牙利算法的有效结果,但对您的情况无效。我不知道这是怎么回事,但它可能发生,所以你需要使用不同的算法。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。