且,这种对已有方法改进的思想很有启发意义。
改进:本文中只给出了尾数法对3个宿舍的名额分配程序,对不定数量宿舍的分配没能程序实现,是可以改进的。 参考文献
[ 1 ] 姜启源等 数学建模[M](第三版)北京高等教育出版社,2004.24—27. [ 2 ] 岳林 关于Q值法的一种新定义[J]. 系统工程.1995,13(4):70—73. [ 3 ] 高尚 席位分配的最大熵法[J].数学的实践与认识,1996,26(2):73—75.
[ 4 ] 吴承祯,洪伟 资源公平分配的遗传算法研究[J].运筹与管理,1998,7(2):23—28. [ 5 ] 吴黎军 名额分配问题中的?2拟合法[J].生物数学报,1995,10(3):77—81.
[ 6 ] 严余松 席位分配问题的0-1规划模型[J].系统工程,1996,14(5):51—53. [ 7 ] 林建良 席位分配的最小极差法[J].华南理工大学学报,2001,29(1):21—23.
[ 8 ] 杜跃鹏 杜太生 席位分配的最大概率法[J].数学的实践与认识,2003,33(7):15—19. [ 9 ] 王秀莲 席位分配问题的相对尾数法[J].数学的实践与认识,2007,37(9):81—85. 附录
Balinsky & Young不可能定理
公理 1 (份额单调性) 一个州人口的增加不会导致它失去席位。
公理 2 (无偏性) 在整个时间上平均, 每个州应得到它自己应分摊的份额。 公理 3 (席位单调性) 总席位增加不会导致某个州名额减少。
公理 4 (公平分摊性) 任何州的席位数都不会偏离其比例的份额数。
公理 5 (接近份额性) 没有从一个州到另一个州的名额转让会使得这两个州都接近它们应得的份额。
程序:
1 函数bili.m
function [me,m]=bili(n,N,M) me=n.*(M/N); m=floor(me); i=length(n);
fprintf('按比例分配的结果 : \\n'); for j=1:i
fprintf('第 %g 个宿舍的人数为: %g \\n',j,m(j)); end
2 函数guanli.m
function guanli(e,m,M) [maxe,j]=max(e);
fprintf('给第 %g 个宿舍再分一个名额',j); m(j)=m(j)+1; e(j)=0;
if sum(m)==M
fprintf('\\n\\n\\n按比例加惯例法分配的结果是 : \\n'); for i=1:length(m)
fprintf('第 %g 个宿舍名额为 : %g\\n',i,m(i)); end else
guanli(e,m,M); end
3 函数biliguanli.m function biliguanli()
n=input('各宿舍人数 输入格式[ number ] :'); N=sum(n);
M=input('输入总席位数 :'); [me,m]=bili(n,N,M); e=me-m; if e~=0
guanli(e,m,M); else
fprintf('\\n\\n\\n按比例加惯例法分配的结果是 : \\n'); for i=1:length(m)
fprintf('第 %g 个宿舍名额为 : %g\\n',i,m(i)); end end
4 函数qzhi.m
function qzhi(q,m,M) [maxq,j]=max(q);
fprintf('给第 %g 个宿舍再分一个名额\\n',j); m(j)=m(j)+1; q(j)=0;
if sum(m)==M
fprintf('\\n\\n\\n按Q值法分配的结果是 : \\n'); for i=1:length(m)
fprintf('第 %g 个宿舍名额为 : %g\\n',i,m(i)); end else
qzhi(q,m,M); end
5 函数Qzhifa.m function Qzhifa()
n=input('输入各宿舍人数 格式为:[ number ] :'); N=sum(n);
M=input('输入总席位数 :'); [me,m]=bili(n,N,M);
fprintf('各宿舍的Q值为:\\n')
for i=1:length(n)
q(i)=n(i)^2/(m(i)*(m(i)+1)); fprintf('%g\\n',q(i)); end
fprintf('按Q值分配的结果 : \\n'); if me~=m qzhi(q,m,M); else
fprintf('\\n\\n\\n按Q值法分配的结果是 : \\n'); for i=1:length(m)
fprintf('第 %g 个宿舍名额为 : %g\\n',i,m(i)); end end
6 函数 dhondt.m function dhondt()
n=input('各宿舍人数 输入格式[ number ] :'); N=sum(n);
M=input('输入总席位数 :'); nm=0;
k=length(n); m(k)=0; s=0;
for i=1:M for j=1:k
s=(i-1)*k+j; nm(s)=n(j)/i; end end
fprintf('按 D''hondt分配顺序为:\\n\\n') for i=1:M
[maxd,j]=max(nm); l=mod(j,k); if l==0 l=k; end
fprintf('分给第 %g 个宿舍一个名额\\n',l); m(l)=m(l)+1; nm(j)=0; end
fprintf('分配结果:\\n'); for i=1:k
fprintf('第 %g 个宿舍 %g 个名额\\n',i,m(i)); end
7 函数weishufa3.m function weishufa3()
n=input('输入3个宿舍人数 输入格式[ number ] :'); N=sum(n);
M=input('输入总席位数 :'); [ms,m]=bili(n,N,M); s=ms-m; r=s./m; if s~=0
for i=1:3
[maxr,k]=max(r); R(i,:)=[r(k),s(k),k]; r(k)=0; end end
t=M-sum(m); for i=1:t
j=R(i,3); m(j)=m(j)+1; end
fprintf('\\n\\n\\n按相对尾数法分配的结果是 : \\n'); for i=1:3
fprintf('第 %g 个宿舍名额为 : %g\\n',i,m(i)); end
输入及运行结果: 1 表1结果 >> biliguanli
各宿舍人数 输入格式[ number ] :[235 333 432] 输入总席位数 :10 按比例分配的结果 : 第 1 个宿舍的人数为: 2 第 2 个宿舍的人数为: 3 第 3 个宿舍的人数为: 4 给第 1 个宿舍再分一个名额
按比例加惯例法分配的结果是 : 第 1 个宿舍名额为 : 3 第 2 个宿舍名额为 : 3 第 3 个宿舍名额为 : 4 >> biliguanli
各宿舍人数 输入格式[ number ] :[235 333 432] 输入总席位数 :15 按比例分配的结果 : 第 1 个宿舍的人数为: 3 第 2 个宿舍的人数为: 4 第 3 个宿舍的人数为: 6
给第 2 个宿舍再分一个名额给第 1 个宿舍再分一个名额
按比例加惯例法分配的结果是 : 第 1 个宿舍名额为 : 4 第 2 个宿舍名额为 : 5 第 3 个宿舍名额为 : 6
2 表2结果 >> Qzhifa
输入各宿舍人数 格式为:[ number ] :[235 333 432] 输入总席位数 :10 按比例分配的结果 : 第 1 个宿舍的人数为: 2 第 2 个宿舍的人数为: 3 第 3 个宿舍的人数为: 4 各宿舍的Q值为: 9204.17 9240.75 9331.2
按Q值分配的结果 :
给第 3 个宿舍再分一个名额
按Q值法分配的结果是 : 第 1 个宿舍名额为 : 2 第 2 个宿舍名额为 : 3 第 3 个宿舍名额为 : 5 >> Qzhifa
输入各宿舍人数 格式为:[ number ] :[235 333 432] 输入总席位数 :15 按比例分配的结果 : 第 1 个宿舍的人数为: 3 第 2 个宿舍的人数为: 4 第 3 个宿舍的人数为: 6 各宿舍的Q值为: