最优化-直接方法
坐标轮换法
对于n维最优化问题
有初始点x1 沿着n个方向(坐标轴的方向)不断做一维搜索 得到xn+1
对于x1沿着 xn+1 - x1的方向做一维搜索得到 xn+2
xi+1 = xi + α*di
当xin+1满足某一终止准则时,停止算法,否则继续迭代下去
正交程度和共轭程度
正交程度
对于两个方向向量u1,u2
我们以这两个方向向量单位向量的平行四边形面积作为正交程度
对于二维向量 δ = (x1 * y2 - y1*x2) δ = || u1 × u2||
对于n维向量其中的d需要是已经单位化的向量
δ = | det(d1,d2,d3,,,,,dn) |
det表示行列式的值
共轭程度
q = G1/2 * d
q的正交程度即为d关于G的共轭程度
正交程度和共轭程度都是越接近与1越好
Powell直接方法
对于n维函数f(x)
取初始点x1和n个正交方向 di 进行一维搜索
得到点列xi xi+1 = xi + α*di
求出进行一维搜索时,函数值下降的最大的位置xm
f(xm) - f(xm+1)最大
记这个搜索方向为U
求解一维搜索问题
u = xn+1 - x1
xn+2 = x1 + α*μ 记步长为alaph
若 || xn+2 - x1 || < ε 终止算法
若最后一次搜索的步长 alaph <( (f(x1) - f(xn+2)) / u ) 1/2
则用最后的搜索方向替换第m次的搜索方向
具体替换方式,用前移的方式去填充空格,然后将最后的方向放在末尾
单纯形法
单纯形法有几个基本步骤
对于n维函数f(x),单纯形有n+1个节点
记函数值最大的节点为xmax
函数值最小的节点为xmin
反射:
对于已有的一个单纯形
找出单纯形的节点中函数值最大的那一个(xmax, f(xmax))
剩下的节点求均值得到重心u
xmax + xnew = 2*u
xnew即为反射之后的点,将xnew代替xmax即可得到反射之后的单纯形
当然u也不是非要作为中点,xnew = u + α*(u - xmax)
扩大:
得到反射点之后,若f(xnew) < f(xmin)
则说明这个方向很有可能是下降方向,那就扩大看看
xnew2= u + γ*(xnew - u) 一般来说γ = 2
其实就是将反射的方向扩大了一倍
若f(xnew2) < f(xnew)
那么用xnew2代替xnew就好
收缩:
考虑次大值f(x2nd)
若f(xnew) < f(x2nd)可以进行下一步
若f(xnew) >= f(x2nd) 那么下一步反射时会出现循环(因为f(xnew)仍是最大值,再反射的话会变成xmax)
这个时候就要用到收缩
找到xnew和xmax的最小值X’
xnew3 = u + ß * (X‘ - u)
若f(xnew3) < f(X')
然后用xnew3替换xnew
一般来说ß = 1//2
这就是一个取中点的操作嘛
否则进行缩边
缩边:
若f(xnew3) >= f(X')
那么就进行缩边将每个点往xmax的方向移动
xi = xmax + ß*(xi - xmax)
当函数的离差平方和< e时终止算法
可以看到单纯型法就是如下几步
取初始点x0 步长alaph
获取n个点 xi = x0 + ei *alaph
先反射
若反射点的值 < 最小值则进行扩大,取扩大点和反射点的最小值来替换最大值----->结束
若反射点是反射之后单纯形的最大值则进行收缩,就是取最大值和反射点的最小值,然后将其他点的均值和最小值作为端点,求他们的中点
若这个中点不是替换之后单纯形的最大值 ----->结束
否则不对最大值进行替换,反而将单纯形向最大值进行缩边 ----->结束
自己的一点理解:
整个算法就是尽量让单纯形向值变小的方向移动
先取试探最大值->均值方向是不是缩小方向
然后看均值往两端的方向是不是缩小方向
若都不是,那么也就是说最大值点是一定程度上的最优点
就将所有点往最大值点移动
可以想象成一个多维空间中的超史莱姆,不断地往最优点移动哈哈哈哈哈