微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Matlab 中使用 fminsearch 时如何解决局部最小值问题?

如何解决在 Matlab 中使用 fminsearch 时如何解决局部最小值问题?

我在 Matlab 中使用 'fminsearch' 来解决函数迭代问题。

parfor i_a = 1:Na                  %Loop over state variable a
    for i_d = 1:Nd                  %Loop over state variable d
        for i_y = 1:Ny                  %Loop over state variable y
            for i_t = 1:Nt                  %Loop over state variable y

                [adj_sol,adjval] = fminsearchbnd(@(x) ...
                -adjvalue_model1(x,i_a,i_d,i_y,i_t,Utility,A,D,Y,T,R,delta,fixed,Interpol_1,Na,Nd),...
                [x0(i_a,i_t); x1(i_a,i_t)],...
                [A(1); D(1)],[A(end); D(end)],options);

此处,[x0(i_a,i_t)] 是 fminsearch 的起点。

然而,结果似乎不正确,因为它给了我局部最小值。

所以我给出了四个不同的起点,并从三个中选择了最小值,结果似乎是合理的。

            [adj_sol1,adjval1] = fminsearchbnd(@(x) ...
            -adjvalue_model1(x,...
            [x0(i_a,...
            [A(1); D(1)],options);

            [adj_sol2,adjval2] = fminsearchbnd(@(x) ...
            -adjvalue_model1(x,...
            [xs1(i_a,i_t); xs2(i_a,options);
        
            [adj_sol3,adjval3] = fminsearchbnd(@(x) ...
            -adjvalue_model1(x,...
            [xs3(i_a,i_t); xs4(i_a,options);
        
            [adj_sol4,adjval4] = fminsearchbnd(@(x) ...
            -adjvalue_model1(x,...
            [xs5(i_a,i_t); xs6(i_a,options);
            
            adjval = min([adjval1,adjval2,adjval3,adjval4]);
            if adjval == adjval1
            adj_sol = adj_sol1;
            elseif adjval == adjval2
            adj_sol = adj_sol2;        
            elseif adjval == adjval3
            adj_sol = adj_sol3;
            elseif adjval == adjval4
            adj_sol = adj_sol4;    
            end

但是,使用四个不同的起点非常耗时,所以我想知道是否有另一种方法可以处理这个局部最小值问题,并且比仅使用多个起点更有效(在速度方面)。

>

提前致谢。

解决方法

多个起点是局部优化算法的众所周知的做法。也许您可以尝试不同的算法,例如模拟退火。

如果您不知道函数的梯度,另一种方法是使用全局优化算法,如 DIRECT(分割矩形)或贝叶斯优化

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。