完全图的最大加权配对算法

时间:2014-11-25 16:50:41

标签: algorithm graph-algorithm matching scilab

数学问题

2n 人,C(i,j)"费用"让 i j 一起工作(函数C可以快速计算,在我的例子中它是一个给定的矩阵,并且是对称的)。问题是要找到 2n 对的安排,以最小化每对成本的总和。

这应该在 n 的多项式复杂度中完成,并且在Scilab语言中相对容易实现(输入:成本矩阵,输出:配对,例如 n - by-2矩阵索引)。我知道"相对容易"受到解释......

以前的研究

这个问题实际上是由Blossom算法解决的。例如,请参阅this paper

然而,这个(及其变体)看起来像是一个噩梦。我真正的问题是 n = 20 ,所以虽然暴力(=尝试所有可能的配对)不正常(暴力强迫 n = 8 在我的电脑上花了一个小时),几乎任何比蛮力更好的东西应该可以做到;如果我可以避免一周的编码而花费一小时的计算费用。

我正在考虑在{em> 2n -by- 2n 数组上使用Hungarian/Munkres algorithm来填充对角线+%inf和其他通过对称成本矩阵的元素,然后以某种方式从结果排列中选择相关的配对,但我找不到可靠的方法来做到这一点。 (注意,匈牙利语算法已经编码为一个单独的部分,因此您可以免费使用它,并且很容易实现"要求。)

我希望与开花算法问题相比,图表的完整性允许一些快捷方式...... (编辑:参见下面的DE评论,这是由于半明显的原因,这是错误的)

1 个答案:

答案 0 :(得分:1)

我不知道Scilab我很害怕,但如果您愿意使用Python,那么Networkx library提供对此功能的支持非常容易:

import networkx as nx
import networkx.algorithms.matching as matching

def C(i,j):
    return i*j

n=40
G=nx.Graph()
for i in range(n):
    for j in range(n):
        G.add_edge(i,j,weight = -C(i,j))
M = matching.max_weight_matching(G,maxcardinality=True)
for i in M:
    print i,'with',M[i]

此代码会在一秒钟内打印出答案。

函数C定义了使用j配对i的成本。请注意,权重设置为-C(i,j),以便将max_weight_matching转换为min_weight_matching算法。