上一个博文中介绍了globalsearch和multistart的异同,以及选择时的参考,本文着重介绍multistart。
④multistart(全局最优)(找多个局部最小值)
下面这个例子在globalsearch中使用过,在这里可以只是换一下符号,再次使用。可以看出两个函数设置基本相同。
实例(六驼峰最小值问题)
rng default %对于再现性
gs = multistart ;
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 = multistart;
[x,fval] = run(gs,problem);
算法比较
在fminbnd,fmincon,globalsearch,multistart,fit比较
fminbnd首先被淘汰,它只适合单参数求解,并且函数必须连续,对于简单数学问题还好,当然简单数学也不用matlab
第二个淘汰
fmincon和fit
我测试了一下,两个求得的结果相同,也就是说两个所用的优化方法基本是一致的,我不知道这个猜测是否准确,大家也可以自己测试一下。
网上说fit(用L-M 列文伯格-马夸尔特算法)算法,我自己亲自进去了函数内部看了下,它是通过构造海森矩阵等一系列工作进行求解的,把函数的拟合放在矩阵中,进行矩阵求解。
这两个算法都是局部最优,很容易受起始点选取影响。
最后说globalsearch和multistart
globalsearch直接是多个随机点,也就是有多个起始点,然后选取出最好的起始点,利用fmincon进行求解,这样避免了一个起始点陷入局部最优的情况。
multistart准确来说是用了更多的起始点,并且每个起始点都进行了求解,内部优化函数可以不局限于fmincon。
globalsearch比multistart快狠多,而且并不能说进行更多求解的multistart一定比globalsearch的结果好,因为两者都很有可能随机点落到最优点附近,也可能谁也没落到其中,要看谁好,就看谁更有可能落入最优点附近。
如果你机器好,可以并行,那么推荐multistart
如果你机器差,那么还是用globalsearch,多用几次,可能有一次刚好落到最优点。
开启multistart多核并行
%% Parallel Version
matlabpool open 4 %开启四个matlab并行计算
ms.UseParallel = 'always' %开启并行计算
tic
[bp,fvalp,exitflagp,outputp,solutionsp] = run(ms, problem, 1000);
toc
matlabpool close
这里的1000代表有1000个起始点