关于匈牙利匹配可以联系下面两篇博客更容易理解和补盲:
带你入门多目标跟踪(三)匈牙利算法&KM算法
趣写算法系列之–匈牙利算法
14.1 二部图
广度优先搜索
广度优先,可以使用队列来操作:
- 依次遍历节点,首先遍历第一个节点A,判断节点A是否遍历过,如果节点A没有遍历过,就把节点A添加进队列。
- 然后取出队列中的第一个元素A,对于和节点A连接的某节点B和节点C等,把节点B和c进行标记(标记就是根据题目的具体要求进行操作,即你的目的是什么你就干什么),并且如果节点B和c没有遍历过,那么把节点B和C添加进队列。
- 然后再取出队列中的第一个元素,就是节点B,遍历到了B节点,再对和B节点连接的节点D进行标记,并且判断D是否遍历过,没有遍历过的话就添加到队列。
- 然后再取出队列第一个元素,为节点C。以此类推
14.2 无权二部图的最大匹配,最大流问题,其中有个网络最大流方法,贪心算法找最大匹配可能会失败。
贪心算法,每次局部最优,得到全局最优。
例如,每次只能从钱箱子里面取一张钞票,那肯定是每次都拿里面面值最大的一张,这样就会得到最优结果。
无权二部图的每条边权重都是一样的,为1。无权并不是说权重为0。
14.3有权二部图的最大匹配和最小匹配,把图边制作一个邻接矩阵。我们的目标是寻找权重之和最大的匹配。最大匹配限制条件:每一个节点都只能拥有一条边。注意,二部图并不是每个节点只有一条边。
以宠物收养为例,有权二部图的边的权重表示人对宠物的喜好程度,没有边表示喜好程度是0,也就是完全不喜欢。
宠物收养机构应该寻找有权二部图中的最大匹配。最大匹配,意味着让人领养最喜欢的宠物,获得最大的幸福感。
对于有权图,最大匹配和最小匹配是可以相互转化的。只需要把所有权重乘以 − 1 \color{blue}-1 −1全都变为负数即可。即,本来求最大值,最大值乘以 − 1 \color{blue}-1 −1 就变成了最小值了。
最大匹配是最优匹配,即所有匹配权重之和(函数值)最大。
最小匹配也是最优匹配,即所有匹配权重之和(函数值)最小。
最大匹配
可以理解为人对物体的喜好程度,每个人对分配给他的物体的喜好的和值最大的匹配对,就是最大匹配;最小匹配
可以理解为两种物体的差异,所有物体差异的和值最小,就是最小匹配。
匈牙利算法用来寻找有权二部图中的最小匹配。但是匈牙利匹配中有一个限制,就是两个集合中的节点数都一样为n,即邻接矩阵必须是一个 n ∗ n \color{blue}n*n n∗n 的方阵。匈牙利算法的时间复杂度是 n 3 \color{blue}n^3 n3。
问:匈牙利算法的输入必须要是方阵吗,也就是左右数目一样吗?
答:匈牙利算法不需要,KM算法必须得是完全匹配(可以补权值为零的边得到)。
但是在自动驾驶中,一般直接用匈牙利算法代指KM算法,里面调用的就是KM算法。
所以,自动驾驶中指代额匈牙利算法,是一个方阵n*n。如果有一条边权值为0,就表示二者没有边。
所以,如果匈牙利算法+KM算法最终得到的二者匹配的一对,如果边的权重为0,就表示不匹配。并不表示强行把二者给匹配起来。
匈牙利算法是解决最小匹配的问题,但是我们实际问题如果是要求最大匹配,应该怎么办呢?我们可以把最大匹配等价转换为最小匹配,即,把权重全部取反,这样就把喜爱程度变成厌恶程度了,然后再调用匈牙利算法即可。
最小匹配的理解就是幸福度最低,我们最开始是
+
10
\color{blue}+10
+10,表示特别喜欢某只宠物,取负数就变成了特别不喜欢这只宠物,如果每个人都分配到了最最不喜欢的宠物,那么就是最小匹配。所以最小匹配并不是说被领养的宠物最少,而是最差匹配。最大匹配应该理解为最优匹配,最小匹配应该理解为最差匹配。
不过,不要狭隘的理解最大匹配和最小匹配的匹配结果是一样的。因为最大匹配是权值之和最大的匹配,而最小匹配是权值之和最小的匹配。两个集合中,最大匹配和最小匹配肯定不会是同一种匹配结果。前面介绍的最大匹配和最小匹配的互相转化,最终的匹配结果是同一种,只不过因为最小化更容易求解,例如匈牙利匹配就是根据寻找权重之和的最小值来求解问题的。
【14-4: 匈牙利算法 Hungarian Algorithm-哔哩哔哩】
匈牙利算法只需要操作邻接矩阵
最大匹配并不唯一,可能有多种匹配方式都能达到同样幸福度。
14.6 稳定婚配问题
Gale-shapley解决稳定婚配问题。就是
n
\color{blue}n
n个男人分别对
n
\color{blue}n
n个女人进行爱慕程度排序,
n
\color{blue}n
n个女人也分别对
n
\color{blue}n
n个男人进行爱慕程度排序。
每个男性都首先选择最喜欢的女性,如果女性的爱慕程度的最优选择不是你,你就划掉该女性,下次匹配不会再考虑她,然后你再选择你第二爱慕的女性,直到配对成功。并且每次匹配之后,依旧单身的男性先选择女性,无论女性是否已配对,可以挖墙脚,把已配对的男性变成单身。直到最后所有男人配对成功(此时所有女人也会配对成功)。