单纯形法步骤:
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) ;。