[python3]稳定匹配算法实现和优化

本文对比并精简了Gale-Shapely算法的实现,通过更简洁的代码实现了同样的稳定匹配结果,减少了变量使用和数据交换,更贴近‘延迟接受’算法的精髓。

问题的描述

在这里就不赘述了,你能搜到这篇文章,那肯定知道只算法的背景是啥

解决思路

  1. 男生向还未拒绝其的女生中选出优先级最高的,并向其求婚
  2. 女生如果没有已经被优先级更高的男生求婚,则答应(女生以后可以反悔)。 如果反之,则拒绝
  3. 对此步骤进行loop,直到没有求婚发生

这篇文章,讲一个自己实现的GS算法的版本

看过一些博文,比如这篇文章 https://blog.youkuaiyun.com/lonfee88/article/details/6678190

文章使用的代码

上面那篇文章使用的代码是这样的,很清晰。

def find_stable_matching(man_preferences, woman_preferences):
    """
    Gale-Shapely Algorithm
    :param man_preferences:
    :param woman_preferences:
    :return:
    """

    length = len(man_preferences)
    is_man_free = [True] * length
    is_woman_free = [True] * length
    isManProposed = [[False for i in range(length)] for j in range(length)]
    match = [(-1, -1)] * length

    while True in is_man_free:
        indexM = is_man_free.index(True)
        if False in isManProposed[indexM]:
            indexW = -1
            for i in range(length):
                w = man_preferences[indexM][i]
                if isManProposed[indexM][w] is False:
                    indexW = w
                    break
            isManProposed[indexM][indexW] = True

            if is_woman_free[indexW] is True:
                is_woman_free[indexW] = False
                is_man_free[indexM] = False
                match[indexM] = (indexM, indexW)
            else:
                indexM1 = -1
                for j in range(length):
                    if match[j][1] == indexW:
                        indexM1 = j
                        break

                if woman_preferences[indexW].index
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值