surrogateopt
, Основанный на проблемеВ этом примере показано, как минимизировать многомерную функцию с помощью суррогатной оптимизации в подходе, основанном на проблеме. Функция, чтобы минимизировать, multirosenbrock(x)
, появляется в конце этого примера. multirosenbrock
функция имеет один локальный минимум 0
в точке [1,1,...,1]
. Функция спроектирована, чтобы быть сложной для решателей, чтобы минимизировать.
Примечание: код для multirosenbrock
функция помощника обеспечивается в конце этого примера. Убедитесь, что код включен в конце вашего скрипта или в файле на пути.
Создайте 4-D переменную x
оптимизации.
multirosenbrock
функция ожидает, что переменная будет вектором-строкой, поэтому задайте x
как вектор-строка с 4 элементами.
x = optimvar("x",1,4);
surrogateopt
решатель требует конечных границ на всех переменных задачи. Задайте нижние границы –3 и верхние границы 3. Когда вы задаете скалярные границы, они применяются ко всем переменным задачи.
x.LowerBound = -3; x.UpperBound = 3;
Использовать multirosenbrock
как целевая функция, преобразуйте функцию в выражение оптимизации с помощью fcn2optimexpr
.
fun = fcn2optimexpr(@multirosenbrock,x);
Создайте задачу оптимизации с целевой функцией multirosenbrock
.
prob = optimproblem("Objective",fun);
Решите задачу, задав surrogateopt
решатель.
rng default % For reproducibility [sol,fval] = solve(prob,"Solver","surrogateopt")
Solving problem using surrogateopt.
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
sol = struct with fields:
x: [0.0900 0.0120 0.1300 0.0136]
fval = 1.5877
Возвращенное решение не хорошо, потому что значение целевой функции не очень близко к 0
. Попытайтесь улучшить решение путем выполнения surrogateopt
для большего количества оценок. Используйте предыдущее решение в качестве стартовой точки.
options = optimoptions("surrogateopt","MaxFunctionEvaluations",1000); [sol2,fval2] = solve(prob,sol,"Solver","surrogateopt","Options",options)
Solving problem using surrogateopt.
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
sol2 = struct with fields:
x: [0.8613 0.7429 0.7247 0.5220]
fval2 = 0.0961
На этот раз решатель достигает хорошего решения.
Этот код создает 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); end
surrogateopt
| fcn2optimexpr
| solve