问题描述
我在 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(分割矩形)或贝叶斯优化