例:某学校有3个系,共200名学生,甲系103人,乙系63人,丙系34人,使用Q值法分配法、“Q值分配法+D’Hondt” 分配21个席位。
%Q值分配法
clc
clear
all=200;
all_des=21;
peo=[103 53 43];
p=floor(peo./all*all_des);
rest=all_des-sum(p);
for i=1:rest
Q=peo.^2./(p.*(p+1));
[M,I]=max(Q);
p(I)=p(I)+1;
end
p
但是Q值分配法在名额较少或者参与分配部门比较多的时候,可能存在较大不公平,故提出来用"D‘Hondt +Q值分配法“,代码如下。具体讲解见参考资料。
%D'Hondt +Q值分配法
clc
clear
all=200;
all_des=21;
peo=[103 53 43];
[m,n]=size(peo);
p1=zeros(m,n); %每部门分配的名额
[M1,I1]=max(peo);
p1(I1)=p1(I1)+1; %先把名额分配给人数最多的一组
while sum(p1)<all_des %先用D'Hondt法,逐一分配名额,直至每个系都有至少一个分配名额或分配名额数达到要求值
if ismember(0,p1)
[M2,I2]=max(peo./(p1+1));
p1(I2)=p1(I2)+1;
else
break
end
end
if sum(p1)==all_des
disp(['使用D\''Hondt方法,且分配名额为',num2str(p1)]);
return
else %使用Q值分配方法
p=floor(peo./all*all_des);
rest=all_des-sum(p);
for i=1:rest
Q=peo.^2./(p.*(p+1));
[M,I]=max(Q);
p(I)=p(I)+1;
end
disp(['使用q值方法,且分配名额为',num2str(p)]);
end
参考资料:
https://wenku.baidu.com/view/efe0e5b702d276a201292e0c.html