单纯形法简介在其他网站上都可以查到,我就不多说了
我们主要说方法
它主要解决的是局部最优解的问题
利用多边形进行求解的,若有n个变量,则利用n+1边形
我们这里以两个变量为例,求解第三维度的最优解
例如解决
min f(x,y)=x2 - 4*x + y2 - y - x*y
matlab 图
可以看出,差不多是(3,2)附近取得最小
我们来用下山单纯形求解
我们设立三个初始点 (0,0),(1.2,0),(0,0.8)
我们把它们分别带入f中,函数值越小的越接近解,我们把它称为最好点,反之,函数值最大的点,我们称之为最坏点
我们要做的是,利用已知点,寻找更加接近解的点
我们需要了解几种寻找下一个点的思想
反射 reflect
假设三角形的三个点是ABP,其中P是最坏点,那么我们寻找一个Q点,使得APBQ是一个平行四边形
设向量α为p->A,β为p->B (假设1)
那么Q = p + (α+β),其中p和Q是坐标
扩张 extern
假设,我们得到的新点Q,它比原来三角形中最好的点还要好,那么,我们可以假定这个探索方向是正确的,我们不妨再往前走一步!
其中Q->R = (p->R)/2,我们这里称扩张Q点
设向量α为Q->A, β为Q->B (假设2)
于是,R = Q - (α+β)/2
收缩 Shrink
我认为收缩有两种
因为我们一般先做反射点,所以,之后的操作如果针对反射点,那么就是对反射点进行收缩
基于(假设2),R = Q + (α+β)/4
还有一种是最优解本来就在三角形PAB中,我们对P做收缩
基于(假设1),则Q = P + (α+β)/4
压缩 compress
我们认为,如果上述操作均没有找到更好的点来替代最坏点,那么说明之前的三角形是非法的,那么我们进行压缩操作
即,取两边中点与最坏点构成新的三角形
我们用下山单纯形法求解步骤如下:
求出初始点的最坏点,构成三角形
重复下述,直到满足精度
先做一次反射
如果反射点比最好点还要好(更加接近条件:min f(x0,y0))->做一次扩张
如果扩张点比反射点还要好->扩张点代替之前的最坏点,形成新的三角形
反之->反射点代替之前的最坏点
反之,如果反射点比最坏点还要坏->反射点做收缩1
如果收缩点1比最坏点好->收缩点1代替最坏点
反之->最坏点做收缩2
如果收缩点2比最坏点好->收缩点2代替最坏点
反之->三角形做收缩
反之,反射点代替最坏点,形成新的三角形
C++代码:
triangle.h<