实验二:MATLAB编程单纯形法求解

合集下载

单纯形法matlab

单纯形法matlab

数学软件与实验数学与信息科学学院信息与计算科学单纯形法的Matlab程序如下: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:nif sgm(i)>0h=1;endendwhile h>0[msg,mk]=max(sgm);for i=1:msta(i)=b(i)/A(i,mk);end[mst,mr]=min(sta);zy=A(mr,mk);for i=1:mif i==mrfor j=1:nA(i,j)=A(i,j)/zy;endb(i)=b(i)/zy;endendfor i=1:mif i~=mrfor j=1:nA(i,j)=A(i,j)-A(i,mk)*A(mr,j);endb(i)=b(i)-A(i,mk)*b(mr);endendB1=A(:,1:m);cb(mr)=c(mk);xx(mr)=mk;sgm=c-cb*B1*A;for i=m+1:nif sgm(i)>0h=1;endendendfm=c*xx;例题:编写下列求解如下线性规划问题的单纯形法函数min f'xs.t ax<=b(其中b>=0)函数形式function [x,fval,it,op]=singl(f,a,b) 输出中x为最优解fval为最优值it为迭代次数无最优解op=0有最优解op=1编写程序如下:function [x,fval,it,op]=singl(f,a,b)[m,n]=size(a);c=[a eye(m) b;f' zeros(1,m+1)];fval=0;x=zeros(m+n,1);op=1;it=0;e=zeros(1,m);lie=find(f<0);l=length(lie);while(l>0)for j=1:ld=find(c(:,lie(j)));d_l=length(d);if d_l>0for i=1:mif c(i,lie(j))>0e(i)=c(i,end)/c(i,lie(j));elsee(i)=inf;endend[g,h]=min(e);for w=1:m+1if w==hc(w,:)=c(w,:)/c(h,lie(j));elsec(w,:)=c(w,:)-c(h,:)*c(w,lie(j))/c(h,lie(j));endendit=it+1;elseop=0;endendlie=find(c(end,:)<0);l=length(lie);endfor i=1:(m+n)ix=find(c(:,i));if(length(ix)==1)&(ix<=m)&(c(ix,i)==1) x(i)=c(ix,end)elsex(i)=0endendfval=-c(end,end);。

单纯形法MATLAB程序(线性与非线性规划大作业)

单纯形法MATLAB程序(线性与非线性规划大作业)

单纯形法程序整理.txt [hB,lB]=size(B);%测算B的行、列数 for j=1:hB if(A(B(j,1),B(j,2))~=1)%如果主元不为1,将对应行除以主元化为1 A(B(j,1),:)=A(B(j,1),:)/A(B(j,1),B(j,2)); end for i=1:hA%将其他元化为零 if(i==B(j,1)) continue; end A(i,:)=A(i,:)-A(B(j,1),:)*A(i,B(j,2)); end end end %————————————————% %% 子程序-选主元 function [r,s]=SubFc_XuanZhuYuan(TableK,h,l) %选主元素 % 选出表矩阵TableK中的主元素 %% 选列主元 t=0; for i=1:l if(TableK(h+1,i)<=t) t=TableK(h+1,i);%记录判别数最小值 s=i;%记录下标 end end if(t==0) error('判别数全为正'); end %% 选行主元 for i=1:h%检查元素是否为负,并赋予t初值 if(TableK(i,s)>0) t=TableK(i,l+1)/TableK(i,s); break; end if(i==h)%若元素全为负,则报错 error('主列元素全为非正,规划问题有无界解!'); end end %k=1; for i=1:h %若未知数出现负值,则是初始迭代标准性表产生的,应更换初始主元; if(TableK(i,l+1)<0) error('b向量出现负值,更换初始主元'); end if(TableK(i,s)<=0)%排除A表负元素 continue; end if(TableK(i,l+1)/TableK(i,s)<=t) t=TableK(i,l+1)/TableK(i,s);%记录判别数最小值 r=i;%记录下标 end end %补充判据 k=1; 第 2 页

Matlab单纯形法

Matlab单纯形法

• 线性规划问题 • 解决这一问题我们用的是linprog函数,linprog 函数求的是最小值,线性规划是求最大,所以 要在目标函数前加一个负号. • x = linprog( c , A , b , Aeq , beq , lb , ub , x0 )是求 解线性规划问题的命令。 • c是目标函数的系数向量,A是不等式约束 AX<=b的系数矩阵,b是不等式约束AX<=b的常 数项,Aeq是等式约束AeqX=beq的系数矩阵, beq是等式约束AeqX=beq的常数项,lb是X的下 限,ub是X的上限,X是向量[x1,x2,...xn]即决策 变量。
Matlab单纯形法
• 运行matlab会显示三个窗口,分别是变量窗 口,命令窗口和历史窗口。 • 在命令窗口中出现命令提示符 “>>”,就 可以输入命令,按回车键完成运算。 • 命令窗口的说明: • 1.在命令中,空格不参与运算。 • 2.几条命令可以写在同一行,用逗号隔开。 • 3.在命令窗口中不能返回到前面的命令行 进行修改后在重新执行。
• 如果模型中不包含不等式约束条件,可用 []代替A和b表示缺省;如果没有等式约 束条件,可用[]代替Aeq和beq表示缺省; 如果某个xi无下界或上界,可以设定lb(i) =-inf或ub(i)=inf; 用[x , Fval]代替上述各命令行中左边的x, 则可得到在最优解x处的b中,用[1 2 3]表示行向量;[1;2;3] 表示列向量;[1 2 3;4 5 6;7 8 9]表示矩阵。 • 矩阵按行输入,元素之间用空格或“,” 隔开,行与行之间用“;”隔开。 • 特殊命令创建矩阵a=[m:q:n],m是起始值;n 是终止值;q是增量。如a=[1:2:13] • 特殊矩阵建立:eye创建一个单位矩阵,如 eye(4);ones创建一个元素全是1的矩阵,如 ones(1,4);zeros创建一个全是0的矩阵,如 zeros(1,4).

实验二:MATLAB编程单纯形法求解

实验二:MATLAB编程单纯形法求解

北京联合大学实验报告项目名称:运筹学专题实验报告学院:自动化专业:物流工程班级: 1201B 学号:2012100358081 姓名:管水城成绩:2015 年 5 月 6 日实验二:MATLAB 编程单纯形法求解一、实验目的:(1)使学生在程序设计方面得到进一步的训练;,掌握Matlab (C 或VB)语言进行程序设计中一些常用方法。

(2)使学生对线性规划的单纯形法有更深的理解. 二、实验用仪器设备、器材或软件环境 计算机, Matlab R2006三、算法步骤、计算框图、计算程序等本实验主要编写如下线性规划问题的计算程序:⎩⎨⎧≥≥≤0,0..min b x b Ax t s cx 其中初始可行基为松弛变量对应的列组成. 对于一般标准线性规划问题:⎩⎨⎧≥≥=0,0..min b x b Ax t s cx1.求解上述一般标准线性规划的单纯形算法(修正)步骤如下:对于一般的标准形式线性规划问题(求极小问题),首先给定一个初始基本可行解。

设初始基为B,然后执行如下步骤: (1).解B Bx b=,求得1B x B b -=,0,N B B x f c x ==令计算目标函数值 1(1,2,...,)i m B b i -=i 以b 记的第个分量(2).计算单纯形乘子w,BwB C =,得到1B wC B -=,对于非基变量,计算判别数1i i i B i i z c c B p c σ-=-=-,可直接计算σ=1B A c c B --令max{}k i Rσσ∈=,R 为非基变量集合若判别数0k σ≤ ,则得到一个最优基本可行解,运算结束;否则,转到下一步 (3).解k kBy p =,得到1k k y B p -=;若0k y ≤,即k y 的每个分量均非正数, 则停止计算,问题不存在有限最优解,否则,进行步骤(4).确定下标r,使{}:0min ,0t rrktktk b b tk y y t y y >=>且rB x 为离基变量,,r k B x p k 为进基变量,用p 替换得到新的基矩阵B,还回步骤(1);2、计算框图为:图1 3.计算程序(Matlab):A=input('A=');b=input('b=');c=input('c=');format rat%可以让结果用分数输出[m,n]=size(A);E=1:m;E=E';F=n-m+1:n;F=F';D=[E,F]; %创建一个一一映射,为了结果能够标准输出X=zeros(1,n); %初始化Xif(n<m) %判断是否为标准型fprintf('不符合要求需引入松弛变量')flag=0;elseflag=1;B=A(:,n-m+1:n); %找基矩阵cB=c(n-m+1:n); %基矩阵对应目标值的cwhile flagw=cB/B; %计算单纯形乘子,cB/B=cB*inv(B),用cB/B的目的是,为了提高运行速度。

单纯形法MATLAB程序

单纯形法MATLAB程序

单纯形法(Mat lab程序)%%单纯形法(Mat lab程序)a= input (' input the major matrix A '); b=input (' input the matrix b '); n=input C input the judgement ');%%为计数器(确定循环次数)萨0;while g<40%%确定非负alength=max(size(n));blength二max(size(b));m=0;for i=l:alength辻n(i)〉=0m二m+1;endend;if m==alengthx=b;breakend;%%找Ks二min(n);for i=l:alengthif n(i) ==sk二i;breakend;end;%%a[i,k]的非负性m=0;for i=l:blengthif a(i, k)<0m二m+1;end;end;if m==blengthdisp('x does not exit');judge二1;breakend;%%找L确定主元cc=100000;for i=l:blengthif a (i, k) >0if(b(i)/a(i, k))<cccc=b(i)/a(i, k);endend end; for i=l:blengthif a(i, k)~=0if (b(i)/a(i, k))==cc1二i;breakendend end; %%计算,a 标准化zu=a(l, k); aa=a; for i=l:1-1 for j=l:alength aa(i, j)=a(i, j)-a(l, j)*a(i, k)/a(l, k);end end; for i=l+l:blengthfor j=l :alength aa(i, j)=a(i, j)-a(l, j)*a(i, k)/a(l, k);end end; for j=l:alengthaa(l, j)=a(l, j)/zu; end;%%b 勺判别bb=b; bb(l)=b(l)/zu;for i=l: 1~1 bb(i)=b(i)~b⑴*a(i, k)/a(l, k);end;for i=l+l:blength bb(i)二b(i)-b(l)*a(i, k)/a(l, k);end;b二bb; %%确定判别数tt 二n;for j=l:alength11 (j) =n(j)-a(1, j)*n(k)/a(1, k) ; end; n=tt;a=aa;%%显示单纯形表sa sa二[b' aa;0 n];dispC单纯表示例’);disp(g+1);disp(sa);g二g+l;judge=2;end;if judge==2q二0; result=zeros (alength, 2); for j=l+q:alengthif n(j)=0 t=a(:, j) ; zu=find( t) ; resu lt( j, l)=j ; result (j, 2)=x(zu) ; q 二q+1 ;endif n(j)>0 result(j,l)=q+l; q=q+l;endend;dispC最优解’);disp (result);dispC循环次数');end。

实验二:MATLAB编程单纯形法求解

实验二:MATLAB编程单纯形法求解

北京联合大学实验报告工程名称:运筹学专题实验报告学院:自动化专业:物流工程班级:1201B 学号:姓名:管水城成绩:2021 年 5 月 6 日 实验二:MATLAB 编程单纯形法求解一、实验目的:(1)使学生在程序设计方面得到进一步的训练;,掌握Matlab (C 或VB)语言进展程序设计中一些常用方法。

(2)使学生对线性规划的单纯形法有更深的理解. 二、实验用仪器设备、器材或软件环境 计算机, Matlab R2006三、算法步骤、计算框图、计算程序等本实验主要编写如下线性规划问题的计算程序:⎩⎨⎧≥≥≤0,0..min b x b Ax t s cx 其中初始可行基为松弛变量对应的列组成. 对于一般标准线性规划问题:⎩⎨⎧≥≥=0,0..min b x b Ax t s cx 1.求解上述一般标准线性规划的单纯形算法〔修正〕步骤如下: 对于一般的标准形式线性规划问题(求极小问题),首先给定一个初始根本可行解。

设初始基为B,然后执行如下步骤: (1).解B Bx b=,求得1Bx B b -=,0,N B B x f c x ==令计算目标函数值 1(1,2,...,)i m B b i -=i 以b 记的第个分量(2).计算单纯形乘子w, B wB C =,得到1B wC B -=,对于非基变量,计算判别数1i i i B i i z c c B p c σ-=-=-,可直接计算σ=1B A c c B --令max{}k i Rσσ∈=,R 为非基变量集合假设判别数0k σ≤ ,那么得到一个最优根本可行解,运算完毕;否那么,转到下一步(3).解k k By p =,得到1k k y B p -=;假设0k y ≤,即k y 的每个分量均非正数, 那么停顿计算,问题不存在有限最优解,否那么,进展步骤(4).确定下标r,使{}:0min ,0t rrktktk b b tk y y t y y >=>且rB x 为离基变量,,r k B x p k 为进基变量,用p 替换得到新的基矩阵B,还回步骤(1);2、计算框图为:⎭⎬⎫⎩⎨⎧>=0|min ik ik i rk ry y b y b图13.计算程序(Matlab):A=input('A=');b=input('b='); c=input('c=');format rat %可以让结果用分数输出 [m,n]=size(A);E=1:m;E=E'; F=n-m+1:n;F=F';D=[E,F]; %创立一个一一映射,为了结果能够标准输出 X=zeros(1,n); %初始化Xif (n<m) %判断是否为标准型 fprintf('不符合要求需引入松弛变量') flag=0; elseflag=1;B=A(:,n-m+1:n); %找基矩阵cB=c(n-m+1:n); %基矩阵对应目标值的c while flagw=cB/B; %计算单纯形乘子,cB/B=cB*inv(B),用cB/B 的目的是,为了提高运行速度。

单纯形法的matlab编程

单纯形法的matlab编程

单纯形法的matlab实现首先输入三个值系数矩阵A目标函数系数行向量C列向量b根据大M法进行扩列A,C,b.使得行数不变,列数增加M 进行的到基向量的坐标,非基变量的坐Cb,Cn,Xb,Xn,此时的值便是典式,不在需要进行进一步化简,只需求解检验变量delta的值迭代过程输入上一步得到A,C,b,Cb,Cn,Xb,Xn,输出值为最优解为X,得到目标函数的最优解Z的值迭代循化用while循环当找到解时结束循环break或者当发现循化结果没有最优解时跳出循环,这里涉及两个判断,两个判断量初始值都可以写在循环外,两者的值共同决定循环的执行与否循化最开始进行判断初始可行解是否为最最优解,若是直接跳出循化,若上面的判断不成立,接下来进行下一个判断,若不符合进行下面入基和出基变量的选值入基和出基变量的循化是两次循化,第一次找到k的值,第二次根据上一次的k找r的值注意因为值有约束,而且是找函数最小值,需要对这个列向量进行变换一下将小于等于0的都变成无穷大,接下来进形下一次的循化,进而找到转轴元将A,b,delta合成一个新的矩阵,进行旋转变化,得到值后反变回相应的值,接下来需要对Xb,Xn的值进行交换这个步骤要两个循环,第一个循化对Ark的所在行进行变化,接下来进行对整个矩阵进行行变换,包括两种情况,两次循化嵌套分别是r==1时和r~=1的时候建立总体X的坐标列向量发生交换时出基变量找Xb,入基变量从X中找有先后顺序先解决Xn的变化。

在解决Xb的值直接解决基变量其他为0A=input('输入系数矩阵\n');b=input('输入列向量b\n');C=input('输入目标函数行向量\n');M=5200;global m;global n;global X;[m,n]=size(A);I=eye(m);A=[A,I];Xb=[];Xn=[];for i=1:mC(i+n)=-M;Xb(i)=n+i;endXb=Xb';Cb=C(1,n+1:n+m);for i=1:nXn(i)=i;endXn=Xn';X=[Xn;Xb];[m,n]=size(A);diedai(A,C,b,Cb,Xb);function[Z]=diedai(A,C,b,Cb,Xb)delta=C-Cb*A;global m;global n;global X;while1s2=0;s1=0;for j=1:nif delta(j)>0s1=1;for i=1:mif A(i,j)>0s2=1;endendendendif s1==0disp('目标函数最优解')Z=Cb*b;disp(Z)disp('基变量为');[Xb,index]=sort(Xb);disp(Xb)b=b(index);disp('基可行解为');disp(b)break;endif s2==0disp('目标函数无界,无最优解');break;end[~,k]=max(delta);p=A(:,k);zhuan=[];for i=1:mzhuan(i)=b(i)/p(i);if zhuan(i)<=0zhuan(i)=inf;endend[~,r]=min(zhuan);b(m+1)=0;Z=[A;delta];Z=[Z,b];z=Z;ark=A(r,k);for j=1:n+1Z(r,j)=Z(r,j)/ark;endif r==1for i=2:m+1for j=1:n+1Z(i,j)=Z(i,j)-z(i,k)*Z(r,j);endendelse for i=[1:r-1,r+1:m+1]for j=1:n+1Z(i,j)=Z(i,j)-z(i,k)*Z(r,j);endendendA=Z(1:m,1:n);delta=Z(m+1,1:n);b=Z(1:m,n+1);Cb(r)=C(k);Xb(r)=X(k);endend。

单纯形算法实验报告

单纯形算法实验报告

x disp('输出线性规划问题的最优值') minf case 0 %有可行解但没有最优值 disp('输出可行解对应的单纯形表') optmatrx disp('输出可行解') x disp('输出线性规划问题的最优值') minf case -1 %没有可行解 disp('没有可行解') disp('输出最优解对应的单纯形表') optmatrx=[] disp('输出最优解') x=[] disp('输出线性规划问题的最优值') minf=-inf end
1 0 0 s = 2 1 0 0 >> dcxsf() 请输入约束中的系数矩阵 A=[-1 0 1 0 0;0 1 0 1 0;-1 2 0 0 1] 请输入约束中的常数向量 b=[4 3 8] 请输入目标函数中的系数向量 c=[-2 -5 0 0 0] i= 1 j= 3 输入的约束中的常数向量b为单行矩阵,已将其转化为单列矩阵 有可行解但没有最优值 flag =
end end A1(x1,1)=i; %将列数既对应的非基变量转换为基变量 decide=find(g1(1,[1:m+n])>0); %再进行查找 end if g1(1,s1)>0 %无解情况 flag=-1; end if g1(1,s1)==0 g1(1,:)=[]; for i6=1:m A(:,n+1)=[]; end for i6=1:m c(n+1)=[]; end decide=find(A1(1:m,1)>n); %查找是否有人工变量 if ~isempty(decide) while ~isempty(decide) x1=decide(1); %存放的是人工变量的行数 text=find(A(x1,1:n)~=0); %该行的所有元素都不为零的列坐标 if isempty(text) decide(1)=[]; A1(x1,:)=[]; A(x1,:)=[]; m=m-1; else i=text(1); %i保存的是列数 A(x1,:)=A(x1,:)/A(x1,i); A1(x1,1)=i; c(1,:)=c(1,:)+(-1*c(1,i)*A(x1,:)); for i1=1:m if i1~=x1 A(i1,:)=A(i1,:)+(-1*A(i1,i)*A(x1,:));

