最优化-直接方法

坐标轮换法

  对于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

先反射

  若反射点的值 < 最小值则进行扩大,取扩大点和反射点的最小值来替换最大值----->结束

  若反射点是反射之后单纯形的最大值则进行收缩,就是取最大值和反射点的最小值,然后将其他点的均值和最小值作为端点,求他们的中点

  若这个中点不是替换之后单纯形的最大值  ----->结束

  否则不对最大值进行替换,反而将单纯形向最大值进行缩边   ----->结束

自己的一点理解:

  整个算法就是尽量让单纯形向值变小的方向移动

  先取试探最大值->均值方向是不是缩小方向

  然后看均值往两端的方向是不是缩小方向

  若都不是,那么也就是说最大值点是一定程度上的最优点

  就将所有点往最大值点移动

  可以想象成一个多维空间中的超史莱姆,不断地往最优点移动哈哈哈哈哈

  

原文地址:https://www.cnblogs.com/shensobaolibin/p/10201681.html