無權二分圖的最大匹配求解——匈牙利算法求解

一、二分圖及相關概念

    所謂二分圖,即對於一個圖來說,如果其頂點能爲兩個不相交集 U 和V ,使得每一條邊都分別連接U、V中的頂點,則這個圖就是二分圖,如下圖所示的圖就是一個二分圖:

                                                        

                                                                            圖(1)

    匹配:在圖論中,一個匹配(matching)是一個邊的集合,其中任意兩條邊都沒有公共頂點。如下圖(2)紅色邊就是圖(1)的一個匹配:

                                                       

                                                                               圖(2)

    對於一個匹配中,還存在四個概念:匹配點、非匹配點、匹配邊、非匹配邊。所謂匹配點,即匹配邊的兩個頂點,如圖(2)中的頂點1和5就是匹配點,邊(1,5)就是匹配邊,而非匹配點和非匹配邊都是匹配點和匹配邊的對立,如圖(2)中,頂點2、3、4、6、7、8都是非匹配點,邊(2,5)、(1,7)、(3,5)、(3,6)、(4,7)、(4,8)都是非匹配邊。

    最大匹配:一個圖所有匹配中,所含匹配邊數最多的匹配,稱爲這個圖的最大匹配。圖(1)的一個最大匹配如下圖(3)紅色邊所示:

                                                             

                                                                                      圖(3)

    完全匹配:如果一個圖的某個匹配中,所有的頂點都是匹配點,那麼它就是一個完美匹配。圖(3)就是圖(1)的完全匹配。

   一般情況下,對任意無權二分圖,完全匹配不一定存在,但總會存在一個最大匹配。 那對於如圖(1)這樣的二分圖,是如何得到其最大匹配的呢?這裏就需要了解求二分圖最大匹配問題的匈牙利算法。


二、匈牙利算法

    首選說明兩個關於匈牙利算法的概念,交替路和增廣路

    交替路:從一個未匹配點出發,依次經過非匹配邊、匹配邊、非匹配邊…形成的路徑叫交替路。

    增廣路:從一個未匹配點出發,走交替路,如果途徑另一個未匹配點(出發的點不算),則這條交替路稱爲增廣路(agumenting path)。對於圖(2),從頂點2出發,經過頂點5,再到頂點1,再到頂點7就是一條增廣路,如下圖(4)所示,在這條增廣路中我們把匹配點和匹配邊都表示爲紅色,非匹配點和非匹配邊表示爲黑色:

                                              

                                                                                圖(4)

    由增廣路定義和圖(4)可知,增廣路有以下特性:(1)增廣路的起點和終點必須是非匹配點;(2)增廣路中非匹配邊比匹配邊多1。

    匈牙利算法的核心就是在原始二分圖中不停的找增廣路,直到找不到爲止,或二分圖中一邊的頂點遍歷完。具體的實現思路有兩種:DFS和BFS,即深度優先和廣度優先,下面給出DFS的實現思路:

    (1)對於初始二分圖,全部頂點爲非匹配點,全部邊爲非匹配邊,假設其分爲的2個頂點集合分別爲X和Y,則從X中第一個頂點開始,尋找Y中與該頂點連接的第一個頂點,由於這個連接頂點肯定是非匹配點,所以這條增廣路結束,將這兩個頂點和邊歸爲匹配點和匹配邊;

    (2)從X的第二個頂點接着開始找增廣路,具體爲,在Y中找該頂點的連接頂點,對於該連接頂點,其有兩種狀態

        (I)如果連接頂點是非匹配頂點,則同樣這條增廣路結束,將這兩個頂點歸爲匹配點,其邊歸爲匹配邊;

        (II)如果連接頂點是匹配頂點,則開始走其交替路,走交替路同樣有兩種結果:

            (a)如果在走交替路中遇到一個非匹配點,則這條增廣路結束,結束之後,有一個很重要的操作,就是需要對這條增廣路做“取反操作”,所謂增廣路的“取反”操作,就是將這條增廣路路徑中的非匹配邊變爲匹配邊,將匹配邊變爲非匹配邊;

            (b)如果在走交替路中沒有遇到非匹配頂點,而且這條路徑已經走完了,就從第二個頂點的下一個連接頂點再開始上述操作,直到找到一條增廣路才結束。

    (3)從X中下一個頂點繼續第(2)操作,尋找增廣路,直到沒有找到增廣路爲止;

注:如需匈牙利算法的代碼實現可訪問博文點擊打開鏈接

    根據上述匈牙利算法的思路,下面給出找出圖(1)的最大匹配圖(3)的過程如下所示:


三、結論

    上述例子也印證了匈牙利算法的核心思想就是不停的找增廣路,直到找不到爲止,最後得到的圖就是原始二分圖的最大匹配結果。但是,對於無權二分圖來說,匈牙利算法只能找到全局最優匹配解,而在實際問題中具體的局部匹配關係是不是符合實際情況是不能保證的。也就是說,基於匈牙利算的二分圖最大匹配只能找到全局的最大匹配數,這個最大匹配數是一定的,即使有多種最大匹配情況,但所得的最大匹配關係有可能並不是唯一的。

    如下圖所示二分圖:

    首先是標號爲“0”的原始二分圖,然後是標號爲“1”的有一個匹配邊的匹配;

                                                  

    其實是根據標號爲“1”的匹配進一步找增廣路得到的匹配邊爲2的匹配;



    再接着是,根據標號爲“(1)2_2”的匹配圖進一步找增廣路,從頂點3出發,得到三種匹配邊爲3的匹配,標號分別爲“((1)2_2)3_1”,“((1)2_2)3_2”,“((1)2_2)3_3”;




    再接着,根據匹配“((1)2_2)3_1”,“((1)2_2)3_2”,((1)2_2)3_3再進一步找增廣路,得到如下圖所示的標號分別爲”(((1)2_2)3_1)4_1“,”(((1)2_2)3_1)4_2“、”(((1)2_2)3_2)4_1“、”(((1)2_2)3_2)4_2“、”(((1)2_2)3_2)4_3“、”(((1)2_2)3_3)4_1“、”(((1)2_2)3_3)4_2“最大匹配。可以看這些最大匹配中,已經出現了相同的最大匹配。

    所以,通過匈牙利算法得到的最大匹配有可能不是唯一的。



    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章