单纯形法matlab程序

单纯形法matlab程序

function Z=dcxf(c,A,N) %定义函数名称为dcxf。

l=length(N);CB=c(N(1):N(l))[m,n]=size(A);b=A(:,n);A=A(:,1:n-1);%参数包括目标函数系数(C),约束条件的系数矩阵(A),%其中A的最后一列为约束条件的右端值b,初始基向量的位置(N)。

…sigma=c-CB*A;%计算检验数sigma。

display('初始单纯形表为:');%输出初始的单纯形表table=[nan,nan,nan,c;CB',N',b,A;nan,nan,nan,si gma]opt=1;step=0;while optstep=step+1;%定义循环,直到第“step”步找到最优解(opt=0)。

if sum(sigma>0)==0 %利用检验数判断是否得到最优解,并给出提示。

display('没有得到最优解,继续迭代.'); ~opt=0;elseinb=find(sigma==max(sigma)); %利用单纯形方法找到入基变量的位置num=length(inb);Inb=inb(num)flag=0;for i=1:m %利用单纯形方法找出出基变量的位置if A(i,inb)>0:theta(i)=b(i)/A(i,inb);elsetheta(i)=inf;endendoutb=find(theta==min(theta));num=length(outb); %判断足否出现退化现象,如出现退化,给il{语言提示,并取最后出现的符合出基条件的变量为出基变量。

if num~=1/display('出现退化情况.');endoutb=outb(num);for i=1:m %将单纯形表进行“转轴”运算,得到新的单纯形表。

for j=1:n-1if i==outbAnew(i,j)=A(outb,j)/A(outb,inb);bnew(i)=b(outb)/A(outb,inb);@elseAnew(i,j)=A(i,j)-A(outb,j)/A(outb,inb)*A(i,inb );bnew(i)=b(i)-b(outb)/A(outb,inb)*A(i,inb);endendenddisplay('主元素为:'),a=[A(outb,inb),outb,inb] %输出主元素,计算新单纯形表的检验数。

单纯形方法(Simplex Method)Matlab 仿真详解

单纯形方法(Simplex Method)Matlab 仿真详解

最近在上最优理论这门课,刚开始是线性规划部分,主要的方法就是单纯形方法,学完之后做了一下大M 算法和分段法的仿真,拿出来与大家分享一下。

单纯形方法是求解线性规划问题的一种基本方法。

单纯形方法基本步骤如下: 1) 将所给的线性规划问题化为标准形式:min ()..0Tf x c x s t Ax bx ==≥s.t.是英文subject to 的简写,意思是受约束,也就是说第一个方程(目标函数)受到后面两个方程的约束。

对于求最大值问题可以将目标函数加负号转换为最小值问题。

max ()min ()T T f x c x f x c x =⇒=-其他的问题就是将实际问题中的不等式约束改为等式约束,主要方法是引进松弛变量和剩余变量,以及将自有变量转换为非负变量。

