Этот пример показывает поведение трех рекомендуемых решателей на проблеме минимизации. Целевая функция является функцией multirosenbrock
:
type multirosenbrock
function F = multirosenbrock(x) % This function is a multidimensional generalization of Rosenbrock's % function. It operates in a vectorized manner, assuming that x is a matrix % whose rows are the individuals. % Copyright 2014 by The MathWorks, Inc. N = size(x,2); % assumes x is a row vector or 2-D matrix if mod(N,2) % if N is odd error('Input rows must have an even number of elements') end odds = 1:2:N-1; evens = 2:2:N; F = zeros(size(x)); F(:,odds) = 1-x(:,odds); F(:,evens) = 10*(x(:,evens)-x(:,odds).^2); F = sum(F.^2,2);
Функция multirosenbrock
имеет один локальный минимум 0 в точке [1,1,...,1]
. Смотрите, как хорошо три лучших решателя для общих нелинейных проблем работают над этой функцией в 20 размерностях со сложным максимальным функциональным количеством только 200.
Настройте проблему.
N = 20; % any even number mf = 200; % max fun evals fun = @multirosenbrock; lb = -3*ones(1,N); ub = -lb; rng default x0 = -3*rand(1,N);
Установите опции для surrogateopt
использовать только 200 функциональных оценок, и затем запускать решатель.
options = optimoptions('surrogateopt','MaxFunctionEvaluations',mf); [xm,fvalm,~,~,pop] = surrogateopt(fun,lb,ub,options);
Surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
Установите подобные опции для patternsearch
, включая функцию построения графика контролировать оптимизацию.
psopts = optimoptions('patternsearch','PlotFcn','psplotbestf','MaxFunctionEvaluations',mf); [psol,pfval] = patternsearch(fun,x0,[],[],[],[],lb,ub,[],psopts);
Maximum number of function evaluations exceeded: increase options.MaxFunctionEvaluations.
Установите подобные опции для fmincon
.
opts = optimoptions('fmincon','PlotFcn','optimplotfval','MaxFunctionEvaluations',mf); [fmsol,fmfval,eflag,fmoutput] = fmincon(fun,x0,[],[],[],[],lb,ub,[],opts);
Solver stopped prematurely. fmincon stopped because it exceeded the function evaluation limit, options.MaxFunctionEvaluations = 2.000000e+02.
Для этого чрезвычайно ограниченного количества функциональных оценок решение surrogateopt
является самым близким к истинному минимальному значению 0
.
table(fvalm,pfval,fmfval,'VariableNames',{'surrogateopt','patternsearch','fmincon'})
ans=1×3 table
surrogateopt patternsearch fmincon
____________ _____________ _______
9.8768 860.28 493.7
Разрешение еще 200 функциональных оценок показывает, что другие решатели быстро приближаются к истинному решению, в то время как surrogateopt
значительно не улучшается. Перезапустите решатели из их предыдущих решений, который добавляет 200 функциональных оценок в каждую оптимизацию.
options = optimoptions(options,'InitialPoints',pop);
[xm,fvalm,~,~,pop] = surrogateopt(fun,lb,ub,options);
Surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
[psol,pfval] = patternsearch(fun,psol,[],[],[],[],lb,ub,[],psopts);
Maximum number of function evaluations exceeded: increase options.MaxFunctionEvaluations.
[fmsol,fmfval,eflag,fmoutput] = fmincon(fun,fmsol,[],[],[],[],lb,ub,[],opts);
Solver stopped prematurely. fmincon stopped because it exceeded the function evaluation limit, options.MaxFunctionEvaluations = 2.000000e+02.
table(fvalm,pfval,fmfval,'VariableNames',{'surrogateopt','patternsearch','fmincon'})
ans=1×3 table
surrogateopt patternsearch fmincon
____________ _____________ _______
9.7502 407.88 8.5989