简单来说DA算法就是用来进行匹配的,而且匹配后的结果是很稳定的。废话少说直接上代码。
Here we assume that the men
are the suitors and the women the suitees.
procedure stable(M1, M2,...,Ms, W1, W2,...,Ws:
preference lists)
for i := 1 to s
mark man i as rejected
for i := 1 to s
set man i’s rejection list to be empty
for j := 1 to s
set woman j ’s proposal list to be empty
while rejected men remain
for i := 1 to s
if man i is marked rejected then add i to the
proposal list for the woman j who ranks highest
on his preference list but does not appear on his
rejection list, and mark i as not rejected
for j := 1 to s
if woman j ’s proposal list is nonempty then
remove from j ’s proposal list all men i
except the man i0 who ranks highest on her
preference list, and for each such man i mark
him as rejected and add j to his rejection list
for j := 1 to s
match j with the one man on j ’s proposal list
{This matching is stable.}
function [pairing_vec,conv_vec,time,sta]=DAalg(PL_matr1,PL_matr2)
%time--叠代次数;sta--稳定性
[m1,n1] = size(PL_matr1);%woman
[m2,n2] = size(PL_matr2);%man
pairing_vec = zeros(m1,m2);%初始化配对结果
number_min = min(m1,m2);%求两个列表中的较小值,求人数少的一方
%number_max = max(m1,m2);%求两个列表中的较大值
% man_flag = zeros(1,m2);%标记mani是否配对
% woman_flag = zeros(1,m1);%标记womanj是否配对
man_reject = ones(1,m2);%标记man被拒绝
man_rejection_list = zeros(m2,n2);%清空man的拒绝列表
woman_proposal_list = zeros(m1,n1);%清空woman的可选列表
% index = 0;index1 = 0;index2 = 0;
num = 1;
while( number_min > nozero(pairing_vec) )%人数少的一方的数目不等于配对矩阵中的非零数目时进行循环配对
%index1 = 0;index2 = 0;
for i = 1:m2
mark_reject = man_reject(1,i);
index1 = 0;%index2 = 0;
if (mark_reject == 1) %&&(man_flag(1,i) == 0)) %如果mani被拒绝
for j = 1:m1
if (man_rejection_list(i,j) == 0) %&&(woman_flag(1,j) == 0))%如果womanj未拒绝mani
index = PL_matr2(i,j); % 统计mani对womanj的喜欢程度
if index > index1
index1 = index;
%index2 = j;
end
man_reject(1,i) = 0; %标记mani为未拒绝
%break;
end
end
for j = 1:m1
%if woman_flag(1,j) == 0
if PL_matr2(i,j) == index1
woman_proposal_list(j,i) = 1;%找到对mani喜欢程度最大的womanj,并将mani加入womanj的可选列
%man_reject(1,i) = 0; %标记mani为未拒绝
%break;
else
continue;
end
%end
end
else
continue;
end
end %生成woman_proposal_list
%index1 = 0;index2 = 0;
for j = 1:m1
woman_proposal = sum(woman_proposal_list(j,:));
index1 = 0 ;%index2 = 0 ;
if (woman_proposal ~= 0)%&&(woman_flag(1,j) == 0)) %如果woman的可选列表大于0,即有可选对象
for i = 1:m2
%if man_flag(1,i) == 0
if (woman_proposal_list(j,i) == 1)
index = PL_matr1(j,i); % 统计mani对womanj的喜欢程度
if (index > index1) %&& (man_flag(1,i) == 0))
index1 = index;
%index2 = i;
end %找到对womanj喜欢程度最大的mani
end
%end
end
for i = 1:m2
%if man_flag(1,i) == 0
if (woman_proposal_list(j,i) == 1)
if (PL_matr1(j,i) ~= index1)%将对womanj除了喜欢程度最大的man之外的所有man进行移除
woman_proposal_list(j,i) = 0; %从选择列表中移除
man_reject(1,i) = 1;%标记为被拒绝
man_rejection_list(i,j) = 1;%加入被拒绝列表
else
continue;
end
else
continue;
end
% else
% continue;
% end
end
else
continue;
end
woman_proposal = sum(woman_proposal_list(j,:));
index3 = 0;
index4 = 0;
if(woman_proposal > 1)%女生的可选列表不止有一个,但是此时只能保留一个
for i = 1:m2
if (woman_proposal_list(j,i) == 1)
index2 = PL_matr1(j,i);
if index2 > index3
index3 = index2 ;
index4 = i;
end
else
continue;
end
end
for i = 1:m2
if(i ~= index4)
woman_proposal_list(j,i) = 0; %从选择列表中移除
man_reject(1,i) = 1;%标记为被拒绝
man_rejection_list(i,j) = 1;%加入被拒绝列表
end
end
end
end %保证woman_proposal_list每一行只有一个1
% for i = 1:m2
% man_proposal = sum(woman_proposal_list(:,i));
% index5 = 0;
% if man_proposal > 1
% for j = 1:m1
% if woman_proposal_list(j,i) == 1
% index6 = PL_matr2(i,j);
% if index6 > index5
% index5 = index6;
% index7 = j;
% end
% end
% end
% for j = 1:m1
% if woman_proposal_list(j,i) == 1
% if j ~= index7
% woman_proposal_list(j,i) = 0;
%
% end
% end
% end
% end
% end %保证woman_proposal_list每一列只有一个1
% for i = 1:m2
% for j = 1:m1
% %if (woman_proposal_list(j,i) == 1) %&&(man_flag(1,i) == 0)&&(woman_flag(1,j) == 0)
% pairing_vec(j,i) = woman_proposal_list(j,i); %womanj与mani配对成功
% %man_reject(1,i) = 0;
% %woman_flag(1,j) = 1;
% %end
% end
% end
pairing_vec = woman_proposal_list;%%进行配对
%man_rejection_list = zeros(m2,n2);%清空man的拒绝列表
%woman_proposal_list = zeros(m1,n1);%清空woman的可选列表
conv_vec = pairing_vec;
%
num = num+1;
%
% fprintf('匹配%d次:\n',num-1);
%
% [row,col]=size(conv_vec);
% fprintf('conv_vec= \n');
% for i=1:row
% fprintf(' ');
% for j=1:col
% fprintf('%d ',conv_vec(i,j));%直接输出到屏幕;类似于C语言的输出格式??
% end
% fprintf(' \n');
% end
% x(num-1) = num-1;
% y(num-1) = nozero(pairing_vec);
%firgue1(1,num) = nozero(pairing_vec);
% if firgue(1,num - 1) == firgue(1,num)
% for j = 1:m2
% for i = 1:m1
% if man_flag(1,i) == 0 && woman_flag(1,j) == 0
% man_rejection_list(i,j) = 0;
% end
% end
% end
% end
end
time = num;
sta1 = 0;
sta2 = 0;
for i = 1:m1
for j = 1:m2
if (woman_proposal_list(i,j) == 1)
sta1 = sta1+woman_proposal_list(i,j)*PL_matr1(i,j);
end
end
end
for i = 1:m2
for j = 1:m1
if (woman_proposal_list(i,j) == 1)
sta2 = sta2+woman_proposal_list(i,j)*PL_matr2(i,j);
end
end
end
sta = sta1 + sta2;
% sta = sum(sum(PL_matr1*woman_proposal_list))+sum(sum(PL_matr2*(woman_proposal_list')));
% plot(x,y);
function result=nozero(A) %求矩阵中非零个数的函数
B = (A~=0);
result=sum(B(:));
end
end
Num = 6;
M = zeros(Num,Num);
F = zeros(Num,Num);
for i=1:Num
M(i,:) = randperm(Num);
F(i,:) = randperm(Num);
end
生成的两个矩阵分别如下
再运行
[pairing_vec,conv_vec,time,sta]=DAalg(M,F)
得到结果如下
好了到这里就结束了,如有问题请多指正。
因篇幅问题不能全部显示,请点此查看更多更全内容