①对于不等式1b ,1,2,nij ji j a xi m =≤=∑ ,引入松弛变量将其变为等式形式如下:1b ,1,2,0,1,2,nij jn i i j n i a xx i mx i m+=++==≥=∑②对于不等式1b ,1,2,nij ji j a xi m =≥=∑ ,引入剩余变量将其变为等式形式如下:1b ,1,2,0,1,2,nij jn i i j n i a xx i mx i m+=+-==≥=∑③若变量为自有变量(可取正、负或零,符号无限制),则引入两个非负变量将其表示如下:j j j j j x x x x x '''⎧=-⎪'≥⎨⎪''≥⎩ 2)找出一个初始可行基B ,作出单纯形表,这里假设输入的线性规划问题已经有初始可行基。

0T c S A b ⎡⎤=⎢⎥⎢⎦⎣3)测试所有的检验数(目标函数的系数C ),记录检验数中的正数,若全部小于等于0,则已经找到最优解,计算终止。

否则转至4)。

4)测试所有为正的检验数,若在单纯性表中,其所在的列中其他元素全部小于等于0,则此问题无最优解,计算终止,否则转至5)。

利用单纯形求解一般线性规划问题

利用单纯形求解一般线性规划问题

利用单纯形算法求解一般的线性规划问题一:实验目的掌握利用单纯形算法求解一般线性规划问题的步骤。

并能够利用matlab编写程序,求解一般的线性规划问题。

掌握matlab的使用技巧。

二:实验内容利用matlab编写程序,求解下面线性规划的实际问题:某商场决定,营业员每周连续工作5天后连续休息2天,轮流休息,据统计,商场每天需要的营业员如下:星期一:300人星期二:300人星期三:350人星期四:400人星期五:480人星期六:600人星期日:550人问题:(1)商场的人力资源部应如何安排每天的上班人数,使商场总的营业员最少?(2)若商场雇佣临时工,上班时间同正式工。

若正式工工资每天80元,临时工每天100元,问商场是否应雇佣临时工及雇佣多少名?三:求解问题形式如下:min f=c T xs.t. Ax=bx>=0四:函数的调用形式如下:[x,minf,flag,cpt]=dcxsf(A,b,c)其中:A:表示约束条件的系数矩阵b:表示约束条件的常数列向量c:表示目标函数的系数行向量x:为线性规划解向量,当函数有可行解并且有最优值时输出最优解,当有可行解但无最优值或没有可行解时输出x[]。

minf:为目标函数的最优值,当函数有可行解并且有最优值时输出最优值;当有可行解但没有最优值时minf=-inf,输出-1/0;当没有可行解时输出 minf=[]。

flag:为记录函数解的情况,当函数有可行解并且有最优值时,flag=1;当函数有可行但没有最优值时,flag=0;当函数没有可行解时,flag=-1.cpt:为单纯形表,当函数有可行解并且有最优值时输出最优解对应的单纯形表;当有可行解但没有最优值时cpt=[]。

五:函数实现方法该程序由用户输入约束方程组的系数矩阵、常数列向量和目标函数的系数行向量。

通过调用函数的形式,采用两阶段法求解线性规划问题,并输出相应结果。

程序的第一阶段判断问题是否有可行解,若没有,程序停止,输出结果;若有可行解,按第一阶段的方法可以求得一个初始的基本可行解,使运算进入第二阶段。

单纯形法的MATLAB实现

单纯形法的MATLAB实现

clearclcM=1000000;A=[3,2,-3,1,0;1,-2,1,0,1];%约束矩阵C=[-3,1,2,M,M,0];%价值矩阵B=[6,4]';%右端向量s=find(C<0);f=length(s);while(f)for k=1:length(s)x=find(A(:,s(k))>0);y=find(B(x)./A(x,s(1))==min(B(x)./A(x,s(1))));%选择的要有正元素if(length(x)+1==1)break;endendy=x(y);%找到的xj的行数aa=A(y,s(k));%找到的xjA(y,:)=A(y,:)./aa;B(y,:)=B(y,:)./aa;z=find(A(:,s(k)));%除去找到的行z(find(z==y))=[];for i=1:length(z);yz=-A(z(i),s(k));A(z(i),:)=A(z(i),:)+A(y,:)*yz;disp('*')B(z(i),:)=B(z(i),:)+B(y,:).*yz;enddisp('转换后')A=AB=BAB=[A,B];C=C+AB(y,:)*(-C(s(k)))s=find(C<0);vpa([A,B;C]);s=find(C<0);f=length(s);end-C(length(C))%最有解:max 2*x1+3*x2s.t. x1+2*x2<=84*x1<=164*x2<=12x1,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)就可以了。

注:基变量对应的基矩阵一定是单位阵。

(这一局限将在后面的升级是改善)% 求解标准型线性规划:max c*x;s.t. A*x=b;x>=0% 本函数中的A是单纯初始表,包括:最后一行是初始的检验数,最后一列是资源向量b % N是初始的基变量的下标%输出变量sol是最优解%输出变量val是最优值,kk是迭代次数function [sol,val,kk]=ssimplex(A,N)[mA,nA]=size(A);kk=0; %迭代次数flag=1;while flagkk=kk+1;if A(mA,:)<=0 % 已找到最优解flag=0;sol=zeros(1,nA-1);for i=1:mA-1sol(N(i))=A(i,nA);endval=-A(mA,nA);elsefor i=1:nA-1if A(mA,i)>0&A(1:mA-1,i)<=0 %? 问题有无界解disp('have infinite solution!');flag=0;break;endendif flag % 还不是最优表,进行转轴运算temp=0;for i=1:nA-1if A(mA,i)>temptemp=A(mA,i);inb=i; % 进基变量的下标endendsita=zeros(1,mA-1);for i=1:mA-1if A(i,inb)>0sita(i)=A(i,nA)/A(i,inb);endendtemp=inf;for i=1:mA-1if sita(i)>0&sita(i)<temptemp=sita(i);outb=i; %出基变量下标endend%以下更新Nfor i=1:mA-1if i==outbN(i)=inb;endend% 以下进行转轴运算A(outb,:)=A(outb,:)/A(outb,inb);for i=1:mAif i~=outbA(i,:)=A(i,:)-A(outb,:)*A(i,inb);endendendendend。

实验2 单纯形法求解线性规划

实验2 单纯形法求解线性规划

实验2 单纯形法求解线性规划一、实验目的1. 理解线性规划的概念和基本形式。

2. 熟悉单纯形法的步骤和实现过程。

3. 学会使用Matlab编程求解线性规划问题。

二、实验原理线性规划是一种优化问题,其目标是在一组约束条件下,使目标函数(通常是一个线性函数)最大或最小化。

线性规划具有以下一般形式:$$\begin{aligned}&\underset{x_{1},x_{2},\cdots,x_{n}}{\max }\quadc_{1}x_{1}+c_{2}x_{2}+\cdots+c_{n}x_{n}\\&\text{s.t.}\quad a_{11}x_{1}+a_{12}x_{2}+\cdots+a_{1n}x_{n}\leq b_{1}\\&\quad \quad \quad \,\,\,\quada_{21}x_{1}+a_{22}x_{2}+\cdots+a_{2n}x_{n}\leq b_{2}\\&\quad \quad \quad\quad \quad \quad \vdots \\&\quad \quad \quad \,\,\,\quada_{m1}x_{1}+a_{m2}x_{2}+\cdots+a_{mn}x_{n}\leq b_{m}\\&\quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad x_{1},x_{2},\cdots,x_{n}\geq 0\end{aligned}$$其中,$x_{1},x_{2},\cdots,x_{n}$表示决策变量;$c_{1},c_{2},\cdots,c_{n}$是目标函数的系数;$a_{i1},a_{i2},\cdots,a_{in}$($i$=1,2,...,m)是限制条件的系数,$b_{1},b_{2},\cdots,b_{m}$是限制条件右侧的常数。

单纯形法matlab

单纯形法matlab

单纯形法matlab院(系)信息工程与自动化学院指导教师王晓东专业名称仪器仪表专业姓名李方前学号 2012704014单纯形法的Matlab程序如下: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:nif sgm(i)>0h=1;endendwhile h>0[msg,mk]=max(sgm);for i=1:msta(i)=b(i)/A(i,mk);end[mst,mr]=min(sta);zy=A(mr,mk);for i=1:mif i==mrfor j=1:nA(i,j)=A(i,j)/zy;endb(i)=b(i)/zy;endendfor i=1:mif i~=mrfor j=1:nA(i,j)=A(i,j)-A(i,mk)*A(mr,j); endb(i)=b(i)-A(i,mk)*b(mr);endendB1=A(:,1:m);cb(mr)=c(mk);xx(mr)=mk;sgm=c-cb*B1*A;for i=m+1:nif sgm(i)>0h=1;endendendfm=c*xx;例题:编写下列求解如下线性规划问题的单纯形法函数min f'xs.t ax<=b(其中b>=0)函数形式 function [x,fval,it,op]=singl(f,a,b) 输出中 x为最优解fval为最优值it为迭代次数无最优解 op=0有最优解 op=1编写程序如下:function [x,fval,it,op]=singl(f,a,b)[m,n]=size(a);c=[a eye(m) b;f' zeros(1,m+1)];fval=0;x=zeros(m+n,1);op=1;it=0;e=zeros(1,m);lie=find(f<0);l=length(lie);while(l>0)for j=1:ld=find(c(:,lie(j)));d_l=length(d);if d_l>0for i=1:mif c(i,lie(j))>0e(i)=c(i,end)/c(i,lie(j)); elsee(i)=inf;endend[g,h]=min(e);for w=1:m+1if w==hc(w,:)=c(w,:)/c(h,lie(j)); elsec(w,:)=c(w,:)-c(h,:)*c(w,lie(j))/c(h,lie(j)); endendit=it+1;elseop=0;endendlie=find(c(end,:)<0);l=length(lie);endfor i=1:(m+n)ix=find(c(:,i));if(length(ix)==1)&(ix<=m)&(c(ix,i)==1)x(i)=c(ix,end)elsex(i)=0endendfval=-c(end,end);。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

北京联合大学
实验报告
项目名称:运筹学专题实验报告
学院:自动化专业:物流工程
班级: 1201B 学号:************* 姓名:管水城成绩:
2015 年 5 月 6 日
实验二:MATLAB 编程单纯形法求解
一、实验目的:
(1)使学生在程序设计方面得到进一步的训练;,掌握Matlab (C 或VB)语言进行程序设计中一些常用方法。

(2)使学生对线性规划的单纯形法有更深的理解. 二、实验用仪器设备、器材或软件环境 计算机, Matlab R2006
三、算法步骤、计算框图、计算程序等
本实验主要编写如下线性规划问题的计算程序:
⎩⎨
⎧≥≥≤0
,0..min b x b Ax t s cx 其中初始可行基为松弛变量对应的列组成. 对于一般标准线性规划问题:
⎩⎨
⎧≥≥=0
,0..min b x b Ax t s cx 1.求解上述一般标准线性规划的单纯形算法(修正)步骤如下:
对于一般的标准形式线性规划问题(求极小问题),首先给定一个初始基本可行解。

设初始基为B,然后执行如下步骤: (1).解
B Bx b
=,求得
1
B x B b -=,0,N B B x f c x ==令计算目标函数值 1(1,2,...,)i m B b i -=i 以b 记的第个分量
(2).计算单纯形乘子w,
B
wB C =,得到1
B w
C B -=,对于非基变量,计算判别
数1i i i B i i z c c B p c σ-=-=-,可直接计算σ
=1
B A c c B --令
max{
}k i R
σσ
∈=,R 为非基变量集合
若判别数0k σ≤ ,则得到一个最优基本可行解,运算结束;否则,转到下一步 (3).解
k k
By p =,得到
1
k k y B p -=;若0k y ≤,即k y 的每个分量均非正数, 则停止计算,问题不存在有限最优解,否则,进行步骤(4).确定下标r,使
{
}:0
min ,0
t r
rk
tk
tk b b tk y y t y y >=>且r
B x 为离基变量,
,r k B x p k 为进基变量,用p 替换得到新的基矩阵B,还回步骤(1)
;
2、计算框图为:
图1 3.计算程序(Matlab):
A=input('A=');
b=input('b=');
c=input('c=');
format rat%可以让结果用分数输出
[m,n]=size(A);
E=1:m;E=E';
F=n-m+1:n;F=F';
D=[E,F]; %创建一个一一映射,为了结果能够标准输出
X=zeros(1,n); %初始化X
if(n<m) %判断是否为标准型
fprintf('不符合要求需引入松弛变量')
flag=0;
else
flag=1;
B=A(:,n-m+1:n); %找基矩阵
cB=c(n-m+1:n); %基矩阵对应目标值的c
while flag
w=cB/B; %计算单纯形乘子,cB/B=cB*inv(B),用cB/B的目的是,为了提高运行速度。

panbieshu=w*A-c %计算判别数,后面没有加分号,就是为了计算后能够显示出来。

[z,k]=max(panbieshu); % k作为进基变量下标。

fprintf('b''./(B\\A(:,%d))为',k);
b'./(B\A(:,k))
if(z<0.000000001)
flag=0; %所有判别数都小于0时达到最优解。

fprintf(' 已找到最优解!\n');
xB=(B\b')';
f=cB*xB';
for i=1:n
mark=0;
for j=1:m
if (D(j,2)==i)
mark=1;
X(i)=xB(D(j,1)); %利用D找出xB与X之间的关系。

end
end
if mark==0
X(i)=0; %如果D中没有X(i),则X(i)为非基变量,所以X(i)=0。

end
end
fprintf('基向量为:'); X
fprintf('目标函数值为:') ; f
else
if(B\A(:,k)<=0) % 如果B\A(;,k)中的每一个分量都小于零。

flag=0;
fprintf(' \n 此问题不存在最优解!\n'); %若B\A(:,k)的第k列均不大于0,则该问题不存在最优解。

else
b1=B\b';
temp=inf;
for i=1:m
if ((A(i,k)>0) && (b1(i)/(A(i,k)+eps))<temp ) temp=b1(i)/A(i,k); %找退基变量
r=i;
end
end
fprintf('x(%d)进基,x(%d)退基\n',k,D(r,2)); %显示进基变量和退基变量
B(:,r)=A(:,k);
cB(r)=c(k); %确定进基退基变量后,相应的基矩阵及新基对应的目标值的c也相应改变
D(r,2)=k; %改变D中的映射关系
end
end
end
end
程序保存为danchunxin.m文件
四.数值实验及其结果:
打开matlab软件,点击运行danchunxin.m,出现命令符要求输入相应矩阵命令。

1.求解:
输入数据矩阵如下:
A=[9 4 1 0 0;4 5 0 1 0;3 10 0 0 1]
b=[360 200 300]
c=[-7 -12 0 0 0]
点击运行得如下图:
图2
由实验结果可知,该问题的最优解为:x1=100,x2=0,x3=540,x4=200,x5=0,最大值为700。

2.求解:
输入数据矩阵如下:
A=[-3 -2 -1 -6 -18 1 0;-1 -0.5 -0.2 -2 -0.5 0 1;0.5 1 0.2 2 0.8 0 0] b=[-700 -30 200]
c=[2 7 4 9 5 0 0]
点击运行得如下图:
图3
由实验结果可知,该问题的最优解为:
x1=15200/33,x2=0,x3=0,x4=0,x5=1250/33,x6=0,最小值为:1235/3。

3.求解:
输入数据矩阵如下:
A=[1 -2 1 1 0;4 -1 -2 0 1;-2 0 1 0 0]
b=[11 -3 1]
c=[3 -1 -1 0 0]
点击运行得如下图:
图4
由实验结果可知,该线性问题不存在最优解。

五.实验总结
通过该实验,加深了对线性规划问题的理解,并加深了将实际问题进行数学建模转化为可利用MATLAB软件处理的线性规划问题,通过使用该软件,能充分的将复杂的线性规划问题通过编写程序实现相应的逻辑求解线性规划问题,在实际操作过程中,大大的减少了线性规划问题的运算的复杂性。

编写函数程序代码是遇到了很多问题,但在老师的帮助下,逐一的解决了,为进行下面的实验奠定了一定的基础。

相关文档
最新文档