实 验 报 告求解线性规划实验(运筹学与最优化方法,4学时)班级专业 姓名 学号 日期一 实验目的掌握线性规划的求解,会用单纯形法法、大M 法解线性规划。
二 实验内容1 用单纯形法解线性规划:1212121212min 232210..315,0z x x x x x x s t x x x x =---+≤⎧⎪+≤⎪⎨+≤⎪⎪≥⎩2 用大M 法解线性规划:123123123123min 323236..24,,0z x x x x x x s t x x x x x x =-+++-=⎧⎪-+-=-⎨⎪≥⎩3.解下列线性规划,考虑其是哪一种特殊情况。
(1)12122121212max 5040351502085300..50,0z x x x x x x x s t x x x x =++≤⎧⎪≤⎪⎪+≤⎨⎪+≥⎪≥⎪⎩(无解)(2)121212max 20102..5,0z x x x s t x x x =+≥⎧⎪≤⎨⎪≥⎩(没有边界)(3)121221212max30503515020..85300,0z x xx xxs tx xx x=++≤⎧⎪≤⎪⎨+≤⎪⎪≥⎩(多个最优解)(4)121221212max50403517520..85300,0z x xx xxs tx xx x=++≤⎧⎪≤⎪⎨+≤⎪⎪≥⎩三实验步骤(算法)与结果1.算法:A=[-1 1 1 0 0 2;1 2 0 1 0 10;3 1 0 0 1 15;-2 -3 0 0 0 0]; N=[1 2 3 ];>> [sol,val,k]=simplex(A,N)function [sol,val,k]=simplex(A,N)[m,n]=size(A);k=0;flag=1;while flagk=k+1;if A(m,:)>=0flag=0;break;sol=zeros(1,n-1);for i=1:m-1sol(N(i))=A(i,n);endval=-A(m,n);if flagtemp=0;for i=1:n-1if A(m,i)<0temp=A(m,i);inb=i;endendsita=zeros(1,m-1);for i=1:m-1sita(i)=A(i,n)/A(i,inb);endtemp=1000;for i=1:m-1if sita(i)>0&sita(i)<temptemp=sita(i);outb=i;endendfor i=1:m-1if i==outbN(i)=inb;endendA(outb,:)=A(outb,:)/A(outb,inb);for i=1:mif i~=outbA(i,:)=A(i,:)-A(outb,:)*A(i,inb);endendendendend结果:sol =4.0000 3.0000 3.0000 0 0val =-17k =42算法function [sol,val,k]=simpleM(C,A,b) [m,n] = size(A);for j=1:mif b(j)<0b(j)=-b(j);A(j,:)=-A(j,:);endendA = [A,eye(m)];M = 1000;for run = 1:1:mC = [C,M];endN = (n+1:n+m);%N承装初始基变量的下标n= n+m;val=0;x = zeros(1,n);for j = 1:mx(N(j)) = b(j);endval = C*x';sita = zeros(1,n);for i = 1:ntemp = 0;for j = 1:mtemp = temp + C(N(j))*A(j,i);endsita(i) = C(i)-temp;endk=0;while min(sita)<0k=k+1;for j=1:nif sita(j)<0inb=j;%入基变量的下标endendtheta = zeros(1,m);for j = 1:mtheta(j) = b(j)/A(j,inb);endtemp = Inf;for j = 1:mif theta(j)>0 & theta(j)<temptemp = theta(j);outb=N(j);%离基变量的下标outl = j;%出基变量在基变量中的位置endendfor j = 1:mif N(j) == outb;N(j) =inb;endend%下面进行转轴运算b(outl) = b(outl)/A(outl,inb);A(outl,:) = A(outl,:)/A(outl,inb);val=-(sita(outl)/A(outl,inb))*b(outl)-val;for j = 1:mif j ~= outlb(j) = b(j) - b(outl)*A(j,inb);A(j,:) = A(j,:) - A(outl,:)*A(j,inb);endendfor i=1:nsita(i)=sita(i)-sita(inb)/A(outl,inb)*A(outl,i);endsita;endsol=zeros(1,n);for i=1:msol(N(i))=b(i);endval;结果:3.算法function [x,val,flag,k]=originalsimpleM(C,A,b) M = 1e5;[m,n] = size(A);A = [A,eye(m)];for run = 1:1:mC = [C,-M];endN = (n+1:n+m);%N承装初始基变量的下标n = n+m;k = 0;while 1k = k +1;flag = 0;%%sita = zeros(1,n);for i = 1:ntemp = 0;for j = 1:mtemp = temp + C(N(j))*A(j,i);endsita(i) = C(i)-temp;end%%if sita<=0x = zeros(1,n);for j = 1:mx(N(j)) = b(j);endfor j = 1:mfor temp = n-m+1:nif N(j)==temp && x(temp)~=0 flag = 3;%方程组没有无解x = 0;val = 0;break;endendif flag == 3break;endendif flag == 3break;endfor i = 1:ntflag = 0;for j = 1:mif i == N(j)tflag = 1;break;endendif tflag == 0if sita(i) == 0flag = 1; %方程组有无穷多解break;endendendif flag == 1x = x(:,1:n-m);break;endif flag == 0;x = x(:,1:n-m);val;endelsefor i = 1:nif sita(i)>0 & A(:,i)<=0flag = 2;%方程组无界x = 0;val = 0;break;endendif flag == 2break;end%%temp = 0;for i = 1:nif sita(i)>temptemp = sita(i);inb = i;%入基变量的下标endendtheta = zeros(1,m);for j = 1:mif A(j,inb)>0theta(j) = b(j)/A(j,inb);endendtemp = Inf;for j = 1:mif theta(j)>0 & theta(j)temp = theta(j);outb = N(j);%离基变量的下标outl = j;%离基变量在基变量中的位置endend%%b(outl) = b(outl)/A(outl,inb);A(outl,:) = A(outl,:)/A(outl,inb);if j ~= outlb(j) = b(j) - b(outl)*A(j,inb);A(j,:) = A(j,:) - A(outl,:)*A(j,inb);endend%%for j = 1:mif N(j) == outb;N(j) = inb;endendendend%%if flag == 0disp('此方程组有唯一解');x;val;endif flag == 1disp('此方程组有无穷多解');endif flag == 2disp('此方程组无界');endif flag == 3disp('此方程组没有无解');end(1)结果(2)此方程组无界(3)此方程组有无穷多解(4)此方程组没有最优解四实验收获与教师评语。