一、相關的定義
1.有一個男士集合和一個女士集合。每個男士都有一個優先級列表,把女士按潛在結婚對象進行優先級排序。
同樣的,女士也有一個對潛在結婚對象的優先級列表。
婚姻匹配:
一個婚姻匹配M是一個包含n個(m,w)對的集合,每一對的成員都按照一對一的模式從兩個不相交的n元素集合Y和X中選出。也就是說,Y中的每個男士m都只和X中的一位女士w配對,反正亦然。相當於一個二分圖中,邊來連接可能結婚的對象,兩邊的頂點代表X和Y,婚姻匹配也是圖中的一個完美匹配。
婚姻的穩定:如果在匹配M中,,男士m和女士w沒有匹配,但他們都更傾向對方,而不是M中彼此的伴侶,那么(m,w)稱為受阻對,如果婚姻匹配存在受阻對,那么我們說婚姻是不穩定的,如果不存在,則婚姻是穩定的。
二、穩定婚姻算法
輸入:含有一個n個男士的集合和一個n個女士的集合,以及各自選擇結婚對象的優先級。
輸出:一個穩定的婚姻匹配關系
1. 開始所有的男生和女士都是自由的。
2. 如果存在自由男生,任選一個男生,執行下面步驟:
(1) 求婚:選中的男士m向w求婚。w是優先級最高的,而且沒有拒絕過他。
(2) 回應:如果w是自由的,她接受求婚,如果w不是自由的,她把m和當前的配偶作比較,如果更喜歡m接受求婚,否則拒絕。
3. 返回n個配對的集合。
三、代碼的實現
因為這次的實現比較簡單,所以用了matlab來編寫函數
//dequeue函數
function [Q] = dequeue(Q )
n=size(Q,2);
for i=1:n-1
Q(i)=Q(i+1);
end
Q(n)=[];
end
//enqueue函數
function [ Q] = enqueue( Q ,x)
n=size(Q,2);
Q(n+1)=x;
end
//判斷隊列否為空
function [ flag] = empty( Q)
flag=false;
if size(Q,2)==0
flag=true;
end
end
//判斷男生和女士現有配偶的優先級順序,如果排在該配偶前面
function [j] = shunxu(B,x,y)
%%輸入一個矩陣的第x行,判斷輸入的值y在這行的位置
n=size(B ,2);
j=1;
for i=1:n
j=j+1;
if (B(x,i)==y)
break;
end
end
end
//婚姻匹配函數
function [ D ] = Match( A,B )
%A,B分別是男女的優先選擇矩陣
%返回穩定的匹配
n=size(A,2);
B1=zeros(1,n); %B1女士是否已經匹配,儲存匹配的男士編號
for i=1:n
Q(i)=i;
end %Q為待匹配的男士的隊列,初始化為全部男士
while(~empty(Q))
m=Q(1);Q=dequeue(Q);
for i=1:n
k=A(m,i); %m男士第i喜歡的是k女士
if(B1(k)~=0) %如果k女士已經匹配了
if(shunxu(B,k,B1(k))>(shunxu(B,k,m))) %且如果第m個男士的優先級比現有配偶要高
Q=enqueue(Q,B1(k));
B1(k)=m;
break;
end
else %如果沒匹配
B1(k)=m;
break;
end
end
end
a=1:n;
D=[a;B1]; %%這里輸出的是1到n編號女士對應的配偶的編號
End
輸入說明:這里的A,B存儲的是編號,而不是第一喜歡的人
Matlab的文件輸入輸出問題:
四、案例的測試
用書上那個例子:見算法設計與分析基礎293頁
性別 |
編號 |
1 |
2 |
3 |
男士 |
Bob |
Jim |
Tom |
|
女士 |
Ann |
Lea |
Sue |
那么男士的優先級順序為: 女士的優先級順序為:
A= [2,1,3 B= [2,3,1
2,3,1 3,1,2
3,2,1] 2,3,1]
A的每一行分別是Bob ,Jim 和Tom心中對理想對象的優先級順序
同理,B的每一行分別是Ann,Lea和Sue心中對理想對象的優先級順序。
>> Match(A,B)
ans =
1 2 3
1 3 2
可以從結果分析,女士Ann和Bob結婚,女士Lea和Tom結婚,女士Sue和Jim結婚
和書上的結果是一樣的。
五、算法的局限性
1.輸出的局限性:該算法顯然會輸出一個穩定的匹配,在這個匹配中,所有的男生和他們的第一選擇相配,但是對女生並不如此。例如上面的從B中知道Ann最喜歡的是2號男生Jim,第三喜歡才是BOb,然后Bob第二喜歡的是Ann,,男生可以不斷去表白,選擇自己比較喜歡的男生,女生就只能比較男友和更換男友,這樣,女生可能等不到最喜歡的男友的表白,游戲就結束了。
如果想要女生占優勢,那么需要把女士和男生的輸入順序對換過來。
2.時間的效率性改進:為了快速求出所有的穩定匹配結果,提出了基於先序遍歷森林的快速枚舉算法。由Gale-Shapley算法的性質得到一個定理及其推論,利用得到的推論對算法做了進一步改進和優化。在滿足推論的特定條件下,提高了算法的執行效率
六、具體的應用
應用於測試資源匹配的婚姻穩定算法改進
下一代自動測試系統中將實現測試資源的動態分配,我們使用婚姻穩定(Stable Marriage)算法來解決測試過程中測試資源與被測設備的匹配問題,使用擇偶傾向隊列縮減模型對求解典型"婚姻穩定"問題的Gale-Shapley(G-S)算法進行優化.該模型中使用擇偶傾向隊列描述婚姻穩定問題中匹配優先順序,該隊列會隨着算法進行逐漸縮短,在簡化數據規模的同時優化了處理婚姻穩定問題的G-S算法處理流程,改進后算法實現無效匹配請求的預先清除,從而使用后來請求優先的原則對匹配請求進行處理機制,對原有算法的時間空間成本實現了優化,適應了測試資源匹配任務的需求.
參考文獻:孫昱 付少波 張天培 李長安 《應用於測試匹配婚姻算法的優化改進》