The surrogateopt
решатель принимает как целочисленные ограничения, так и нелинейные ограничения. Сравните решение нелинейной задачи как с целочисленными ограничениями, так и без них. Целочисленные ограничения заставляют решение лежать на достаточно тонкой сетке.
Целевая функция является
Эта целевая функция неотрицательна и принимает ее минимальное значение 0 в точке = [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);
Чтобы это масштабирование было эффективным, вам нужно масштабировать границы на . Установите немасштабированные границы равными и масштабируйте каждый по .
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
structure, и возвращает нелинейные ограничения в 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