Решите нелинейную задачу с целыми и нелинейными ограничениями

The surrogateopt решатель принимает как целочисленные ограничения, так и нелинейные ограничения. Сравните решение нелинейной задачи как с целочисленными ограничениями, так и без них. Целочисленные ограничения заставляют решение лежать на достаточно тонкой сетке.

Функции, определяющие цели и ограничения

Целевая функция является

f(x)=log(1+3(x2-(x13-x1))2+(x1-4/3)2).

Эта целевая функция неотрицательна и принимает ее минимальное значение 0 в точке x=[4/3,(4/3)3-4/3] = [1.3333, 1.0370].

Задача имеет две нелинейные функции ограничений.

x145sinh(x2/5),x225tanh(x1/5)+1.

Постройте график допустимой области для нелинейных ограничений.

[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')

Figure contains an axes. The axes contains an object of type surface.

Желтая область показывает, где оба ограничения удовлетворены.

surrogateopt требует, чтобы целевая и ограничительная функции были частью одной и той же функции, той, которая возвращает структуру. Целевая функция находится в Fval поле структуры, и ограничения находятся в Ineq поле. Эти поля являются выходами objconstr функция в конце этого примера.

Масштабирование целочисленных ограничений, чтобы лечь на мелкую сетку

Установите задачу, чтобы иметь целочисленные ограничения в обеих переменных, x(1) и x(2).

intcon = [1 2];

Масштабируйте задачу так, чтобы переменные масштабировались s = 1/10, где s умножает переменные.

s = 0.1;
f = @(x)objconstr(x,s);

Чтобы это масштабирование было эффективным, вам нужно масштабировать границы на 1/s. Установите немасштабированные границы равными -2xi3 и масштабируйте каждый по 1/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

Figure contains an axes. The axes contains an object of type surface.

Решите масштабированную задачу

Установите опции, чтобы использовать более жесткие ограничения, чем по умолчанию, и использовать surrogateoptplot постройте график функции.

opts = optimoptions('surrogateopt','PlotFcn',"surrogateoptplot","ConstraintTolerance",1e-6);

Функции surrogateopt чтобы решить проблему.

rng default % For reproducibility
[sol,fval,eflag,outpt] = surrogateopt(f,lb,ub,intcon,opts)

Figure Optimization Plot Function contains an axes. The axes with title Best: 0.863447 Incumbent: 1.83438 Current: 1.83438 contains 12 objects of type line. These objects represent Best (Infeas), Incumbent (Infeas), Random Samples (Infeas), Best, Incumbent, Random Samples, Adaptive Samples (Infeas), Adaptive Samples, Surrogate Reset.

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

Figure contains an axes. The axes contains 2 objects of type surface, line.

Сравнение с решением без целочисленных ограничений

Сравните решение с целочисленными ограничениями с решением без целочисленных ограничений.

[sol2,fval2,eflag2,outpt2] = surrogateopt(f,lb,ub,[],opts)

Figure Optimization Plot Function contains an axes. The axes with title Best: 0.81526 Incumbent: 2.59107 Current: 3.17848 contains 10 objects of type line. These objects represent Best (Infeas), Incumbent (Infeas), Random Samples (Infeas), Best, Incumbent, Random Samples, Adaptive Samples, Adaptive Samples (Infeas), Surrogate Reset.

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

Figure contains an axes. The axes contains 3 objects of type surface, line.

Функция помощника

Этот код создает 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

См. также

Похожие темы