下面是男女喜欢的优先级顺序
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
如上图所示的表格对应文章开头的数据,我们可以得到输出
和表格结论一样