Stable_matching problem

下面是男女喜欢的优先级顺序

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

如上图所示的表格对应文章开头的数据,我们可以得到输出

和表格结论一样

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值