Algorithm 完备图的最大加权配对算法 数学问题

Algorithm 完备图的最大加权配对算法 数学问题,algorithm,graph-algorithm,matching,scilab,Algorithm,Graph Algorithm,Matching,Scilab,假设有2n个人,并且C(i,j)让i和j一起工作的“成本”(函数C计算速度快,在我的例子中,它是一个给定的矩阵,并且是对称的)。问题是找到2n对人的安排,使每对人的成本之和最小化 这应该在多项式复杂度为n的情况下完成,并在Scilab语言中相对容易地实现(输入:成本矩阵,输出:配对,例如索引的n×2矩阵)。我知道“相对容易”是可以解释的 前期研究 这个问题实际上是通过Blossom算法解决的。例如,见 然而,这(及其变体)看起来像是一场噩梦。我真正的问题是n=20,所以尽管蛮力(尝试所有可能的配

假设有2n个人,并且
C(i,j)
让i和j一起工作的“成本”(函数
C
计算速度快,在我的例子中,它是一个给定的矩阵,并且是对称的)。问题是找到2n对人的安排,使每对人的成本之和最小化

这应该在多项式复杂度为n的情况下完成,并在Scilab语言中相对容易地实现(输入:成本矩阵,输出:配对,例如索引的n×2矩阵)。我知道“相对容易”是可以解释的

前期研究 这个问题实际上是通过Blossom算法解决的。例如,见

然而,这(及其变体)看起来像是一场噩梦。我真正的问题是n=20,所以尽管蛮力(尝试所有可能的配对)不好(蛮力强制n=8在我的电脑上花费了一个小时),但几乎任何比蛮力更好的方法都应该奏效;如果我能以一小时的计算为代价避免一周的编码,那我就完了

我一直在考虑在一个2n×2n数组上使用,用对称代价矩阵填充对角线
+%inf
和其他元素,然后从结果置换中选择一个相关的配对,但我找不到可靠的方法来做到这一点。(注意,匈牙利算法已经为一个单独的部分编码,因此您可以使用它,而不必为“易于实现”的要求付出代价。)


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

我恐怕不知道Scilab,但如果您愿意使用Python,这很容易,因为提供了对该函数的支持:

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定义了i与j配对的成本。请注意,权重设置为-C(i,j)为了将最大权重匹配转换为最小权重匹配算法。

一般来说,G的完备性是不相关的,因为某些边可能具有高权重,特别是对于Blossom算法,因为它是一个原始-对偶算法,并在紧边子图上保持一般匹配。匈牙利算法适用于二部图。将不会有一个简单的修复程序让它处理一般的图形,因为LP奇循环约束非常复杂。谢谢你的指针。权重可以为负数吗?如果不允许为负数,你可以为所有权重添加一个固定的偏移量,使其为正数。我相信networkx实现确实支持负权重。