圖論算法:如何找到最適合自己的另一半 ?
什么是算法?
每當有人問我這樣的問題,我總會引用下面這個例子。
假如你是一個媒人,有若干名單身男子登門求助,還有同樣多的單身 女子也來征婚。如果你已經知道這些女孩兒在每個男孩兒心目中的排名,以及男孩兒們在每個女孩兒心目中的排名,那么你該怎樣為他們牽線配對呢?
最好的配對方案當然是,每個人的另一半正好都是自己的“第一選擇”。
這當然很完美,但絕大多數情況下都不可能實現。
比方說,男 1 號的最愛是女 1 號,而女 1 號的最愛不是男 1 號,這兩個人的最佳選擇就不可能被同時滿足。如果出現了好幾位男士的最愛是同一個女孩兒的情況,這幾位男士的首選也不會同時得到滿足。
當這種最為理想的配對方案無法實現時, 怎樣的配對方案才能令人滿意呢?
其實,找對象不見得需要那么完美,和諧才是關鍵。
如果男 1 號和女 1 號各有各的對象,但男 1 號覺得女 1 號比自己的現任更好,女 1 號也覺得對方比自己的現任更好,那么兩人就可能扔下自己現在的另一半,走在一起——因為這個結果對他們兩人都更好一些。
如果在一種男女配對方案中出現了這種情況,我們就說這種配對方案是不穩定的。作為一個紅娘,你深深地知道,介紹對象就怕婚姻關系不穩定。因此,在給客戶牽線配對時,雖然不能讓每個人都得到最合適的,但婚姻搭配必須得是穩定的。
現在,我們的問題就是:穩定的婚姻搭配總是存在的嗎?如果存在,又應該怎樣尋找出一個穩定的婚姻搭配?
為了便於分析,下面我們做一些約定。我們用字母 A、B、C 對男性進行編號,用數字 1、2、3 對女性進行編號。我們把所有男性從上到下列在左側,括號里的數字表示每個人心目中對所有女性的排名;再把所有女性列在右側,用括號里的字母表示她們對各位男性的偏好。
圖 1 所示就是有 2 男 2 女的一種情形,每個男的都更喜歡女 1 號,但女 1 號更喜歡男 B,女 2 號更喜歡男 A。若按 A—1、B—2 進行搭配,則男 B 和女 1 都更喜歡對方一些,這樣的婚姻搭配顯然是不穩定的。但若換一種搭配方案(如圖 2 所 示),這樣的搭配就是穩定的了。
圖 1 一個不穩定的婚姻搭配(男 B 和女 1 都不滿意現任伴侶)
圖 2 一個穩定的婚姻搭配
可能很多人會立即想到一種尋找穩定婚姻搭配的策略:不斷修補當前搭配方案。如果兩個人互相之間都覺得對方比自己當前的伴侶更好,那就讓這兩個人成為一對,剛剛被甩的那兩個人組成一對。如果還有想要在一起的男女對,就繼續按照他們的願望對換情侶,直到最終消除所有的不穩定組合。
容易看出,應用這種“修補策略”所得到的最終結果一定滿足婚姻的穩定性,但這種策略的問題在於,它不一定有一個“最終結果”。按照 上述方法反復調整搭配方案,最終有可能陷入一個死循環,無法得出一個確定的方案(如圖 3 所示)。
圖 3 應用“修補策略”可能會產生死循環
1962年,美國數學家戴維·蓋爾(David Gale)和羅伊德·沙普利(Lloyd Shapley)發明了一種尋找穩定婚姻的策略。
不管男女各有多少人,也不管他們各自的偏好如何,應用這種策略后總能得到一個穩定的婚姻搭配。換句話說,他們證明了穩定的婚姻搭配總是存在的。
有趣的是,這種策略反映了現實生活中的很多真實情況。
在這種策略中,男士將一輪一輪地去追求他中意的女子,而女子可以選擇接受或拒絕相應的追求者。第一輪,每位男士都選擇向自己最心儀的女子表白。
此時,每個女子可能面對的情況有三種:沒有人向她表白,只有一個人向她表白,有不止一個人向她表白。
在第一種情況下,這個女子什么都不用做,只需繼續等待;在第二種情況下,接受那個人的表白,答應暫時和他做男女朋友;在第三種情況下,從所有追求者中選擇自己最中意的那一位,答應暫時和他做男女朋友,並拒絕其他所有的追求者。
第一輪結束后,有些男士已經有女朋友了,有些男士仍然單身。第二輪,每位單身男士都從所有尚未拒絕他的女子中選出自己最中意的,並向她表白,無論她現在是否單身。
和第一輪一樣,每位女子需要從表白者中選擇自己最中意的一位,拒絕其他追求者。
注意,如果這個女子已經有男朋友,當遇到更好的追求者時,她必須拋開現任男友,投向新的追求者的懷抱。這樣,一些單身男士將會找到女友,而那些已經有女友的也可能會恢復單身。
在以后的每一輪中,單身的男士繼續按照心目中的排序追求下一個女子,而女子則從包括現男友在內的所有追求者中選擇自己最中意的一個,並對其他人說不。這樣一輪一輪地進行下去,直到某個時候所有人都不再單身,接下來的一輪將不會發生任何表白,整個過程也就自動結束 (如圖 4 所示)。此時的婚姻搭配就一定是穩定的了。
圖 4 應用上述策略,三輪之后將得出穩定的婚姻搭配
這個策略會不會像之前的修補法一樣,出現永遠也無法終止的情況呢?
不會。
下面我們將說明,隨着輪數的增加,總有一個時候所有人都能配上對。
由於在每一輪中,至少會有一個男士向某個女子告白,因此總的告白次數將隨着輪數的增加而增加。倘若整個流程一直沒有因所有人都配上對而結束,最終必然會出現某個男子追遍了所有女孩兒的情況。而一個女孩兒只要被人追過一次,以后就不可能再單身了。既然所有女孩兒都被這個男人追過,就說明所有女孩兒現在都不是單身,也就是說此時所有人都配上對了。
接下來,我們還需要證明,這樣得出的配對方案確實是穩定的。
首先注意到,隨着輪數的增加,一個男人追求的對象總是越來越糟,而一個女孩兒的男友只可能變得越來越好。假設男 A 和女 1 各自有各自的對象,但比起現在的對象來,男 A 更喜歡女 1。
因此,在此之前男 A 肯定已經跟女 1 表白過。既然女 1 最后沒有跟男 A 在一起,說明女 1 拒絕了男 A,也就是說她有了比男 A 更好的男人。這就證明了,兩個人雖然不是一對,但都覺得對方比自己現在的伴侶好,這樣的情況絕不可能發生。
我們把用來解決某種問題的一個策略,或者說一個方案,或者說一個 處理過程,或者說一系列操作規則,或者更貼切的,一套計算方法,叫作“算法”(algorithm)。
上面這個用來尋找穩定婚姻的策略就叫作“蓋爾–沙普利算法”(Gale-Shapley algorithm),有些人也管它叫“延遲認可算法”(deferred acceptance algorithm)。
蓋爾–沙普利算法帶給我們很多啟發。作為一個為這些男女牽線的媒人,你並不需要親自使用這個算法來計算穩定匹配,甚至根本不需要了解每個人的偏好,而只需按照這個算法組織一個男女配對活動即可。你要做的僅僅是把算法流程當作游戲規則告訴大家,游戲結束后會自動得到一個大家都滿意的婚姻匹配。
整個算法可以簡單地描述為:每個人都去做自己想做的事情。
對於男性來說,從最喜歡的女子開始追起是順理成章的事;對於女性來說,不斷選擇最好的男子也正好符合她的利益。因此,大家會自動遵守游戲規則,無須擔心有人虛報自己的偏好。
歷史上,這樣的“配對游戲”還真有過實際應用,並且更有意思的是, 這個算法的應用居然比算法本身的提出還早 10 年。
早在 1952 年,美國就開始用這種辦法給醫學院的學生安排工作,這被稱為“全國住院醫師配對項目”。
配對的基本流程就是,各醫院從尚未拒絕這一職位的醫學院學生中 選出最佳人選並發送聘用通知,當學生收到來自各醫院的聘用通知后,系統會根據他所填寫的意願表自動將其分配到意願最高的職位,並拒絕掉其他的職位。如此反復,直到每個學生都分配到了工作。
當然,那時人們並不知道這樣的流程可以保證工作分配的穩定性,只是憑直覺認為這是很合理的。直到 10 年之后,蓋爾和沙普利才系統地研究了這個流程,提出了穩定婚姻問題,並證明了這個算法的正確性。
這套理論成功地解決了諸多市場資源配置問題,羅伊德·沙普利也因此獲得了 2012 年諾貝爾經濟學獎。很可惜,戴維·蓋爾沒能與他共享這一榮譽——他在 2008 年就已經離開人 世了。
蓋爾–沙普利算法還有很多有趣的性質。比如說,大家可能會想,這種男追女女拒男的方案對男性更有利還是對女性更有利呢?答案是,這種方案對男性更有利。
事實上,穩定婚姻搭配往往不止一種,然而上述算法的結果可以保證,每一位男性得到的伴侶都是所有可能的穩定婚姻搭配方案中最理想的,同時每一位女性得到的伴侶都是所有可能的穩定婚姻搭配方案中最差的。受篇幅限制,我們略去證明的過程。
當然,為了得到一種對女性最優的穩定婚姻搭配,我們只需要把整個算法反過來,讓女孩兒去追男孩兒,男孩兒拒絕女孩兒就行了。
這個算法還有一些局限性。例如,它無法處理 2𝑛 個人不分男女的穩定搭配問題。
一個簡單的應用場景便是宿舍分配問題:假設每個宿舍住兩個 人,已知 2𝑛 個學生中每一個學生對其余 尋找一個穩定的宿舍分配?此時,蓋爾 2𝑛 − 1 個學生的偏好評價,如何 –沙普利算法就不再有用武之地了。
而事實上,宿舍分配問題中很可能根本就不存在穩定的搭配。例如,有 A、 B、C、D 四個人,其中 A 把 B 排在第一,B 把 C 排在第一,C 把 A 排在第 一,而且他們三人都把 D 排在最后。容易看出,此時一定不存在穩定的宿舍分配方案。倘若 A、D 同宿舍,B、C 同宿舍,那么 C 會認為 A 是更好的室友(因為 C 把 A 排在了第一),同時 A 會認為 C 是更好的室友(因為他 把 D 排在了最后)。同理,B、D 同宿舍或者 C、D 同宿舍也都是不行的,因而穩定的宿舍分配是不存在的。
此時,重新定義宿舍分配的優劣性便是一個更為基本的問題。穩定婚姻問題還有很多其他的變種,有些問題至今仍然沒有一種有效的算法。這些問題都是圖論當中非常有趣的話題。