我正在使用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时,我仍然是初学者。
谢谢你的帮助。
答案 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
性能肯定不会飙升,但缓存中间计算是优化代码的良好起点。
最好的优化只能通过尽可能地向量化计算来实现,但这只能通过对代码及其背后的算法/数学的深入了解来实现。