③globalsearch(全局最优函数)
这篇博客我们讨论一下来做全局最优的globalsearch函数
该函数为找到全局最小值
说到该函数,我们会想到我们在matlab做全局最优的到底有多少函数
这个我不是很清楚,不过我经常用到的也就两个
(GlobalSearch) 全局搜索和(MultiStart)多起点方法(生成若干起点,然后局部求解器寻找吸引盆处的最优点)
其他——
ga 遗传算法(选择一组起始点作为种群,通过迭代选取更好的点,起始点包括哪几个盆算法就能检测哪几个盆)
simulannealbnd模拟退火(实现随机搜索,接受比当前点更好的点,偶尔接收不好的点为了寻找其他盆)
patternsearch模式搜索算法(接受一点前查看附近点,附近点有可能在不同的盆,这样完成同时搜索若干个盆)
globalsearch与multistart区别
GlobalSearch使用分散搜索机制生成起点。MultiStart在边界内使用均匀分布的起点或用户提供的起点。
GlobalSearch分析起点并拒绝那些不太可能改善到目前为止找到的最佳局部最小值的点。MultiStart运行所有起点(或者,可选地,关于边界或不等式约束可行的所有起点)。
MultiStart给予当地求解器的选择:fmincon,fminunc,lsqcurvefit,或lsqnonlin。该GlobalSearch算法使用fmincon。
MultiStart可以并行运行,将起点分配给多个处理器以进行本地解决方案。要MultiStart并行运行,请参阅如何在全局优化工具箱中使用并行处理。(这个看我下一篇博客最后也能找到)
决定使用哪个解算器
这些求解器对象之间的差异归结为以下决定使用哪个:
GlobalSearch在单个处理器上最有效地查找单个全局最小值。
MultiStart在:并行运行,使用除解算器fmincon以外其他解算器,彻底搜索全局最低要求。
GlobalSearch求解过程
①在x0运算fmincon
在给定的初始点进行求解,如果求解收敛,找到最优点,并记录最优点的误差值(得分)
②生成试验点
散点搜索算法生成一组NumTrialPoints试验点,在设置(lb和ub)的任何有限范围内生成试验点。
③获取Stage 1 Start Point,Run
评价一组NumTrialPoints试验点的误差值(得分),取误差最小的点进行fmincon,同时删除该组试验点。
④初始化盆地、计数器、阈值
这里多次出现盆地这两个字,含义类似于我们说的那个波谷。算法的吸引盆是球形的,溶液点是吸引盆球心,溶液点到初始点距离是半径。
…………
MultiStart求解过程
①验证输入
检查输入有效性
②生成起点
生成起点,[x,fval] = run(ms,problem,k)则生成k-1个随机起点(调用list函数),加上原有起点x0。
③过滤起始点
过滤掉不满足边界条件的点,默认不过滤,过滤需要设置StartPointsToRun为’bounds’或’bounds-ineqs’。
④运行本地解算器
在每个起点进行运算。
⑤创建GlobalOptimSolution对象
从最低到最高对Fval值进行排序,进行记录。
GlobalSearch设置
强调几个
实例(六驼峰最小值问题)
rng default %对于再现性
gs = GlobalSearch ;
fun6 = @(x)(4 * x(1)^ 2 - 2.1 * x(1)^ 4 + x(1)^ 6/3 ...
+ x(1)* x(2) - 4 * x(2)^ 2 + 4 * x(2)^ 4);
problem = createOptimProblem('fmincon','x0',[ - 1,2],...
'objective',fun6,'lb',[ - 3,-3],'ub',[3,3]) ;
[x,fval] = run(gs,problem)
另一种表示
构造函数
function f = fun6(x)
f = (4 * x(1)^ 2 - 2.1 * x(1)^ 4 + x(1)^ 6/3 ...
+ x(1)* x(2) - 4 * x(2)^ 2 + 4 * x(2)^ 4);
end
主优化程序
x0=[-1,2];
LB=[-3,-3];
UB=[3,3];
f = @(data)fun6(data);
problem = createOptimProblem('fmincon','objective',f,'x0',x0,'lb',LB,'ub',UB,'options',optimset('Algorithm','SQP','DISP','none');
gs = GlobalSearch;
[x,fval] = run(gs,problem);
这里唯一一点需要解释的optimset(创建或编辑优化 options 结构体)
Display 参数设置为 ‘iter’,TolFun 参数设置为 1e-8。
options = optimset(‘Display’,‘iter’,‘TolFun’,1e-8)
复制 options 结构体到optnew,更改 TolX 参数的值并在 optnew 中存储新的值。
optnew = optimset(options,‘TolX’,1e-4);
返回一个优化 options 结构体,该结构体包含与函数 fminbnd 相关的所有参数名称和默认值。
optimset(‘fminbnd’)
当前算法(’ sqp ‘)使用的选项:
(其他可用的算法:‘active-set’,‘interior-point’,’ sqp -legacy’,‘trust-region-reflective’)