>我有一个非常耗时的优化问题,我需要做很多次(这对我来说是一个试错问题)。但是,我不想等待最终结果。我需要在每次迭代时查看优化结果。更具体地说,我想看到 x 值(解决方案),并且对 fval(x 处的目标函数值)不太感兴趣。不幸的是,模式搜索只显示 fval,而不是每次迭代的优化解决方案。我知道我应该通过"输出功能"来解决这个问题,并且花了很多时间,但不明白该怎么做。为了方便您,让我们考虑以下简单的优化问题:
options = optimoptions('patternsearch');
options = optimoptions(options,'Display', 'iter','TolX',1e-6);
x0=2;lb=-3;ub=3;
x = patternsearch(@(x)x^2,x0,[],[],[],[],lb,ub,[],options);
我们在命令窗口上看到的前几行如下所示:
Iter f-count f(x) MeshSize Method
0 1 4 1
1 2 4 0.5 Refine Mesh
2 3 0 1 Successful Poll
不幸的是,我对x一无所知。
请您更改我的代码,以便我也可以在每次迭代中看到解决方案(x),非常感谢!
巴巴克
应按如下方式指定patternsearch
的有效输出函数处理程序:
function [stop,options,optchanged] = fun(optimvalues,options,flag)
以下代码应该足以显示您要查找的信息:
options = optimoptions('patternsearch');
options = optimoptions(options,'Display','iter','OutputFcns',@custom,'TolX',1e-6);
x0 = 2; lb = -3; ub = 3;
x = patternsearch(@(x)x^2,x0,[],[],[],[],lb,ub,[],options);
function [stop,options,optchanged] = custom(optimvalues,options,flag)
stop = false;
optchanged = false;
if (strcmp(flag,'iter'))
disp([' Iteration performed for X=' num2str(optimvalues.x)]);
end
end
这是输出:
Iter Func-count f(x) MeshSize Method
0 1 4 1
Iteration performed for X=2
1 2 4 0.5 Refine Mesh
Iteration performed for X=0
2 3 0 1 Successful Poll
Iteration performed for X=0
3 3 0 0.5 Refine Mesh
Iteration performed for X=0
4 5 0 0.25 Refine Mesh
Iteration performed for X=0
...
这只是一个例子,当然,您可以调整功能,以便以您喜欢的方式显示文本。