单纯形法
simplex method
求解线性规划问题的通用方法对偶单纯形法。单纯形是美国数学家G.B.丹齐克于1947年首先提出来的。它的理论根据是:线性规划问题的可行域是 n维向量空间Rn中的多面凸集,其最优值如果存在必在该凸集的某顶点处达到。顶点所对应的可行解称为基本可行解。单纯形法的基本思想是:先找出一个基本可行解,对它进行鉴别,看是否是最优解;若不是,则按照一定法则转换到另一改进的基本可行解,再鉴别;若仍不是,则再转换,按此重复进行。因基本可行解的个数有限,故经有限次转换必能得出问题的最优解。如果问题无最优解也可用此法判别。
根据单纯形法的原理,在线性规划问题中,决策变量(控制变量)x1,x2,…x n的值称为一个解,满足所有的约束条件的解称为可行解。使目标函数达到最大值(或最小值)的可行解称为最优解。这样,一个最优解能在整个由约束条件所确定的可行区域内使目标函数达到最大值(或最小值)。求解线性规划问题的目的就是要找出最优解。
最优解可能出现下列情况之一:①存在着一个最优解;②存在着无穷多个最优解;③不存在最优解,这只在两种情况下发生,即没有可行解或各项约束条件不阻止目标函数的值无限增大(或向负的方向无限增大)。
单纯形法的一般解题步骤可归纳如下:①把线性规划问题的约束方程组表达成典范型方程组,找出基本可行解作为初始基本可行解。②若基本可行解不存在,即约束条件有矛盾,则问题无解。③若基本可行解存在,从初始基本可行解作为起点,根据最优性条件和可行性条件,引入非基变量取代某一基变量,找出目标函数值更优的另一基本可行解。④按步骤3进行迭代,直到对应检验数满足最优性条件(这时目标函数值不能再改善),即得到问题的最优解。⑤若迭代过程中发现问题的目标函数值无界,则终止迭代。
用单纯形法求解线性规划问题所需的迭代次数主要取决于约束条件的个数。现在一般的线性规划问题都是应用单纯形法标准软件在计算机上求解,对于具有106个决策变量和104个约束条件的线性规划问题已能在计算机上解得。
改进单纯形法
原单纯形法不是很经济的算法。1953年美国数学家G.B.丹齐克为了改进单纯形法每次迭代中积累起来的进位误差,提出改进单纯形法。其基本步骤和单纯形法大致相同,主要区别是在逐次迭代中不再以高斯消去法为基础,而是由旧基阵的逆去直接计算新基阵的逆,再由此确定检验数。这样做可以减少迭代中的累积误差,提高计算精度,同时也减少了在计算机上的存储量。
对偶单纯形法
1954年美国数学家C.莱姆基提出对偶单纯形法。单纯形法是从原始问题的一个可行解通过迭代转到另一个可行解,直到检验数满足最优性条件为止。对偶单纯形法则是从满足对偶可行性条件出发通过迭代逐步搜索原始问题的最优解。在迭代过程中始终保持基解的对偶可行性,而使不可行性逐步消失。设原始问题为min{cx|Ax=b,x≥0},则其对偶问题为 max{yb|yA≤c}。当原始问题的一个基解满足最优性条件时,其检验数cBB-1A-c≤0。即知y=cBB-1(称为单纯形算子)为对偶问题的可行解。所谓满足对偶可行性,即指其检验数满足最优性条件。因此在保持对偶可行性的前提下,一当基解成为可行解时,便也就是最优解。
数学优化中,由George Dantzig发明的单纯形法是线性规划问题的数值求解的流行技术。有一个算法与此无关,但名称类似,它是Nelder-Mead法或称下山单纯形法,由Nelder和Mead发现(1965年),这是用于优化多维无约束问题的一种数值方法,属于更一般的搜索算法的类别。
这二者都使用了单纯形的概念,它是N维中的N + 1个顶点的凸包,是一个多胞体:直线上的一个线段,平面上的一个三角形,三维空间中的一个四面体,等等。
大M法,M为任意大正数。还有二阶法
高分求 matlab 对偶单纯形法 程序 ,
刚好我也做了这个,给你参考哈
function x=lindual(c,A,b)
[n1,n2]=size(A);
A=[A,eye(n1)];c=[-c,zeros(1,n1)];
x1=[zeros(1,n2),b\'];lk=[n2+1:n1+n2];
while(1)
x=x1(1:n2);
s1=[lk\',b,A]
c
x1
cc=[];ci=[];
for i=1:n1
if b(i)<0
cc=[cc,b(i)];
ci=[ci,i];
end
end
nc=length(cc);
if nc==0
fprintf(\'达到最优解\');
break
end
cliu=cc(1);
cl=ci(1);
for j=1:nc
if abs(cc(j))>abs(cliu)
cliu=cc(j);
cl=j;
end
end
cc1=[];ci1=[];
for i=1:n1+n2
if A(cl,i)<0
cc1=[cc1,A(cl,i)];
ci1=[ci1,i];
end
end
nc1=length(cc1);
if nc1==0
fprintf(\'无可行解\');
break
end
cliu=c(ci1(1))/cc1(1);
cl1=ci1(1);
for j=1:nc1
if c(ci1(j))/cc1(j)<cliu
cliu=c(ci1(j))/cc1(j);
cl1=ci1(j);
end
end
b(cl)=b(cl)/A(cl,cl1);
A(cl,:)=A(cl,:)/A(cl,cl1);
for k=1:n1
if k~=cl
b(k)=b(k)-b(cl)*A(k,cl1);
A(k,:)=A(k,:)-A(cl,:).*A(k,cl1);
end
end
c=c-c(cl1).*A(cl,:);
x1(lk(cl))=0;
lk(cl)=cl1;
for kk=1:n1
x1(lk(kk))=b(kk);
end
x=x1(1:n2);
end
验证p62运筹学
min ω=2x1+3x2+4x3
x1+2x2+x3≥3
2x1-x2+3x3≥4
x1,x2,x3≥0
检验
format rat
c=[2 3 4];A=[-1 -2 -1;-2 1 -3];b=[-3;-4];
x=lindual(c,A,b)
matlab 对偶单纯形法/zzz700/blog/item/a501718e207ba1619e2fb4b6.html