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

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 функция plot.

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 структура, и возвращает нелинейные ограничения в 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

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

Похожие темы