surrogateopt
Этот пример показывает, как искать глобальный минимум путем выполнения surrogateopt
на двумерной проблеме, которая имеет шесть локальных минимумов. Пример затем показывает, как изменить некоторые опции, чтобы искать эффективнее.
Задайте целевую функцию sixmin
можно следующим образом.
sixmin = @(x)(4*x(:,1).^2 - 2.1*x(:,1).^4 + x(:,1).^6/3 ...
+ x(:,1).*x(:,2) - 4*x(:,2).^2 + 4*x(:,2).^4);
Постройте функцию.
[X,Y] = meshgrid(linspace(-2.1,2.1),linspace(-1.2,1.2)); Z = sixmin([X(:),Y(:)]); Z = reshape(Z,size(X)); surf(X,Y,Z,'EdgeColor','none') view(-139,31)
Функция имеет шесть локальных минимумов и два глобальных минимума.
Запустите surrogateopt
на проблеме с помощью функции построения графика 'surrogateoptplot'
в области, ограниченной в каждом направлении [-2.1,2.1]
. Чтобы понять сюжет 'surrogateoptplot'
, смотрите, Интерпретируют surrogateoptplot.
rng default lb = [-2.1,-2.1]; ub = -lb; opts = optimoptions('surrogateopt','PlotFcn','surrogateoptplot'); [xs,fvals,eflags,outputs] = surrogateopt(sixmin,lb,ub,opts);
Surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
Установите меньшее значение для опции MinSurrogatePoints
, чтобы видеть, помогает ли изменение решателю достигнуть глобального минимума быстрее.
opts.MinSurrogatePoints = 4; [xs2,fvals2,eflags2,outputs2] = surrogateopt(sixmin,lb,ub,opts);
Surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
Меньшая опция MinSurrogatePoints
заметно не изменяет поведение решателя.
Попытайтесь установить большее значение опции MinSampleDistance
.
opts.MinSampleDistance = 0.05; [xs3,fvals3,eflags3,outputs3] = surrogateopt(sixmin,lb,ub,opts);
Surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
Изменение опции MinSampleDistance
имеет небольшой эффект на решатель. Эта установка заставляет суррогат сбрасывать чаще и заставляет лучшую целевую функцию быть немного выше (хуже), чем прежде.
Попытайтесь использовать параллельную обработку. Время выполнение и с и ни с чем не сравнимая обработка на функции camelback
, которая является вариантом функции sixmin
. Чтобы моделировать длительную функцию, функция camelback
имеет добавленную паузу одной секунды для каждой функциональной оценки.
type camelback
function y = camelback(x) y = (4*x(1)^2 - 2.1*x(1)^4 + x(1)^6/3 ... + x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4); pause(1)
tic opts = optimoptions('surrogateopt','UseParallel',true,'PlotFcn','surrogateoptplot'); [xs4,fvals4,eflags4,outputs4] = surrogateopt(@camelback,lb,ub,opts);
Surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
toc
Elapsed time is 43.466489 seconds.
Время решатель, когда работается та же проблема в сериале.
opts.UseParallel = false; tic [xs5,fvals5,eflags5,outputs5] = surrogateopt(@camelback,lb,ub,opts);
Surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
toc
Elapsed time is 238.951879 seconds.
Для длительных целевых функций параллельная обработка значительно улучшает скорость, чрезмерно не влияя на результаты.