强大的沃尔夫算法

时间:2017-11-18 12:06:04

标签: matlab

我正在使用Strong Wolfe条件在Matlab中进行线搜索算法。我的Strong Wolfe代码如下:

while i<= iterationLimit
    if (func(x + alpha1*p)) > func(x) + c1*alpha1*(grad(x)'*p) || 
       ((func(x + alpha1*p)) >= (func(x + prevAlpha*p)) && i>1) 
            alphastar  = alpha_strongWolfe_zoom(func, grad, x, p, prevAlpha,alpha1, c1, c2);   
                break; 
    end

    if abs(((grad(x + alpha1*p))'*p)) <= -c2*(grad(x)'*p)
           alphastar  = alpha1;
                break;
    end

    if ((grad(x + alpha1*p))'*p) >= 0
        alphastar  = alpha_strongWolfe_zoom(func, grad, x, p, alpha1, prevAlpha, c1, c2); 
                break;
    end

  prevAlpha  = alpha1;
  alpha1     = gamma*alpha1; 
  i          = i+1;

  end

但是,我认为我的代码可能效率不高。我认为这可能是一个问题,我正在使用

给出的完整方程
func(x + alpha1*p)

但我不确定,因为我想不出另一种方法可以做到这一点。 您能否指出使用此代码的任何其他低效率?在谈到Matlab时,我仍然是初学者。

谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

我稍微修改了你的代码以提高性能:

while (i <= iterationLimit)
    func_1 = func(x + alpha1*p);
    gp = grad(x)' * p;

    if ((func_1 > (func(x) + c1*alpha1*gp)) || ((func_1 >= func(x + prevAlpha*p)) && (i > 1)))
        alphastar = alpha_strongWolfe_zoom(func, grad, x, p, prevAlpha, alpha1, c1, c2);   
        break; 
    end

    grad_1 = grad(x + alpha1*p)' * p;

    if (abs(grad_1) <= -c2*gp)
        alphastar = alpha1;
        break;
    end

    if (grad_1 >= 0)
        alphastar = alpha_strongWolfe_zoom(func, grad, x, p, alpha1, prevAlpha, c1, c2); 
        break;
    end

    prevAlpha = alpha1;
    alpha1    = gamma*alpha1; 
    i         = i+1;
end

性能肯定不会飙升,但缓存中间计算是优化代码的良好起点。

最好的优化只能通过尽可能地向量化计算来实现,但这只能通过对代码及其背后的算法/数学的深入了解来实现。