surrogateopt решатель принимает как целочисленные, так и нелинейные ограничения. Сравните решение нелинейной задачи с целочисленными ограничениями и без них. Целочисленные ограничения заставляют решение лежать на достаточно тонкой сетке.
Целевая функция:
(x1-4/3) 2).
Эта целевая функция неотрицательна и принимает минимальное значение 0 в точке 3-4/3] = [1.3333, 1.0370].
Задача имеет две нелинейные функции ограничения.
Постройте график возможной области для нелинейных ограничений.
[X,Y] = meshgrid(-2:.01:3); Z = (5*sinh(Y./5) >= X.^4); % Z=1 where the first constraint is satisfied, Z=0 otherwise Z = Z+ 2*(5*tanh(X./5) >= Y.^2 - 1); % Z=2 where the second constraint is satisfied % Z=3 where both constraints are satisfied surf(X,Y,Z,'LineStyle','none'); fig = gcf; fig.Color = 'w'; % white background view(0,90) xlabel('x_1') ylabel('x_2')

Желтая область показывает, где выполняются оба ограничения.
surrogateopt требует, чтобы функции цели и ограничения были частью одной и той же функции, возвращающей структуру. Целевая функция находится в Fval поле структуры, и ограничения находятся в Ineq поле. Эти поля являются выходными данными objconstr в конце этого примера.
Задайте целочисленные ограничения для обеих переменных. x(1) и x(2).
intcon = [1 2];
Масштабировать проблему так, чтобы переменные масштабировались по s = 1/10, где s умножает переменные.
s = 0.1; f = @(x)objconstr(x,s);
Чтобы это масштабирование было эффективным, необходимо масштабировать границы на . Установите для несмасштабированных границ 2≤xi≤3 и масштабируйте каждый на 1/с.
lb = [-2,-2]/s; ub = [3,3]/s;
С помощью масштабирования s, проблема эффективно имеет интервалы s в каждом компоненте x(1) и x(2). Постройте график целочисленных точек в виде сетки с интервалом s.
hold on grid on ax = gca; sp = -2:s:3; ax.XTick = sp; ax.YTick = sp; ax.Layer = 'top'; ax.GridAlpha = 1/2; ax.XTickLabel = ''; ax.YTickLabel = ''; xlabel('x_1') ylabel('x_2') hold off

Задайте параметры, чтобы использовать более жесткие ограничения, чем по умолчанию, и используйте surrogateoptplot функция графика.
opts = optimoptions('surrogateopt','PlotFcn',"surrogateoptplot","ConstraintTolerance",1e-6);
Звонить surrogateopt для решения проблемы.
rng default % For reproducibility [sol,fval,eflag,outpt] = surrogateopt(f,lb,ub,intcon,opts)

surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
sol = 1×2
5 1
fval = 0.8634
eflag = 0
outpt = struct with fields:
elapsedtime: 59.6897
funccount: 200
constrviolation: -0.0375
ineq: [-0.0375 -1.4883]
rngstate: [1x1 struct]
message: 'surrogateopt stopped because it exceeded the function evaluation limit set by ...'
Постройте график решения в виде красного круга на рисунке. Обратите внимание, что значение целевой функции составляет приблизительно 0,86.
figure(fig); hold on plot3(sol(1)*s,sol(2)*s,5,'ro') hold off

Сравните решение с целочисленными ограничениями с решением без целочисленных ограничений.
[sol2,fval2,eflag2,outpt2] = surrogateopt(f,lb,ub,[],opts)

surrogateopt stopped because it exceeded the function evaluation limit set by 'options.MaxFunctionEvaluations'.
sol2 = 1×2
4.3757 0.3667
fval2 = 0.8153
eflag2 = 0
outpt2 = struct with fields:
elapsedtime: 35.0093
funccount: 200
constrviolation: -8.6916e-06
ineq: [-8.6916e-06 -1.4351]
rngstate: [1x1 struct]
message: 'surrogateopt stopped because it exceeded the function evaluation limit set by ...'
Здесь значение целевой функции составляет приблизительно 0,815. Целочисленные ограничения увеличивают значение целевой функции менее чем на 10%. Постройте график нового решения вместе с предыдущим целочисленным решением. Увеличьте изображение, чтобы более четко увидеть точки решения.
figure(fig) hold on plot3(sol2(1)*s,sol2(2)*s,5,'k*','MarkerSize',12) xlim([0 1]) ylim([-1/2 1/2]) hold off

Этот код создает objconstr функция помощника. Эта функция масштабирует переменную x по фактору s, возвращает значение целевой функции в Fval области F и возвращает нелинейные ограничения в Ineq области F структура.
function F = objconstr(x,s) x = x*s; fun = log(1 + 3*(x(2) - (x(1)^3 - x(1)))^2 + (x(1) - 4/3)^2); c1 = x(1)^4 - 5*sinh(x(2)/5); c2 = x(2)^2 - 5*tanh(x(1)/5) - 1; c = [c1 c2]; F.Fval = fun; F.Ineq = c; end