第一篇:线性规划单纯形法matlab解法
线性规划单纯形法matlab解法
%单纯形法matlab程序-ssimplex % 求解标准型线性规划:max c*x;s.t.A*x=b;x>=0 % 本函数中的A是单纯初始表,包括:最后一行是初始的检验数,最后一列是资源向量b % N是初始的基变量的下标
% 输出变量sol是最优解, 其中松弛变量(或剩余变量)可能不为0 % 输出变量val是最优目标值,kk是迭代次数 % 例:max 2*x1+3*x2 % s.t.x1+2*x2<=8 % 4*x1<=16 % 4*x2<=12 % x1,x2>=0 % 加入松驰变量,化为标准型,得到 % A=[1 2 1 0 0 8;% 4 0 0 1 0 16;% 0 4 0 0 1 12;% 2 3 0 0 0 0];% N=[3 4 5];% [sol,val,kk]=ssimplex(A,N)% 然后执行 [sol,val,kk]=ssimplex(A,N)就可以了。function [sol,val,kk]=ssimplex(A,N)[mA,nA]=size(A);kk=0;% 迭代次数 flag=1;while flag kk=kk+1;if A(mA,:)<=0 % 已找到最优解 flag=0;sol=zeros(1,nA-1);for i=1:mA-1 sol(N(i))=A(i,nA);end val=-A(mA,nA);else for i=1:nA-1 if A(mA,i)>0&A(1:mA-1,i)<=0 % 问题有无界解 disp('have infinite solution!');flag=0;break;end end if flag % 还不是最优表,进行转轴运算 temp=0;for i=1:nA-1 if A(mA,i)>temp temp=A(mA,i);inb=i;% 进基变量的下标 end end sita=zeros(1,mA-1);for i=1:mA-1 if A(i,inb)>0 sita(i)=A(i,nA)/A(i,inb);end end temp=inf;for i=1:mA-1 if sita(i)>0&sita(i) A(outb,:)=A(outb,:)/A(outb,inb);for i=1:mA if i~=outb A(i,:)=A(i,:)-A(outb,:)*A(i,inb);End End End End end 算法实现与分析 算法1.单纯形法 具体算例: minz=−3x1+x2+2x3 3x1+2x2−3x3=6 x1−2x2+x3+x5=4 x1,x2,x3≥0标准化后: min z=−3x1+x2+2x3+Mx4+Mx5 3x1+2x2−3x3+x4=6 x1−2x2+x3+x5=4 x1,x2,x3,x4,x5≥0用单纯形法求解,程序如下: clear clc M=1000000; A=[3,2,-3,1,0;1,-2,1,0,1];%系数矩阵 C=[-3,1,2,M,M,0];%价值矩阵 B=[6;4];Xt=[4 5]; for i=1:length(C)-1 D=0; for j=1:length(Xt) D=D+A(j,i)*C(Xt(j)); end xi(i)=C(i)-D;end s=[]; for i=1:length(xi) if xi(i)<0 s=[s,i]; end end f=length(s);h=1; while(f) for k=1:length(s)j=1;A x=[]; for i=1:length(Xt) if A(i,s(k))>0 x(j)=i;j=j+1; end end x if(length(x)+1==1)break;end y=1 x for i=1:length(x) if B(x(i))/A(x(i),s(k)) end end y=x(y);end y1=Xt(y);%»»³ö±äÁ¿ s k aa=A(y,s(k))%s(k)Ϊ»»Èë±äÁ¿ A(y,:)=A(y,:)./aa;B(y,:)=B(y,:)./aa;z=[]; for i=1:length(Xt)z=[z,i];end z z(y)=[];z Xt for i=1:length(z);yz=-A(z(i),s(k)) A(z(i),:)=A(z(i),:)+A(y,:).*yz B(z(i))B(y)yz B(z(i))=B(z(i))+B(y).*yz end for i=1:length(Xt) if Xt(i)==y1 Xt(i)=s(k);break end end Xt disp('ת»»ºó')A=A B=B AB=[A,B]; for i=1:length(C)D=0; for j=1:length(Xt)D=D+AB(j,i)*C(Xt(j)); end xi(i)=C(i)-D; end xi s=[]; for i=1:length(xi)-1 if xi(i)<0 s=[s,i]; end end s vpa([A,B;C]);f=length(s);h=h+1; if h==5 break end end -xi(length(xi)) clear clc X=[1 2 3 4 5];A=[ 1 2 1 0 0;4 0 0 1 0;0 4 0 0 1];C=[2 3 0 0 0 ];b=[8;16;12];t=[3 4 5];B0=A(:,t);while 1 CB0=C(:,t);XN01=X; for i=1:length(t); for j=1:length(X); if XN01(j)==t(i) XN01(j)=0; end end end j=1; for i=1:length(X); if XN01(i)~=0 XN0(j)=XN01(i); j=j+1; end end for j=1:length(XN0); CN0(j)=C(XN0(j)); end N0=[]; for i=1:length(XN0); N0=[N0,A(:,XN0(i))]; end xiN0=CN0-CB0*B0*N0;j=1;z=[]; for i=1:length(xiN0) if xiN0(i)>0 z(j)=i; j=j+1; end end if length(z)+1==1; break; end n=1; for i=1:length(z) if z(i)>z(n) n=i; end end k=XN0(z(n));%换入变量 B=B0*b; P=B0*A(:,k);j=1; for i=1:length(P) if P(i)>0 x(j)=i; j=j+1; end end y=1; for i=1:length(x) if B(x(y))/P(x(y))>B(x(i))/P(x(i)) y=i; end end y1=x(y); y=t(y1);%换出变量 for i=1:length(t) if t(i)==y m=i; break; end end t(m)=k; P2=B0*A(:,k);q=P2(y1);P2(y1)=-1;P2=-P2./q; E=[1 0 0;0 1 0;0 0 1];E(:,m)=P2;B0=E*B0;end CB0*B0*b function [xx,fm]=myprgmh(m,n,A,b,c)B0=A(:,1:m);cb=c(:,1:m);xx=1:n;sgm=c-cb*B0^-1*A;h=-1;sta=ones(m,1);for i=m+1:n if sgm(i)>0 h=1; end end while h>0 [msg,mk]=max(sgm); for i=1:m sta(i)=b(i)/A(i,mk); end [mst,mr]=min(sta); zy=A(mr,mk); for i=1:m if i==mr for j=1:n A(i,j)=A(i,j)/zy; end b(i)=b(i)/zy; end end for i=1:m if i~=mr for j=1:n A(i,j)=A(i,j)-A(i,mk)*A(mr,j); end b(i)=b(i)-A(i,mk)*b(mr); end end B1=A(:,1:m); cb(mr)=c(mk); xx(mr)=mk; sgm=c-cb*B1*A; for i=m+1:n if sgm(i)>0 h=1; end end end fm=c*xx; 运筹学教程(胡运权主编,清华版)部分习题答案(第一章) 1.5 记可行集4个顶点分别为O:(0,0),A:(1.6,0),B:(1,1.5),C:(0,2.25)当c=0,d=0时,四边形OABC中的点都是最优解 当c=0,d>0时,顶点C是最优解 当c=0,d<0时,线段OA上的点都是最优解 当c>0,d/c<2/5时,顶点A是最优解 当c>0,d/c=2/5时,线段AB上的点都是最优解 当c>0,2/5 当c<0,d=0时,线段OC上的点都是最优解 当c<0,d>0时,顶点C是最优解 1.8 a=3,b=2,c=4,d=-2,e=2,f=3,g=1,h=0,i=5,j=5,k=-3/2,l=0 1.15 设i=1,2,3分别表示前、中、后三舱,j=1,2,3分别表示A、B、C三种商品 设第i舱装载第j中商品的件数为xij max s.t.z = 100(x11+x21+x31)+ 700(x12+x22+x32)+ 600(x13+x23+x33)8x11+6x12+5x13 2000 8x21+6x22+5x23 3000 8x31+6x32+5x33 1500 10x11+5x12+7x13 4000 10x21+5x22+7x23 5400 10x31+5x32+7x33 1500 x11+x21+x31 600 x12+x22+x32 1000 x13+x23+x33 800 8x11+6x12+5x13 1.15(8x21+6x22+5x23)8x21+6x22+5x23 1.15(8x11+6x12+5x13)8x31+6x32+5x33 1.15(8x21+6x22+5x23)8x21+6x22+5x23 1.15(8x31+6x32+5x33)8x11+6x12+5x13 1.1(8x31+6x32+5x33)8x31+6x32+5x33 1.1(8x11+6x12+5x13)xij 0, i=1,2,3, j=1,2,3 1.16 设xi和yi分别为第i周正常工作时间内用于生产食品Ⅰ和Ⅱ的工人数; 设si和ti分别为第i周加班时间内为食品Ⅰ和Ⅱ加工的工时; 设wi为从第i周开始抽出来培训新工人的熟练工人数; 设ni为从第i周开始接受培训的新工人数; 设ui和vi分别为第i周于生产食品Ⅰ和Ⅱ的新工人数; 设fi和gi分别为第i周末未能按期交货的食品Ⅰ和Ⅱ的数量; 设ki和li分别为第i周末剩余的食品Ⅰ和Ⅱ的数量; 设qi和ri分别为第i周内对食品Ⅰ和Ⅱ的需求量(如表,已知)。 min z = 360[(x1 + y1 + w1)+(x2 + y2 + w1 + w2)+...+(x7 + y7 + w6 + w7)+(x8 + y8 + w7)] + 120[(n1)+(n1 + n2)+...+(n6 + n7)] + 240[(u3 + v3)+(u4 + v4)+...+(u8 + v8)] + 12[(s1 + t1)+(s2 + t2)+...+(s8 + t8)] + 0.5(f1 + f2 +...+ f8)+ 0.8(g1 + g2 +...+ g8)x1 + y1 + w1 = 50 x2 + y2 + w1 + w2 = 50 … … x7 + y7 + w6 + w7 = 50 x8 + y8 + w7 = 50 ni 3 wi,i=1,2,…,7 ui + vi = n3 +...+ni-2,i=3,4,…,8 n1 + n2 +...+ n7 = 50 400xi + 10si + fi = qi + ki,i=1,2 400xi + 400ui + 10si + fi = qi + ki,i=3,4,…,8 240yi + 6ti + gi = ri + li,i=1,2 240yi + 240vi + 6ti + gi = ri + li,i=3,4,…,8 xi,yi,si,ti,fi,gi,ki,li 0,i=1,2,…,8 wi,ni 0,i=1,2,…,7 ui,vi 0,i=3,4,…,8 1.17 设: xi:第i个月公司雇佣的人数(i =1,2,…,6); s.t.zi:第i个月末的库存量(i =1,2,…,6); si:第i个月的短缺量(i =1,2,…,6); ti:第i个月因新增和解雇工人所产生的费用(i =1,2,…,6); qi:第i个月的需求量(如表,已知); Max Z = 30(qi16isi)–2000 xi16i–5 z–tii1i166i zi-1100xisiziqi,(i 1,2,,6)t1500(x-x),(i 1,2,,6)ii-1iti1000(xi-1-xi),(i 1,2,,6)s.t x04z(该条件原题中没给)00,6);xi,zi,si,ti0,(i 1,2 1.18 假设:每月的现金流发生在月底。x:上一年末的借款数; yi:第i个月底贷款,(i =1,2,…,11); zi:第i个月底存款,(i =1,2,…,12); ci:第i个月的现金需求量(如表,已知); max Z = z12 s.t.z1 – x – y1 + 0.01x = c1 zi – 1.004zi-1 – yi + 0.01x + 1.015yi-1 = ci,(i =2,3,…,11)z12 – 1.004z11 + 0.01x + x + 1.015yi-1 = c12 x 0 yi 0,i=1,2,…,11 zi 0,i=1,2,…,12第二篇:单纯形法matlab程序
第三篇:改进单纯形法matlab程序
第四篇:运筹学单纯形法matlab程序
第五篇:习题答案选01_线性规划和单纯形法