本文由olivewy编写,原地址:http://www.cnblogs.com/olivewy/p/5148428.html
优化成功或失败
一、求解失败
1、在到达迭代次数阈值或目标函数估值次数阈值时,求解器没有最小化目标到要求的精度,此时求解器停止。接下来,可以尝试以下方法:
(1)设置‘Display’为‘iter’,查看每步的迭代信息,这些信息包括:目标函数(Fval or f(x) or Resnorm)是否是下降的;检查约束越界(Max constraint)是否是递减趋向于0;查看一阶优化是否是递减趋向于0;查看置信域半径(Trust-region radius)是否下降趋向于一个小的值。若其中至少一种情况为是,就表示结果是不断改善的。如果结果是不断改善的,可以采取下边的措施:设置MaxIter、MaxFunEvals比默认值大的值,默认值可以在优化工具箱或求解器的函数参考页的优化表中查看;从最后计算出的点开始重新求解。如果结果没有改善,尝试以下其他的方法。
(2)放松精度
如果TolX或TolFun太小,当求解器达到一个最小值时可能也不会识别到,这就会导致无限次徒劳的迭代。DiffMaxChange和DiffMinChange选项能影响求解器的改善,它们控制求导估计中有限差分的步长。
(3)从不同的初始点重新开始求解
(4)检查目标函数和约束函数的定义
举个例子,可以检查目标函数和非线性约束函数在某些特定点处返回正确的值。不可行的点不一定导致函数的错误。
(5)对问题进行中心化和标准化
当每个坐标轴对目标函数和约束函数有相同的影响时,求解器更能可靠的运行,对每个坐标轴方向乘以合适的量使得每个坐标轴的影响相同,在特定的坐标轴上加上合适的值使得它们长度一致。
(6)提供解析的梯度和雅可比矩阵
如果用户不提供解析的梯度或雅可比矩阵,求解器会用有限差分来估计这些值,因此提供这些导数可以减少运算时间,提高计算准确度。
对于约束问题,提供梯度还有另一个好处----求解器到达一个点x时能满足该点是可行的,但有限差分在x点周围可能会导致不可行的点,在这种情况下,求解器可能会失败或突然中断。
(7)提供海塞矩阵
当提供海塞矩阵时,求解器能运行的更可靠,而且运行的次数比较少。
2、无可行点
在TolCon约束精度内,求解器不能找到一个满足所有约束条件的点,此时,可以尝试以下方法:
(1)检查线性约束
通过求解一个线性规划问题来找到一个满足界约束和线性约束的点。
i)定义一个目标函数是常值0的线性规划问题
f = zeros(size(x0)); % assumes x0 is the initial point
ii)求解这个线性规划问题看是否有一个可行点
xnew = linprog(f,A,b,Aeq,beq,lb,ub);
iii)如果有可行点xnew,用xnew作为初始点去求解原始问题
iv)如果没有可行点,那说明原始模型建的不好,检查界约束和线性约束。
(2)检查非线性约束
在保证界约束和线性约束是可行的之后,检查非线性约束:
i)设置目标函数为0,然后求解优化问题,如果能找到一个可行点xnew,令x0=xnew返回到原始问题中去
ii)如果用0目标函数不能找到一个可行点,尝试几个不同的初始点重新求解,如果找到了一个可行点xnew,令x0=xnew并返回到原始问题中去,如果仍没找到可行点,试着用下列方法放松约束条件。
a.改变非线性约束函数c为c-Δ,Δ是一个正数,这会使得非线性约束更容易满足。
b.尝试用原始的目标函数或0目标函数对新的约束函数寻找一个可行点。如果找到一个可行点,那么减少Δ,并在之前找到的点处开始对新的约束函数重新找一个可行点;如果没有找到一个可行点,试着增大Δ并重新找。
如果一直没有找到可行点,那么原始问题可能确实是不可行的,重新检查约束函数的定义。
3、问题是无界的
求解器到达一个目标函数小于目标阈值界的点,那么
(1)原问题可能确实无界,即存在一系列满足问题约束的点xi,使得lim f(xi) = –∞。
(2)检查原问题建模正确,求解器是最小化目标函数,如果想得到最大化,将目标函数乘以-1.
(3)试着标准化或中心化原问题。
(4)放松目标函数界精度,用optimset减少ObjectiveLimit设定的精度值。
二、求解可能成功
1、最后的点等于初始点
初始点可能是局部极小点,因为它的一阶导数接近0,如果并不确定初始点确实是一个局部极小点,尝试下边的步骤:
(1)从不同的点开始重新求解
(2)检查目标函数和约束函数定义正确。
(3)改变精度,如TolFun,TolCon,TolX
(4)标准化原问题,使得每个坐标轴有相同的影响。
(5)提供解析的梯度和海塞矩阵。
2、可能的局部最小值(Local Minimum Possible,not ‘ Local Minimum Found‘)
求解器可能达到一个局部最小值,但并不确定,因为一阶导数不小于TolFun,为了检查得到的答案是否是可靠的,考虑下边的建议。
(1)非平滑函数
如果试着最小化一个非平滑的函数,或者有非平滑的约束,那么‘"Local Minimum Possible’是最好的返回标志,因为一阶导数条件并不适用于非平滑的点。试着检查周围的点来确定结果是否真的可靠。
(2)在最后得到的点处开始重新优化
在最后得到的点处开始重新优化会得到一个在一阶导数估量上更好的点,更好的一阶导数估量能让人相信结果是可靠的。
3、尝试一个不同的算法
4、改变精度
5、重新标准化原问题
6、检查邻近点
7、改变有限差分的计算方法
中心有限差分用的时间更多,但更准确,可以设置‘FinDiffType‘ 为‘central‘。
8、提供解析的梯度或雅可比矩阵
9、提供海塞矩阵
三、求解成功
当求解器返回成功信息时,也可能结果是错误的,下边有几种方法可以验证结果。
1、改变初始点
初始点对求解结果有很大影响,如果从不同的初始点得到了相同或较差的结果,说明原来求得的界是正确的。
2、检查邻近点
计算f(xfinal±Δ)的值,与f(xfinal)值做比较。
3、检查目标函数与约束函数
4、局部最优与全局最优
(1)为什么求解器找不到最小的最小值
通常,求解器返回的是一个局部最小值,该值也可能是一个全局最小值,但并不保证是。这部分讨论求解器得出这种结果的原因,并给出寻找全局最小值的建议。
一般求解器是在初始点的basin of attraction找到的最优值,但也有些例外:
i)线性规划和正定二次规划是凸的,可行域也是凸的,所以只有一个basin of attraction。在设定某些条件下,linprog会忽略用户提供的初始点,quadprog也不需要。
ii)全局优化工具箱,如simulannealbnd,试着搜索不止一个basin of attraction。
(2)寻找一个更小的最小值
如果需要一个全局最小值,必须要在全局最小值的basin of attraction内找一个初始点。
设置初始点的建议:
i)用初始点的一个规则网格
ii)如果原始问题在所有的坐标轴上是有界的,那么从均匀分布得到一个随机初始点,如果有些部分是无界的,那么用正态、指数或其他随机分布得到初始点。对全局最优值的位置知道的越少,就要选择越分散的随机分布。例如,正态分布大部分样本在均值的三个标准偏差范围内,但柯西分布(密度函数1/(π(1 + x2)))样本很分散。
iii)如果有全局优化工具箱的许可,可以应用GlobalSearch或MultiStart,这些求解器能在上下界范围内自动产生随机初始化点。
对可能的初始化点知道的越多,搜寻最优值会越集中,成功的几率会越大。
(3)Basins of Attraction
如果目标函数f(x)是平滑的,那么负梯度方向–∇f(x)是函数值下降最快的方向。