单纯形法步骤
- 格式:docx
- 大小:32.10 KB
- 文档页数:3
单纯形⽅法(SimplexMethod)最近在上最优理论这门课,刚开始是线性规划部分,主要的⽅法就是单纯形⽅法,学完之后做了⼀下⼤M算法和分段法的仿真,拿出来与⼤家分享⼀下。
单纯形⽅法是求解线性规划问题的⼀种基本⽅法。
线性规划就是在⼀系列不等式约束下求⽬标函数最⼤值或最⼩值的问题,要把数学中的线性规划问题⽤计算机来解决,⾸先要确定⼀个标准形式。
将所给的线性规划问题化为标准形式:s.t.是英⽂subject to 的简写,意思是受约束,也就是说第⼀个⽅程受到后⾯两个⽅程的约束。
对于求最⼤值问题可以将⽬标函数加负号转换为最⼩值问题。
对于求最⼤值问题可以将⽬标函数加负号转换为最⼩值问题。
其他的问题就是将实际问题中的不等式约束改为等式约束,主要⽅法是引进松弛变量和剩余变量,以及将⾃有变量转换为⾮负变量。
①对于不等式,引⼊松弛变量将其变为等式形式如下:②对于不等式,引⼊剩余变量将其变为等式形式如下:③若变量为⾃有变量(可取正、负或零,符号⽆限制),则引⼊两个⾮负变量将其表⽰如下:关于线性规划问题的解:确定了标准形式,我们就针对这个标准形式讨论⼀下线性规划问题的解。
线性规划问题的解能满⾜标准形式中约束条件的向量X的值,但只有最优解才能使⽬标函数值最⼩。
对于上⽂中的标准形式,约束矩阵A是⼀个m*n维矩阵,且m<n,所以⼀定可以从A中找到⼀个满秩m*m矩阵。
这个矩阵就称作矩阵A的⼀个基阵,矩阵A就可以写作 [B N] , 相应的解 x 也可以写成 x=(xB,xN)’,那么 Ax=b 就变为,左式两端同乘B矩阵的逆,得到。
由此引出下列名词:基阵:⾮奇异矩阵(满秩矩阵、可逆矩阵)B基向量:基阵B由m个线性⽆关的向量组成,称之为基向量基变量:向量xB各分量,与基向量对应的xB中的m个分量成为基变量⾮基变量:向量xN各分量基本解:令xN各分量为0,由得到的解称为基阵B对应的基本解基本可⾏解:当成⽴时,称基本解为基本可⾏解,因为只有满⾜所有分量不⼩于0,才符合标准形式中的约束条件(最后⼀条)。
单纯形法求解过程单纯形法是一种经典的线性规划求解方法,它是由乔治·达竞士等人在1947年提出的。
该方法的基本思想是,通过在单纯形空间内不断移动顶点的位置来寻找最优解。
单纯形法是目前广泛应用的线性规划求解方法之一,它求解线性规划问题可大大地简化计算过程。
单纯形法的求解过程包括以下几个步骤:1. 将线性规划问题转化为标准形式线性规划问题的标准形式为:$ \max_{x} \ \ c^T x $$s.t. \ Ax=b$$x\geq 0$其中,$x$是要求解的向量;$b$是一个常数向量;$A$是一个$m\times n$的矩阵;$c$是一个常数向量。
2. 初始化单纯形表因为单纯形法是通过移动顶点来寻找最优解的方法,因此需要初始化单纯形表。
单纯形表是将原始的约束条件表示为不等式形式时形成的。
例如,对于一个带有3个变量的线性规划问题,其单纯形表的形式如下:CB | X1 | X2 | X3 | X4 | RHS----|-----|-----|-----|-----|----0 | a11| a12| a13| 0 | b10 | a21| a22| a23| 0 | b20 | a31| a32| a33| 0 | b31 | z1 | z2 | z3 | 0 | 0其中,CB代表成本系数,X1、X2、X3、X4分别代表变量。
a11、a12、a13等代表矩阵A中的元素,b1、b2、b3代表矩阵b中的元素。
3. 选择进入变量和离开变量在单纯形表中,规定最后一列为等式右边的常数(RHS),即b。
在单纯形法的求解过程中,首先需要选择一个“进入变量”,即在单纯形表的第一行中,寻找一个系数为正的变量,使得将其加入目标函数后,目标函数值可以上升。
这里以X1为例,X1为进入变量。
接着,需要选择一个“离开变量”,即在单纯形表中,寻找一个使得添加X1变量后,约束条件不改变且取得约束条件中系数最小的一个变量离开。
三、单纯形法的解题步骤第一步:作单纯形表.)(1)把原线性规划问题化为标准形式;)(2)找出初始可行基,通常取约束方程组系数矩阵中的单位矩阵;)(3)目标函数非基化;)(4)作初始单纯形表.第二步:最优解的判定.(1) 若所有检验数都是非正数,即,则此时线性规划问题已取得最优解.(2) 若存在某个检验数是正数,即,而所对应的列向量无正分量,则线性规划问题无最优解.如果以上两条都不满足,则进行下一步.第三步:换基迭代.,并确定所在列的非基变量为进基变量.(1)找到最大正检验数,设为(2)对最大正检验数所在列实施最小比值法,确定出主元,并把主元加上小括号.主元是最大正检验数所在列,用常数项与进基变量所对应的列向量中正分量的比值最小者;替换出基变量,从而得到新的基变量.也就是主元所在(3)换基:用进基变量(4)利用矩阵的行初等变换,将主元变为1,其所在列其他元素都变为零,从此得到新的单纯形表;(5)回到第二步,继续判定最优解是否存在,然后进行新一轮换基迭代,直到问题得到解决为止.例3 求.解(1)化标准型:令,引进松弛变量,其标准型为求(2)作单纯形表:在约束方程组系数矩阵中的系数构成单位矩阵,故取为基变量,目标函数已非基化了,作初始单纯形表并“换基迭代”(见表6.8).表 6.8(3)最终结果:此时检验数均为非正数,线性规划问题取得最优解,最优解为标函数取得最优值.目性规划问题的最优解为:.原线目标函数的最优值为14,即.例4 用单纯形方法解线性规划问题.求.解此数学模型已是标准型了,其中约束方程含有一个二阶单位矩阵(1、2行,3、4列构成),取为基变量,而目标函数没有非基化.从约束方程找出,,代入目标函数, 经整理后,目标函数非基化了.作单纯形表,并进行换基迭代(见表6.9).最大检验数,由最小比值法知:为主元,对主元所在列施以行初等变换,基变量出基,非基变量进基.表 6.9目前最大检验数,其所在列没有正分量,所以该线性规划问题没有最优解.例5用单纯形方法解线性规划问题.求解此数学模型已是标准型了,其中约束方程含有一个二阶单位矩阵,取为基变量,而目标函数没有非基化.从约束方程找出,,代入目标函数,经整理得,目标函数已非基化.作单纯形表,并进行换基迭代(见表6.10).最大检验数,由最小比值法知:为主元,对主元所在列施以行初等变换,基变量出基,非基变量x2进基,先将主元化为1,然后再将主元所在列的其他元素化为零.表 6.10至此,检验数均为非正数,故得基础可行解.原问题的最优解为:.最优值为6,即.如果我们再迭代一次,将基变量出基,非基变量进基(见表6.11).表 6.11可得到另一个基础可行解,原问题的最优解为:,最优值仍为6,说明该线性规划问题有无穷多最优解,其最优解均为6.如何知道线性规划问题有无穷多最优解呢?这主要反映在单纯形表中.如果非基变量所对应的检验数为0,我们可对此列继续进行换基迭代,就可以得到另一个基础可行解.以此作下去,可得到许多基础可行解,即相对应的最优解有无穷多个.(4) 011 0。
单纯形法步骤:
1. 给定初始点 )0(x 初始单纯形边长 a ,
α , 收缩系数 β , 延伸系数 γ 以及精度要求 ε。
2. 作出初始单纯形图
3. 找出坏点 )(h x 、好点 )(e x 计算中心点 )1(+n x 及 反射点 )2(+n x 和各点上的目标函数值
4. 比较反射点和除了坏点上的函数值,
5.
⑴. 如果反射点上的函数值比好点差,但比坏点外的其他顶点函数值好,认为反射成功,将反射点代替坏点构成新的单纯形,转7 ⑵. 如果反射点上的函数比好点还要好,说明反射点很好,可以沿此方向作延伸尝试,如果延伸点上的函数值比好点还好,则将延伸点取代坏点,形成新单纯形,转7。
反之,延伸点上函数值不如好点,说明延伸失败,但反射还是成功的,所以仍可用反射点代替坏点,然后转7
5. 如果反射点连坏点都不如,说明反射失败,那么作收缩,找出收缩点的函数值,并转
6.;如果反射点仅比坏点好,则将反射点取代坏点,然后收缩,转下一步6。
6. 如果收缩点上函数比坏点还差,说明收缩也失败,作缩小运算,形成缩小后的单纯形转7;反之(即收缩点上的函数值比坏点好),说明收缩成功,用收缩点代替坏点,形成新的单纯形转。
转下一步7。
7. 检查是否满足精度要求 ()(1)max
(()i n f x f x ε+-≤
如满足,停止迭代,否则转3,继续迭代。
%三个考察点,最优,次差,最差
best = vx(: , 1) ; fbest = vf(1) ;
soso = vx(: , n) ; fsoso = vf(n) ;
worst = vx(: , n+1) ; fworst = vf(n+1) ;
center = sum(vx(: , 1:n) , 2) ./ n ;
r = 2 * center - worst ;%反射点
fr = feval(fun , r) ;
if fr < fbest %比最好的结果还好,说明方向正确,考察扩展点,以期望更多的下降
e = 2 * r - center ; %扩展点
fe = feval(fun , e) ;
if fe < fr %在扩展点和反射点中选择较优者去替换最差点
vx(: , n+1) = e ; f(: , n+1) = fe ;
else
vx(: , n+1) = r ; vf(: , n+1) = fr ;
end
else
if fr < fsoso %比次差结果好,能够改进
vx(: , n+1) = r ; vf(: , n+1) = fr ;
else %比次差结果坏,当压缩点无法得到更优值的时候,考虑收缩
shrink = 0 ;
if fr < fworst %由于r点更优所以向r点的方向找压缩点
c = ( r + center ) ./ 2 ; fc = feval(fun , c) ;
if fc < fr %确定从r压缩向c可以改进
vx(: , n+1) = c ; vf(: , n+1) = fc ;
else %否则的话,准备进行收缩
shrink = true ;
end
else
c = (worst + center) ./ 2 ; fc = feval(fun , c) ;
if fc < fr %确定从r压缩向c可以改进
vx(: , n+1) = c ; vf(: , n+1) = fc ;
else %否则的话,准备进行收缩
shrink = 1 ;
end
end%fr < fworst
if shrink %压缩点并非更优,考虑所有点向best收缩
for i = 2:n+1
vx(: , i) = ( vx(i) + best ) ./ 2 ; vf(: , i) = feval(fun , vx(: , i)) ;
end
end %shrink
end%fr < fsoso
end %fr < fbest
[vf index] = sort(vf) ;
vx = vx(:,index) ;。