单纯形法matlab
单纯形方法(SimplexMethod)Matlab仿真详解

单纯形方法(SimplexMethod)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单纯形法

%求解标准型线性规划: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);%给每个变量赋初值0for i=1:mA-1sol(N(i))=A(i,nA);%给基变量赋新值(替换0)end %给出最优解val=-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; % 进基变量的下标endend %选择最大检验数纵向对应的变量为进基变量sita=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 %选择最小的sita横向对应的变量为出基变量%以下更新Nfor i=1:mA-1if i==outbN(i)=inb;%以进基变量的下标替代出基变量的下标endend%以下进行转轴运算A(outb,:)=A(outb,:)/A(outb,inb);%将主元化为1for i=1:mAif i~=outbA(i,:)=A(i,:)-A(outb,:)*A(i,inb);%将进基变量所在列除主元外的其余元素化为0endendendendend。
Matlab中的最优化问题求解方法

Matlab中的最优化问题求解方法近年来,最优化问题在各个领域中都扮演着重要的角色。
无论是在工程、经济学还是科学研究中,我们都需要找到最优解来满足特定的需求。
而Matlab作为一种强大的数值计算软件,在解决最优化问题方面有着广泛的应用。
本文将介绍一些Matlab中常用的最优化问题求解方法,并探讨其优缺点以及适用范围。
一. 无约束问题求解方法1. 最速下降法最速下降法是最简单且直观的无约束问题求解方法之一。
其基本思想是沿着梯度的反方向迭代求解,直到达到所需的精度要求。
然而,最速下降法的收敛速度通常很慢,特别是在局部极小值点附近。
2. 共轭梯度法共轭梯度法是一种改进的最速下降法。
它利用了无约束问题的二次函数特性,通过选择一组相互共轭的搜索方向来提高收敛速度。
相比于最速下降法,共轭梯度法的收敛速度更快,尤其适用于大规模优化问题。
3. 牛顿法牛顿法是一种基于二阶导数信息的优化方法。
它通过构建并求解特定的二次逼近模型来求解无约束问题。
然而,牛顿法在高维问题中的计算复杂度较高,并且需要矩阵求逆运算,可能导致数值不稳定。
二. 线性规划问题求解方法1. 单纯形法单纯形法是一种经典的线性规划问题求解方法。
它通过在可行域内进行边界移动来寻找最优解。
然而,当问题规模较大时,单纯形法的计算复杂度会大幅增加,导致求解效率低下。
2. 内点法内点法是一种改进的线性规划问题求解方法。
与单纯形法不同,内点法通过将问题转化为一系列等价的非线性问题来求解。
内点法的优势在于其计算复杂度相对较低,尤其适用于大规模线性规划问题。
三. 非线性规划问题求解方法1. 信赖域算法信赖域算法是一种常用的非线性规划问题求解方法。
它通过构建局部模型,并通过逐步调整信赖域半径来寻找最优解。
信赖域算法既考虑了收敛速度,又保持了数值稳定性。
2. 遗传算法遗传算法是一种基于自然进化过程的优化算法。
它模拟遗传操作,并通过选择、交叉和变异等操作来搜索最优解。
遗传算法的优势在于其适用于复杂的非线性规划问题,但可能需要较长的计算时间。
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程序

单纯形法(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编程单纯形法求解

北京联合大学实验报告工程名称:运筹学专题实验报告学院:自动化专业:物流工程班级: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编程单纯形法求解北京联合大学实验报告项目名称:运筹学专题实验报告学院:自动化专业:物流工程班级: 1201B 学号:2021100358081 姓名:管水城成绩:2021 年 5 月 6 日实验二:MATLAB编程单纯形法求解一、实验目的:(1)使学生在程序设计方面得到进一步的训练;,掌握Matlab (C或VB)语言进行程序设计中一些常用方法。
(2)使学生对线性规划的单纯形法有更深的理解. 二、实验用仪器设备、器材或软件环境计算机, Matlab R2021三、算法步骤、计算框图、计算程序等本实验主要编写如下线性规划问题的计算程序:mincx?Ax?b s.t.??x?0,b?0其中初始可行基为松弛变量对应的列组成. 对于一般标准线性规划问题:mincx?Ax?b s.t.??x?0,b?01.求解上述一般标准线性规划的单纯形算法(修正)步骤如下:对于一般的标准形式线性规划问题(求极小问题),首先给定一个初始基本可行解。
设初始基为B,然后执行如下步骤:?1Bx?bx?Bb,令xN?0,计算目标函数值f?cBxB BB(1).解,求得以bi(i?1,2,...,m)记B?1b的第i个分量?1wB?Cw?CBBB(2).计算单纯形乘子w, ,得到,对于非基变量,计算判别数?i?zi?ci?cBB?1pi?ci,可直接计算i?R??cBBA?c令?1 ?k?max{?},R为非基变量集合若判别数步?1By?py?Bpk;若yk?0,即yk的每个分量均非正数, kkk(3).解,得到?k?0 ,则得到一个最优基本可行解,运算结束;否则,转到下一则停止计算,问题不存在有限最优解,否则,进行步骤(4).确定下标r,使bryrk?min?t:ytk?0btytk,且ytk?0?xB为离基变量,rxk为进基变量,用pk替换pBr,得到新的基矩阵B,还回步骤(1);2、计算框图为:开始初始可行基B x?B?1b,x?0,f?cx 令BNBB计算单纯性乘子w?cBB?1,计算判别数?j?wpj?cj,j?R(非基变量)令?k?max{?j,j?R}?k?0是 ? 否得到最优解方程Byk?pk,得到yk?B?1pk,是 yk?0? 否不存在有限确定下标r,使得 ?b?br?min?i|yik?0? yrk?yik?xBr为退基变量,xk进基变量,以pk代替pBr,得到新的基矩阵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); %初始化X感谢您的阅读,祝您生活愉快。
实验报告(单纯形法的matlab程序)

