匈牙利算法学习笔记


参考链接:
1. 14-4:匈牙利算法 Hungarian Algorithm

1. 前言

1.1 二分图

在这里插入图片描述
二分图通常针对无向图问题。假设 G = ( V , E ) G=(V,E) G=(V,E)是一个无向图,节点集合 V V V可以分割为两个互不相交的子集,并且图中每条边依附的两个节点都分属于这两个互不相交的子集,两个子集内的节点不相邻。

1.2 二分图匹配

给定二分图的边集 M M M F F F是边集 M M M中的一个子集,如果 F F F中的每条边的两个节点只有该条边与这两个节点相连,则 F F F称为一个匹配。
在这里插入图片描述

2. 匈牙利算法(Hungarian Algorithm)

2.1 基础概念

匈牙利算法(Hungarian algorithm),主要用于解决一些与二分图匹配有关的问题,例如无权重二分图的最大匹配问题和有权值二分图的最小权值匹配问题等。

2.2 实现步骤

以一个有权值二分图的最小权值匹配问题为例。首先定义一个有权二分图(如下图),每个集合中都包含3个节点。匈牙利算法中要求两个集合中的节点数量相同。
在这里插入图片描述
根据二分图构建邻接矩阵,矩阵中的元素表示两个节点之间的权值。
在这里插入图片描述
步骤一: 找到邻接矩阵中每一行的最小元素,并且将每一行中的元素都减去该行中的最小元素。
在这里插入图片描述
步骤二: 在剩下的矩阵中找到每一列的最小元素,并且将每一列中的元素都减去该列中的最小元素。
在这里插入图片描述
步骤三: 用最少的横线或竖线来覆盖矩阵中的所有零元素。如果线条的最少数量等于 n n n,则停止运行;如果线条的最少数量小于 n n n,则继续下一步。(在本案例中 n = 3 n=3 n=3
在这里插入图片描述
步骤四: 在没有被覆盖的元素中找到最小值,并且将没有被覆盖的元素减去这个最小值,同时将不同线条交叉位置上的元素加上这个最小值。
在这里插入图片描述
在这里插入图片描述
步骤五: 回到步骤三,即继续用最少的横线或竖线来覆盖矩阵中的所有零元素。如果线条的最少数量等于 n n n,则停止运行;如果线条的最少数量小于 n n n,则执行步骤四。
在这里插入图片描述
步骤六: 最后从剩余的矩阵元素中找到最合适的零元素作为匹配结果。这里每个零元素对应筛选后的两个节点之间的边。
在这里插入图片描述

  1. 节点 u 3 u_3 u3只能与节点 v 1 v_1 v1匹配。

在这里插入图片描述
2. 节点 u 2 u_2 u2能够与节点 v 2 v_2 v2 v 3 v_3 v3匹配,但是考虑到节点 v 2 v_2 v2只能与节点 u 2 u_2 u2匹配,因此将节点 u 2 u_2 u2分配给节点 u 2 u_2 u2

在这里插入图片描述
3. 最后只剩下节点 u 1 u_1 u1与节点 v 3 v_3 v3匹配。

在这里插入图片描述
4. 因此最小权值匹配为 { ( u 3 , v 1 ) , ( u 1 , v 3 ) , ( u 2 , v 2 ) } \{(u_3,v_1), (u_1,v_3), (u_2,v_2)\} {(u3,v1),(u1,v3),(u2,v2)},最小的权值之和为 50 + 35 + 22 = 107 50+35+22=107 50+35+22=107

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值