Линейный или квадратичный объект с квадратичными ограничениями

Этот пример показывает, как решить задачу оптимизации, которая имеет линейную или квадратичную цель и квадратичные ограничения неравенства. Пример генерирует и использует градиент и Гессиан целевой и ограничительной функций.

Квадратичная задача с ограничениями

Предположим, что ваша задача имеет форму

minx(12xTQx+fTx+c)

при условии, что

12xTHix+kiTx+di0,

где 1 ≤ i ≤ m. Предположим, что по крайней мере одна Hi ненулевая; в противном случае можно использовать quadprog или linprog чтобы решить эту проблему. При ненулевых Hi ограничения нелинейны, что означает fmincon является соответствующим решателем в соответствии с таблицей принятия решений по оптимизации.

Пример принимает, что квадратичные матрицы симметричны без потери общности. Можно заменить несимметричную H (или Q) матрицу эквивалентной симметричной версией (H + HT)/2.

Если x есть N компоненты, то Q и Hi N N матрицами, f и ki векторы <reservedrangesplaceholder2>-by-1 и c, и di скаляры.

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

Сформулируйте задачу используя fmincon синтаксис. Предположим, что x и f являются векторы-столбцы. (x является вектор-столбец, когда начальный вектор x0 является вектор-столбец.)

function [y,grady] = quadobj(x,Q,f,c)
y = 1/2*x'*Q*x + f'*x + c;
if nargout > 1
    grady = Q*x + f;
end

Функция ограничения

Для согласованности и легкого индексирования поместите каждую квадратичную матрицу ограничений в один массив ячеек. Точно так же поместите линейный и постоянный условия в массивы ячеек.

function [y,yeq,grady,gradyeq] = quadconstr(x,H,k,d)
jj = length(H); % jj is the number of inequality constraints
y = zeros(1,jj);
for i = 1:jj
    y(i) = 1/2*x'*H{i}*x + k{i}'*x + d{i};
end
yeq = [];
    
if nargout > 2
    grady = zeros(length(x),jj);
    for i = 1:jj
        grady(:,i) = H{i}*x + k{i};
    end
end
gradyeq = [];

Численный пример

Предположим, что у вас есть следующая проблема.

Q = [3,2,1;
     2,4,0;
     1,0,5];
f = [-24;-48;-130];
c = -2;

rng default % For reproducibility
% Two sets of random quadratic constraints:
H{1} = gallery('randcorr',3); % Random positive definite matrix
H{2} = gallery('randcorr',3);
k{1} = randn(3,1);
k{2} = randn(3,1);
d{1} = randn;
d{2} = randn;

Мешковина

Создайте функцию Гессиана. Гессиан Лагранжа задается уравнением

xx2L(x,λ)=2f(x)+λi2ci(x)+λi2ceqi(x).

fmincon вычисляет приблизительный набор множителей Лагранжа λi и упаковывает их в структуру. Чтобы включить Гессиана, используйте следующую функцию.

function hess = quadhess(x,lambda,Q,H)
hess = Q;
jj = length(H); % jj is the number of inequality constraints
for i = 1:jj
    hess = hess + lambda.ineqnonlin(i)*H{i};
end

Решение

Используйте fmincon interior-point алгоритм для решения задачи наиболее эффективно. Этот алгоритм принимает функцию Гессиана, которую вы задаете. Установите эти опции.

options = optimoptions(@fmincon,'Algorithm','interior-point',...
    'SpecifyObjectiveGradient',true,'SpecifyConstraintGradient',true,...
    'HessianFcn',@(x,lambda)quadhess(x,lambda,Q,H));

Звонить fmincon чтобы решить проблему.

fun = @(x)quadobj(x,Q,f,c);
nonlconstr = @(x)quadconstr(x,H,k,d);
x0 = [0;0;0]; % Column vector
[x,fval,eflag,output,lambda] = fmincon(fun,x0,...
    [],[],[],[],[],[],nonlconstr,options);

Исследуйте множители Лагранжа.

lambda.ineqnonlin
ans =

   12.8412
   39.2337

Оба нелинейных множителя неравенства являются ненулевыми, поэтому оба квадратичных ограничения активны в решении.

Эффективность при предоставлении Гессиана

Алгоритм внутренней точки с градиентами и Гессианом эффективен. Просмотрите количество вычислений функции.

output
output = 

         iterations: 9
          funcCount: 10
    constrviolation: 0
           stepsize: 5.3547e-04
          algorithm: 'interior-point'
      firstorderopt: 1.5851e-05
       cgiterations: 0
            message: 'Local minimum found that satisfies the constraints.

Optimization compl...'

fmincon Для решения задачи требуется только 10 вычислений функции.

Сравните этот результат с решением без Гессиана.

options.HessianFcn = [];
[x2,fval2,eflag2,output2,lambda2] = fmincon(fun,[0;0;0],...
    [],[],[],[],[],[],nonlconstr,options);
output2
output2 = 

         iterations: 17
          funcCount: 22
    constrviolation: 0
           stepsize: 2.8475e-04
          algorithm: 'interior-point'
      firstorderopt: 1.7680e-05
       cgiterations: 0
            message: 'Local minimum found that satisfies the constraints.

Optimization compl...'

В этом случае, fmincon принимает примерно в два раза больше итераций и вычислений функции. Решения те же самые, что и в пределах допусков.

Расширение к квадратичным ограничениям равенства

Если у вас также есть квадратичные ограничения равенства, можно использовать по существу тот же метод. Задача та же самая, с дополнительными ограничениями

12xTJix+piTx+qi=0.

Переформулируйте свои ограничения, чтобы использовать Ji, pi и qi переменные. The lambda.eqnonlin(i) структура имеет множители Лагранжа для ограничений равенства.

Похожие темы