实验报告(单纯形法的matlab程序)实验一:线性规划单纯形算法一、实验目的通过实验熟悉单纯形法的原理,掌握Matlab 循环语句的应用,提高编程的能力和技巧。
二、算法对于一般的标准形式线性规划问题(求极小问题),首先给定一个初始基本可行解。
设初始基为B,然后执行如下步骤:(1).解B Bx b =,求得1B x B b -=,0,N B B x f c x ==令计算目标函数值 1(1,2,...,)i mB b i -=i 以b 记的第个分量(2).计算单纯形乘子w , B wB C =,得到1B w C B -=,对于非基变量,计算判别数1i i i B i i z c c B p c σ-=-=-,令 max{}k i i i Rz c σ∈=-,R 为非基变量集合若判别数0k σ≤ ,则得到一个最优基本可行解,运算结束;否则,转到下一步(3).解k k By p =,得到1kk y B p -=;若0k y ≤,即k y 的每个分量均非正数,则停止计算,问题不存在有限最优解,否则,进行步骤(4).(4).确定下标r,使{}:0min ,0t rrk tk tk b b tk y y t y y >=>且r B x 为离基变量。
k x 为进基变量,用k p 替换r B p ,得到新的基矩阵B ,返回步骤(1)。
对于极大化问题,可以给出完全类似的步骤,只是确定进基变量的准则不同。
对于极大化问题,应令min{}k k j j z c z c -=-四、计算框图是否是否五、计算程序function [x,f]=zuiyouhua(A,b,c)初始可行解B 令1,0,B N B B x B b b x f c x -==== 计算单纯形乘子1B w c B -=,计算判别数,i j j wp c j R σ=-∈(非基变量)令max{,}k j j R σσ=∈ 0?k σ≤ 得到最优解解方程k k By p =,得到1k k y B p -=。
单纯形法的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。
线性规划单纯形法matlab解法

%单纯形法matlab程序-ssimplex% 求解标准型线性规划:max c*x; . A*x=b; x>=0% 本函数中的A是单纯初始表,包括:最后一行是初始的检验数,最后一列是资源向量b% N是初始的基变量的下标% 输出变量sol是最优解, 其中松弛变量(或剩余变量)可能不为0% 输出变量val是最优目标值,kk是迭代次数% 例:max 2*x1+3*x2% . 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 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。
单纯形方法(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实现

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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数
学
软
件
与
实
验
数学与信息科学学院
信息与计算科学
单纯形法的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: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;
例题:
编写下列求解如下线性规划问题的单纯形法函数min f'x
s.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:l
d=find(c(:,lie(j)));
d_l=length(d);
if d_l>0
for i=1:m
if c(i,lie(j))>0
e(i)=c(i,end)/c(i,lie(j));
else
e(i)=inf;
end
end
[g,h]=min(e);
for w=1:m+1
if w==h
c(w,:)=c(w,:)/c(h,lie(j));
else
c(w,:)=c(w,:)-c(h,:)*c(w,lie(j))/c(h,lie(j));
end
end
it=it+1;
else
op=0;
end
end
lie=find(c(end,:)<0);
l=length(lie);
end
for i=1:(m+n)
ix=find(c(:,i));
if(length(ix)==1)&(ix<=m)&(c(ix,i)==1) x(i)=c(ix,end)
else
x(i)=0
end
end
fval=-c(end,end);。