GS匹配算法【多对一稳定匹配】Matlab实现

  GS匹配算法(多对一稳定匹配)

 此算法在matlab R2021a的环境下编写,如有疑问可评论或私信,感谢大家支持~

1.经典一对一算法

 代码如下:

man = readtable('match_list.xlsx',"ReadRowNames",true,"Sheet","Sheet1");
women = readtable('match_list.xlsx',"ReadRowNames",true,"Sheet","Sheet2"); 
M = {}; 
nonempty = man.Row; % 初始化
while ~isempty(nonempty)  % 有未匹配的m且偏好列表不为空时,do
    choice = randi(length(nonempty),1);  % 随机选择幸运儿
    m = nonempty{choice}  
    w = man{m,:}{1}(1);     % 随机给某个m分配偏好列表中的第一个w
    if isempty(M) || ~ismember(w, M(:,2))  % 如果w未匹配
        M = [M;{m,w}]  % update M
        freeman = setdiff(man.Row, M(:,1)); 
        nonempty = freeman(~ismissing(man(freeman,:)));  % update判断条件
    elseif ismember(w, M(:,2))  % 如果w已匹配
        index = ismember(M(:,2),w); 
        m_prime = M{index,1};   %找到w现在匹配的人
        m_rank = find(num2str(women{w,:})==m);  
        m_prime_rank = find(num2str(women{w,:})==m_prime);  % w的偏好列表排名
        if m_prime_rank < m_rank  % 如果m'更强
            man{m,:}{1}(1) = '';  % 删掉m偏好列表中的第一个
        else
            M{index,1} = m    % 如果m更强, 把m'换乘m
            man{m_prime,:}{1}(1) = '';    % 从m'的list里删掉w
            freeman = setdiff(man.Row, M(:,1));
            nonempty = freeman(~ismissing(man(freeman,:))); % update 判断条件
        end
    end
end

代码说明 

        man和women两个表分别放在两个Sheet,如下图所示,按照图中格式建立好偏好列表。此方法适用人数较少的匹配,如人数较多,则需对代码进行简要修改,如有需要可评论或者私信。

1 ceadb
2 abcde
3 adceb
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
稳定匹配算法是一种经典的算法,用于解决匹配问题。其中,gs(Gale-Shapley)算法是最为常见的一种稳定匹配算法,通过迭代的方式,将多对男女进行配对,使得每对配对都是稳定的。 在Python中,我们可以使用以下方式实现gs稳定匹配算法: 首先,创建两个队列,分别为男性和女性的队列,分别用man_list和woman_list来表示。然后,对于每个男性和女性,我们可以定义一个“prefer”列表,用于记录该人对对方倾向程度的排序。 接下来,我们创建一个空的字典,用于保存每个男性与其配对的女性的关系。我们将字典命名为matches。然后,创建一个空的字典,用于保存每个女性与其配对的男性的关系。将该字典命名为inverse_matches。 然后,我们开始进行迭代,直到所有男性都有配对为止。在每一轮迭代中,对于每个男性,我们取出他还未提出过请求的最喜欢的女性。然后,对于这个女性,我们判断她是否已经有了男性的配对。如果是,我们比较该女性的现有男性和当前男性,如果当前男性更受女性喜欢,则我们将当前男性与该女性配对,并更新matches和inverse_matches。如果不是,我们直接将当前男性与该女性配对,并更新matches和inverse_matches。 最后,当所有男性都有配对时,我们可以返回matches字典作为最终的稳定匹配结果。 以上就是用Python实现gs稳定匹配算法的简要步骤。当然,具体的实现细节可能会根据实际情况有所不同,但是核心思想和步骤是相似的。希望能对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值