Смешано-целочисленная суррогатная оптимизация, основанная на проблеме

В этом примере показано, как решить задачу оптимизации, которая включает целочисленные переменные. В этом примере найдите точку 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.

Figure Optimization Plot Function contains an axes object. The axes object with title Best Function Value: 0 contains an object of type line. This object represents Best function value.

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.

Figure Optimization Plot Function contains an axes object. The axes object with title Best Function Value: 0.130972 contains an object of type line. This object represents Best function value.

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

Смотрите также

|

Похожие темы