В этом примере показано, как решить задачу оптимизации, которая включает целочисленные переменные. В этом примере найдите точку x
это минимизирует multirosenbrock
функционируйте по аргументам с целочисленным знаком в пределах от –3 к 6 в 10 размерностях. multirosenbrock
функция является плохо масштабированной функцией, которая затрудняет, чтобы оптимизировать. Его минимальное значение 0, который достигнут в точке [1,1,...,1]
. Код для multirosenbrock
функция появляется в конце этого примера.
Создайте 10-D переменную x
вектора-строки из целого числа типа с границами –3 к 6. Когда вы задаете скалярные границы, границы применяются ко всем переменным компонентам.
x = optimvar("x",1,10,"LowerBound",-3,"UpperBound",6,"Type","integer");
Использовать multirosenbrock
как целевая функция, преобразуйте функцию в выражение оптимизации с помощью fcn2optimexpr
.
fun = fcn2optimexpr(@multirosenbrock,x);
Создайте задачу оптимизации с целевой функцией multirosenbrock
.
prob = optimproblem("Objective",fun);
Определите максимальный номер вычислений функции к 200.
opts = optimoptions("surrogateopt","MaxFunctionEvaluations",200);
Решите задачу.
rng(1,'twister') % For reproducibility [sol,fval] = solve(prob,"Solver","surrogateopt","Options",opts)
Solving problem using surrogateopt.
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
sol = struct with fields:
x: [1 1 1 1 1 1 1 1 1 1]
fval = 0
В этом случае, surrogateopt
достигает правильного решения.
Предположим, что только первые шесть переменных с целочисленным знаком. Чтобы переформулировать проблему, создайте 6-D целочисленную переменную xint
и 4-D непрерывная переменная xcont
.
xint = optimvar("xint",1,6,"LowerBound",-3,"UpperBound",6,"Type","integer"); xcont = optimvar("xcont",1,4,"LowerBound",-3,"UpperBound",6);
Преобразуйте multirosenbrock
к выражению оптимизации с помощью входа [xint xcont]
.
fun2 = fcn2optimexpr(@multirosenbrock,[xint xcont]);
Создайте и решите задачу.
prob2 = optimproblem("Objective",fun2); rng(1,'twister') % For reproducibility [sol2,fval2] = solve(prob2,"Solver","surrogateopt","Options",opts)
Solving problem using surrogateopt.
surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
sol2 = struct with fields:
xcont: [1.0508 1.1394 1.0671 1.1383]
xint: [1 1 1 1 1 1]
fval2 = 0.1310
На этот раз целочисленные переменные достигают правильного решения, и непрерывные переменные около решения, но не абсолютно точны.
Этот код создает 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