下面是男女喜欢的优先级顺序
Men={'V':['A','B','C','D','E'],'W':['B','C','D','A','E'],'X':['C','D','A','B','E'],'Y':['D','A','B','C','E'],'Z':['A','B','C','D','E']}
Women={'A':['W','X','Y','Z','V'],'B':['X','Y','Z','V','W'],'C':['Y','Z','V','W','X'],'D':['Z','V','W','X','Y'],'E':['V','W','X','Y','Z']}
为了方便使用,我们转化为姓名和数字一一对应,男:1----n 女: 1----n
算法的核心思想:
INITIALIZE S to empty matching.
WHILE (some man m is unmatched and hasn't proposed to every woman)
w ← first woman on m's list to whom m has not yet proposed.
IF (w is unmatched)
Add pair m–w to matching S.
ELSE IF (w prefers m to her current partner m')
Remove pair m'–w from matching S.
Add pair m–w to matching S.
ELSE w rejects m.
RETURN stable matching S.
下面附上实现的代码:
姓名和数字转化:
def name_into_number(Men,Women):# Men{A:[B,C,D],} Women{B:{A,x,x}}
Men_number={}
Women_number={}
number_to_men={}
numer_to_women={}
count=0
for i in Men.keys():
Men_number[i]=count
number_to_men[count]=i
count+=1
count=0
for i in Women.keys():
Women_number[i]=count
numer_to_women[count]=i
count+=1
replace_man={}
replace_women={}
for i in Men.keys():
replace_man[Men_number[i]]=[]
for k in Men[i]:
replace_man[Men_number[i]].append(Women_number[k])
for i in Women.keys():
replace_women[Women_number[i]]=[]
for k in Women[i]:
replace_women[Women_number[i]].append(Men_number[k])
return replace_man,replace_women,number_to_men,numer_to_women
匹配:
def match(Men,Women):
unmatched_men=Queue.Queue()
count=0
for i in Men.keys():
count+=1
unmatched_men.put(i)
wife=[-1]*count
husband=[-1]*count
Men_order={} #rember the point of proposal women
for i in Men.keys():
Men_order[i]=0
for i in Women.keys():
length=len(Women[i])
inverse=[0]*length
for k in range(length):
inverse[Women[i][k]]=k
Women[i]=inverse
while not unmatched_men.empty():
m=unmatched_men.get()
w=Men[m][Men_order[m]]
Men_order[m] += 1
if husband[w]==-1:
wife[m]=w
husband[w]=m
elif husband[w]!=-1 and Women[w][husband[w]]>Women[w][m]:
wife[m]=w
unmatched_men.put(husband[w])
wife[husband[w]] = -1
husband[w]=m
else:
unmatched_men.put(m)
return wife,husband
输入输出:
def input_output(Men,Women):
replace_men,replace_women,number_to_men,numer_to_women=name_into_number(Men,Women)
wife,husband=match(replace_men,replace_women)
for i in range(len(wife)):
print (number_to_men[i],'--',numer_to_women[wife[i]] )
return
如上图所示的表格对应文章开头的数据,我们可以得到输出
和表格结论一样