席位分配问题——惯例Q值法和d'hondt法的MATLAB程序
本篇博文为追忆以前写过的算法系列第四篇
温故知新
本篇于2009年发表于百度博客,当时还没接触CSDN。所以是文学和技术博客混淆,只是这个程序博文訪问量突破2000,有不少网友评论互动。应该对非常多人有一定的帮助。
程序介绍了数学建模中经典问题的两种解法,即席位分配问题!
%适用于全部情况 BY Gu clear all clc %惯例Q值法分配席位,wy为席位数。ps为人数总和,R为分配方案 wy=19; P=[103 63 34] %菜单选项 MENUN=menu('选择方法','惯例Q值法','dhondt法','都用'); %惯例Q值法 if (MENUN==1||MENUN==3)==1 n=size(P,2); ps=sum(P); RS=0; for i=1:n R(i)=fix(P(i)/ps*wy); RS=RS+R(i); end wy1=wy-RS; for i=1:wy1 for j=1:n Q(j,i)=P(j).^2/(R(j)*(R(j)+1)); end t=Q(1,i); a=1; for m=2:n if Q(m,i)>t t=Q(m,i); a=m; end end R(a)=R(a)+1; end disp('惯例Q值法席位分配为:') R end %d'hondt法………………………………………………………………………………$$ if (MENUN==2||MENUN==3)==1 zs=P; n=size(zs,2); for i=1:n for j=1:wy r(i,j)=zs(i)/j; end end t=r(:)'; T=sort(t,'descend'); min=T(wy); R1=zeros(1,n); for i=1:n for j=1:wy if r(i,j)>min R1(i)=R1(i)+1; end end end rest=wy-sum(R1);%剩余席位 %对剩余席位的分配处理 k=0; for i=1:n if k>=rest%席位分配完成,结束循环 break; end for j=1:wy if r(i,j)==min R1(i)=R1(i)+1; k=k+1;%对剩余席位分配计数 break; end end end disp ('dhondt法席位分配:') R1 end
原博文地址:http://hi.baidu.com/gujinjin2008/item/659fdb8a33c37354e73d1931