exponenta event banner

Решение нелинейной проблемы с целочисленными и нелинейными ограничениями

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].

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

x14≤5sinh (x2/5), x22≤5tanh (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/с. Установите для несмасштабированных границ значение - 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

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

См. также

Связанные темы