使用Erlang訊息機制實現穩定婚姻問題

banq發表於2015-03-14
如何在非同步訊息傳遞中實現穩定婚姻Stable Marrige問題,這是使用Erlang編碼的原始碼實現。

Solving the Stable Marriage problem in Erlang | th

穩定婚姻問題是這樣:
假設有n個男人和n個女人,每位男士都要和所有的女士進行短暫的單獨交流,併為她們打分,然後按照喜歡程度,對每一位女士進行排序;同樣的,每位女士也要對所有男士進行打分和排序。每個男人只能配一個女人,如果沒有一個人喜歡兩個人,那麼所有這些婚姻都是穩定的。

對於這個問題描述,假設在我們系統中有三個模組:
1.一個模組代表男人
2.一個模組代表女人
3.一個模組代表好娘中介機構,複製給男女配對策劃的。

如下圖:

[img index=1]

注意上圖中每一個訊息過程,首先,策劃者orchestrator向兩個男人發出訊息表示開始搶女人,最左邊的男人提議了一個女人,這個女人接受了這個男人,男人向策劃者報告自己配對了一個女人,下面競爭來了,左邊第二個男人也看中了這個女人,這個女人發現第二個男人比第一個更好,接受了第二個男人,同時反悔拒絕了第一個男人,第二個男人高興地向策劃者報告自己配對成功一個女人,第一個男人沮喪地報告自己沒有配對。

男人向女人求愛propose這個過程必須是同步的,一直等到他能得到一個求愛結果的答案,但是所有其他的聯絡都是非同步的。

注意Erlang的OTP-sense的同步呼叫還和通常Java/C中透過堵塞執行緒呼叫實現的同步不同。這裡的同步通訊還是透過非同步訊息傳遞,但是呼叫過程是非同步等待直到獲得一個回應才繼續向下執行。

Erlang的原始碼:Github


相關文章