运筹学实验报告(1)
- 格式:doc
- 大小:68.00 KB
- 文档页数:9
运筹学实验报告一、实验目的:通过实验熟悉单纯形法的原理,掌握matlab循环语句的应用,提高编程的能力和技巧,体会matlab在进行数学求解方面的方便快捷。
二、实验环境:Matlab2012b,计算机三、实验内容(包含参数取值情况):构造单纯形算法解决线性规划问题Min z=cxs.t. Ax=bxj>=0,j=1,…,n函数功能如下:function[S,val]=danchun(A1,C,N)其中,S为最优值,Val为最优解,A1为标准形式LP问题的约束矩阵及最后一列为资源向量(注:资源向量要大于零),A1=[A+b];C是目标函数的系数向量,C=c;N为初始基的下标(注:请按照顺序输入,若没有初始基则定义N=[])。
先输入A1,C,N三个必要参数,然后调用danchun(A1,C,N)进行求解。
在此函数中,首先判断N的长度是否为空,若为空,则flag=1,进入初始解问题的迭代求值,添加辅助问题,构建单纯形表,求g所对应的RHS值,若其>0,则返回该问题无解,若其=0,则返回A1,C,N三个参数,继续构造单纯形表求解。
A1为经过变换后的系数及资源向量,C为单纯形表的第一行,N为经过辅助问题求解之后的基的下标。
否则,直接构建单纯形表,对该问题进行求解,此时flag=2,多次迭代后找到解。
另外,若在大于零的检验数所对应的系数均小于零时,会显示“此问题无界”。
若找到最优解和最优值时,会输出“val”和“S=”以及具体数值。
四、源程序(在matlab中输入edit后回车,写在.M文件中,并保存为danchun.M)function[S,val]=danchun(A1,C,N)if(length(N)==0)gN=zeros(1,length(A1(:,1)));gC=[-C,gN,0];%原文题的检验数的矩阵G=[zeros(1,length(C)),-ones(1,length(gN)),0];val=zeros(1,length(C));%val为最优解;for i=(length(C)+1):length(C)+length(A1(:,1))%生成基变量gN(i-length(C))=i;endNn=gN;%%%%%%%ll=zeros(1,length(N));%比值最小原则%生成除了最上端两行的表的矩阵gb=A1(:,length(C)+1);A1(:,length(C)+1)=[];l=zeros(length(gN),length(gN));gA=[A1,l,gb];for i=1:length(gb)gA(i,gN(i))=1;endfor i=1:length(gN)%J为基本可行基所对应的检验数J(i)=G(gN(i));endfor i=1:length(gN)%找到基本可行基的检验数,将其赋值为0 if(J(i)~=0)G=G-(J(i)/gA(i,gN(i)))*gA(i,:);endendflag=1;elseflag=2;A=A1;Z=[-C,0];%单纯形表的第一行val=zeros(1,length(C));%val为最优解;ll=zeros(1,length(N));%比值最小原则end%%初始解问题while flag==1for i=1:length(gN)%J为基本可行基所对应的G的检验数J(i)=G(gN(i));JZ(i)=Z(gN(i));%JZ为基本可行基所对应的Z的检验数endfor i=1:length(gN)%找到基本可行基的检验数,将其赋值为0 if(J(i)~=0)G=G-(J(i)/gA(i,gN(i)))*gA(i,:);Z=Z-(JZ(i)/gA(i,gN(i)))*gA(i,:);endG1=G;%G1为检验数G1(:,length(G1))=[];D=max(G1);%找到检验数的最大值if(D<=0)%检验数都小于0if(G(length(G))>=1)disp('此情况无解');flag=0;elseif(G(length(G))>=0)for i=1:length(gN)if(max(gN)<=length(A1(1,:)));flag=2;for j=1:length(Nn)a=Nn(1);gA(:,a)=[];Z(a)=[];endA=gA;N=gN;break;endendendendelse%检验数大于0for i=1:length(G)if(G(i)==D)%找到最大的那个检验数所对应的元素for j=1:length(gN)if(gA(j,i)>0)ll(j)=gA(j,length(G))/gA(j,i);%求比值elsell(j)=10000;endendd=min(ll);for k=1:length(ll)%找到进基和离基if(ll(k)==d)gN(k)=i;gA(k,:)=gA(k,:)/gA(k,i);for m=1:k-1gA(m,:)=-(gA(m,i)/gA(k,i))*gA(k,:)+gA(m,:);endfor n=k+1:length(ll)gA(n,:)=-(gA(n,i)/gA(k,i))*gA(k,:)+gA(n,:);endbreak;endendendendendendwhile(flag==2)for i=1:length(N)%J为基本可行基所对应的检验数J(i)=Z(N(i));endfor i=1:length(N)%找到基本可行基的检验数,将其赋值为0if(J(i)~=0)Z=Z-(J(i)/A(i,N(i)))*A(i,:);endendZ1=Z;%Z1为检验数Z1(:,length(Z1))=[];D=max(Z1);%找到检验数的最大值if(D<=0)%检验数都小于0disp('已找到最优解和最优值')for i=1:length(N)val(N(i))=A(i,length(Z));endS=Z(length(Z));disp('val');disp(val);flag=0;else%检验数大于0for i=1:length(Z)if(Z(i)==D)%找到最大的那个检验数所对应的元素for j=1:length(N)if(A(j,i)>0)ll(j)=A(j,length(Z))/A(j,i);%求比值elsell(j)=10000;endendd=min(ll);if(d==10000)disp('此问题无界')flag=0;break;endfor k=1:length(ll)%找到进基和离基if(ll(k)==d)N(k)=i;A(k,:)=A(k,:)/A(k,i);for m=1:k-1A(m,:)=-(A(m,i)/A(k,i))*A(k,:)+A(m,:);endfor n=k+1:length(ll)A(n,:)=-(A(n,i)/A(k,i))*A(k,:)+A(n,:);endbreakendendendendendend五、运行结果与数据测试参考例题:例1:Min z=3x1+x2+x3+x4s.t. -2x1+2x2+x3=43x1+2x+x4=6Xj>=0,j=1,2,3,4在workspace中写入,形式如下:>> A=[-2 2 1 0 43 1 0 1 6]A =-2 2 1 0 43 1 0 1 6>> C=[3 1 1 1]C =3 1 1 1>> N=[3 4]N =3 4>> danchun(A,C,N)已找到最优解和最优值val0 2 0 4ans =6例2:初始解问题Min z=5x1+21x3s.t. x1-x2+6x3-x4=2x1+x2+2x3-x5=1xj>=0,j=1,…,5在workspace中写入,形式如下:>> A=[1 -1 6 -1 0 21 12 0 -1 1]A =1 -1 6 -1 0 21 12 0 -1 1 >> C=[5 0 21 0 0]C =5 0 21 0 0>> N=[]N =[]>> danchun(A,C,N)已找到最优解和最优值val0.5000 0 0.2500 0 0ans =7.7500六、求解实际问题(即解决附件中的实验题目)实验题目列出下列问题的数学模型,并用你自己的单纯形算法程序进行计算,最后给出计算结果。
某医院昼夜24小时各时段需要的护士数量如下2:00---6:00 10人6:00---10:00 15人10:00---14:00 25人14:00---18:00 20人18:00---22:00 18人22:00---2:00 12人护士分别于2:00 , 6:00, 10:00, 14:00, 18:00, 22:00 分六批上班,并连续工作8小时。
试确定:(1)该医院至少应设多少名护士,才能满足值班需要(2)若医院可以聘任合同工护士,上班时间同正式护士。
若正式护士报酬为每小时10元,合同工护士为每小时15元,问医院是否应聘任合同工护士及聘多少名?解:(1)设护士分别于2:00 , 6:00, 10:00, 14:00, 18:00, 22:00 分六批上班的每批人数为x1,x2,x3,x4,x5,x6.min z=x1+x2+x3+x4+x5+x6s.t. x6+x1>=10x1+x2>=15x2+x3>=25x3+x4>=20x4+x5>=18x5+x6>=12xj>=0 j=1,2…,6先将其化为标准形式:Min z=x1+x2+x3+x4+x5+x6s.t. x6+x1-x7=10x1+x2-x8=15x2+x3-x9=25x3+x4-x10=20x4+x5-x11=18x5+x6-x12=12xj>=0 j=1,2…,12在workspace中写入,形式如下:>> A=[1 0 0 0 0 1 -1 0 0 0 0 0 101 1 0 0 0 0 0 -1 0 0 0 0 150 1 1 0 0 0 0 0 -1 0 0 0 250 0 1 1 0 0 0 0 0 -1 0 0 200 0 0 1 1 0 0 0 0 0 -1 0 180 0 0 0 1 1 0 0 0 0 0 -1 12]A =Columns 1 through 111 0 0 0 0 1 -1 0 0 0 01 1 0 0 0 0 0 -1 0 0 00 1 1 0 0 0 0 0 -1 0 00 0 1 1 0 0 0 0 0 -1 00 0 0 1 1 0 0 0 0 0 -10 0 0 0 1 1 0 0 0 0 0 Columns 12 through 130 100 150 250 200 18-1 12>> C=[1 1 1 1 1 1 0 0 0 0 0 0]C =Columns 1 through 111 1 1 1 1 1 0 0 0 0 0 Column 12>> N=[]N =[]>> danchun(A,C,N)得到的结果显示如下:已找到最优解和最优值valColumns 1 through 110 15 10 10 8 10 0 0 0 0 0Column 126ans =53解得最优解为x1=0, x2=15, x3=10, x4=10, x5=8, x6=10最优值为53(2)解:因为上述结果为53人是整数,所以该医院没有必要聘请护工。