匈牙利算法java实现_匈牙利算法(Hungarian Algorithm)

匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法。换句话说就是,在可以接受的时间内去做匹配。

1. 描述问题

给定2个集合A和B,然后将AB中的元素完成一个连线。(这不就是小时候的连线题么-_-)

匈牙利算法java实现_匈牙利算法(Hungarian Algorithm)_第1张图片

匈牙利算法就是要找到两个集合促成最多的匹配对!最佳媒婆。这里最适合举的例子就是相亲会。集合A代表所有男嘉宾,集合B代表所有女嘉宾。每个男女嘉宾都有自己的心动嘉宾,此为重要前提。通过一个算法,完成最多的牵线。

匈牙利算法java实现_匈牙利算法(Hungarian Algorithm)_第2张图片

互相有红线的代表互相心动,但不代表最终连线。这里的前提是,Hungarian算法只会匹配互相心动的对象。

最终获得的匹配是:

匈牙利算法java实现_匈牙利算法(Hungarian Algorithm)_第3张图片

上面这篇博客完美解释的Hungarian算法的操作步骤:用递归回溯的方式更改匹配。但没从数学原理上解释。

这里完成最大匹配的逻辑是,先找一个小匹配(至少完成2对牵手的,并且有两对一的关系存在),然后通过M型交错路径的方法扩大匹配。

什么是M型交错路径?

匈牙利算法java实现_匈牙利算法(Hungarian Algorithm)_第4张图片

如上图,红色粗线部分为小匹配,构成了一个M型的基本样子,通过M形状延申就可以获得更大的匹配。更新如下,粗线为更新后的匹配:

匈牙利算法java实现_匈牙利算法(Hungarian Algorithm)_第5张图片

与上一步完全不一样,那么这么更新的逻辑是什么呢?答:M型

咱们展开来看,把右下角的点移动到左下角,就可以看得更清楚了:

匈牙利算法java实现_匈牙利算法(Hungarian Algorithm)_第6张图片

匹配一直更新的逻辑是:M字母的阴面和阳面的交替!就是这样,粗线代表连接,细线代表

匈牙利算法java实现_匈牙利算法(Hungarian Algorithm)_第7张图片

上面这个就是Hungarian算法的精髓了,这个步骤有个专业的名词:M交错路径的增广。

以上。

你可能感兴趣的:(匈牙利算法java实现)