Решите задачу выполнимости

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

(y+x2)2+0.1y21yexp(-x)-3yx-4.

Делайте все точки (x,y) удовлетворить ограничениям? Чтобы выяснить, запишите функцию, которая возвращает ограничения в поле структуры Ineq. Запишите ограничения в терминах двухэлементного вектора x=(x1,x2) вместо (x,y). Запишите каждое неравенство как функцию c(x), что означает неравенство c(x)0, путем вычитания правой стороны каждого неравенства с обеих сторон. Чтобы включить построение графика, запишите функцию векторизированным способом, где каждая строка представляет одну точку. Код для этой вспомогательной функции с именем objconstr, появляется в конце этого примера.

Постройте график точек, где три функции удовлетворяют равенствам для -2x2 и -4y2, и указать неравенства путем построения графиков линий для значений функции, равных -1/2.

[XX,YY] = meshgrid(-2:0.1:2,-4:0.1:2);
ZZ = objconstr([XX(:),YY(:)]).Ineq;
ZZ = reshape(ZZ,[size(XX),3]);
h = figure;
ax = gca;
contour(ax,XX,YY,ZZ(:,:,1),[-1/2 0],'r','ShowText','on');
hold on
contour(ax,XX,YY,ZZ(:,:,2),[-1/2 0],'k','ShowText','on');
contour(ax,XX,YY,ZZ(:,:,3),[-1/2 0],'b','ShowText','on');
hold off

Figure contains an axes. The axes contains 3 objects of type contour.

График показывает, что допустимые точки существуют около [1,75, -3].

Установите нижние границы -5 и верхние границы 3 и решите задачу используя surrogateopt.

rng(1) % For reproducibility
lb = [-5,-5];
ub = [3,3];
[x,fval,exitflag,output,trials] = surrogateopt(@objconstr,lb,ub)

Figure Optimization Plot Function contains an axes. The axes with title Maximum Constraint Violation: -0.0799947 contains 2 objects of type line. These objects represent Best function value (infeasible), Best function value.

surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.
x = 1×2

    1.7312   -3.0312

fval =

  1x0 empty double row vector
exitflag = 0
output = struct with fields:
        elapsedtime: 31.7004
          funccount: 200
    constrviolation: -0.0800
               ineq: [-0.0800 -0.2083 -0.7625]
           rngstate: [1x1 struct]
            message: 'surrogateopt stopped because it exceeded the function evaluation limit set by ...'

trials = struct with fields:
       X: [200x2 double]
    Ineq: [200x3 double]

Проверьте допустимость в возвращенном решении x.

disp(output.ineq)
   -0.0800   -0.2083   -0.7625

Эквивалентно вычислите функцию objconstr в возвращённом решении x.

disp(objconstr(x).Ineq)
   -0.0800   -0.2083   -0.7625

Эквивалентно исследуйте Ineq поле в trials структура для решения x. Сначала найдите индекс x в trials.X поле.

indx = ismember(trials.X,x,'rows');
disp(trials.Ineq(indx,:))
   -0.0800   -0.2083   -0.7625

Все значения ограничительных функций отрицательны, что указывает на то, что точка x является допустимым.

Просмотрите допустимые точки, оцениваемые surrogateopt.

opts = optimoptions("surrogateopt");
indx = max(trials.Ineq,[],2) <= opts.ConstraintTolerance; % Indices of feasible points
figure(h);
hold on
plot(trials.X(indx,1),trials.X(indx,2),'*')
xlim([1 2])
ylim([-3.5 -2.5])
hold off

Figure contains an axes. The axes contains 4 objects of type contour, line.

Этот код создает objconstr вспомогательная функция.

function f = objconstr(x)
c(:,1) = (x(:,2) + x(:,1).^2).^2 + 0.1*x(:,2).^2 - 1;
c(:,2) = x(:,2) - exp(-x(:,1)) + 3;
c(:,3) = x(:,2) - x(:,1) + 4;
f.Ineq = c;
end

См. также

Похожие темы