在python中,如果图不是二分图,如何找到最小权值的完全匹配



wiki中的完全匹配概念:

完美匹配是指匹配图表也就是说,如果图的每个顶点都是入射到匹配的边缘。

因此,最小权重完全匹配是具有最小权重的组合之一。起初,我的想法是遵循贪婪算法(注意:我的图是完整的,每个顶点都有到其余顶点的边(:

从图中拾取一个顶点,并在每一步中找到其最近的相邻顶点,然后放下它们并循环,直到图中没有顶点为止。然而,除非计算n,否则它不是最优的!次数:

while odd_vert:
v = vertices.pop()
length = float("inf")
closest = 0
for u in odd_vert:
if graph[v][u]["weight"] < length:
length = graph[v][u]["weight"]
closest = u
graph_minimum_match.add_edge(v, closest, weight = length)

我在networkx中找到了一些函数,但它要求图是二分的:

nx.algorithms.bipartite.matching.minimum_weight_full_matching(G, top_nodes=None, weight='weight')

此外,找到最大权重匹配:

nx.algorithms.matching.max_weight_matching(G, maxcardinality=True)

然后,我搜索了一篇关于开花信仰传播的文章,但我不确定它是否能实现,所以有什么想法吗?

您可以将最小权重匹配减少为最大权重匹配

通过乘以-1或从最大权重中减去,可以反转图形中的所有边权重。然后,如果你能在这个变换图中找到一个最大完美匹配,那么这个匹配在你的原始图中是最小的。

nx.algorithms.matching.max_weight_matching具有参数maxcardinality,如果将其设置为True,则意味着仅在存在完全匹配的情况下才允许完全匹配。因此,您可以在转换后的图上调用networkx函数,并检查匹配是否确实完成。如果是,则此匹配就是您想要的结果。如果不是,那么就不可能完美匹配。

在一个顶点数为偶数的完备图中,完全匹配当然总是可能的。此外,如果变换后的图只有正权重(例如,通过使用基于减法的变换(,则最大权重图将始终具有最大基数。

最新更新