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 |