Para ver os resultados da patternsearch optimization para cada iteração em MATLAB

eu tenho um problema de otimização que é muito demorado e eu preciso fazer isso muitas vezes (isto é de alguma forma um problema de tentativa e erro para mim). No entanto, não quero esperar pelo resultado final. Preciso de ver o resultado da optimização em cada iteração. Mais especificamente, eu quero ver o valor x (a solução) e não estou tão interessado em fval (valor da função objetiva em x). Infelizmente, a pesquisa do Pattern só mostra o sval e não a solução de otimização em cada iteração. I saiba que eu devo corrigir este problema através da "função de saída" e passou muito tempo e não poderia entender como fazê-lo. Para tornar tudo conveniente para você e vamos considerar o seguinte problema de otimização simples:

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);

as primeiras linhas que vemos na janela de comandos parecem ser as seguintes:

Iter     f-count          f(x)      MeshSize     Method
    0        1              4             1      
    1        2              4           0.5     Refine Mesh
    2        3              0             1     Successful Poll
Infelizmente, não vejo nada sobre X.

pode alterar o meu código para que eu também possa ver a solução (x) em cada iteração, é muito agradecido!

Babak

 0
Author: Babak , 2018-04-07

1 answers

Um manipulador de função de saída válido para patternsearch deve ser especificado do seguinte modo:

function [stop,options,optchanged] = fun(optimvalues,options,flag)

O seguinte código deve ser suficiente para mostrar a informação que procura:

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

Aqui está o resultado:

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
   ...

É apenas um exemplo e você pode, claro, ajustar a função para que o texto seja exibido da maneira que você preferir.

 0
Author: Tommaso Belluzzo, 2018-04-07 23:30:06