EssayAI
Блог
Блог
Математика и алгоритмы

Квадратичное программирование: решение задачи по шагам

11 июня 2026Время чтения: 8 минут
#квадратичное программирование#условия ккт#метод лагранжа#метод активных ограничений#выпуклая оптимизация

Квадратичное программирование (КП) - это задача оптимизации, в которой целевая функция квадратичная, а ограничения линейные. Такие задачи встречаются в планировании производства, портфельной теории и регрессии с ограничениями: везде, где издержки растут не пропорционально отклонению от плана, а квадратично. В отличие от линейного программирования, где оптимум всегда лежит в вершине допустимого многогранника, в КП оптимум может оказаться и внутри ребра, и в вершине - это и делает задачу интереснее и чуть сложнее. Ниже разберём общий вид задачи, условия Каруша-Куна-Таккера, метод активных ограничений и решим конкретный пример с проверкой знаков. Чтобы сразу увидеть, как меняется решение при разных данных, покрути калькулятор ниже - он показывает допустимую область, линию уровня целевой функции и найденный оптимум одновременно.

Общий вид задачи квадратичного программирования

В общем виде задача КП записывается так:

minx  12xQx+cxприAxb,  x0,\min_x \; \frac{1}{2} x^\top Q x + c^\top x \quad \text{при} \quad Ax \le b,\; x \ge 0,

где QQ - симметричная матрица (для выпуклой задачи - положительно полуопределённая), cc - вектор линейных коэффициентов, AA и bb задают линейные ограничения. Если QQ положительно определена, целевая функция строго выпукла и задача имеет единственный минимум. В этой статье разберём частный, но показательный случай - раздельно-квадратичную целевую функцию с одним ресурсным ограничением:

f(x,y)=12p(xx0)2+12q(yy0)2min,x+yS,  x,y0.f(x, y) = \frac{1}{2}p(x - x_0)^2 + \frac{1}{2}q(y - y_0)^2 \to \min, \qquad x + y \le S,\; x, y \ge 0.

Здесь x0,y0x_0, y_0 - целевые (желаемые) объёмы двух видов продукции, p,q>0p, q > 0 - коэффициенты, показывающие, насколько дорого обходится отклонение от плана, а SS - общий лимит ресурса, который тратят оба продукта поровну на единицу выпуска. Матрица Q=diag(p,q)Q = \operatorname{diag}(p, q) здесь диагональна и положительно определена, поэтому задача строго выпукла - минимум единственный.

Условия Каруша-Куна-Таккера для задачи КП

Чтобы найти оптимум с ограничениями, составляем функцию Лагранжа с множителем λ0\lambda \ge 0 для ресурсного ограничения и множителями μ1,μ20\mu_1, \mu_2 \ge 0 для неотрицательности:

L(x,y,λ,μ1,μ2)=f(x,y)+λ(x+yS)μ1xμ2y.L(x, y, \lambda, \mu_1, \mu_2) = f(x, y) + \lambda(x + y - S) - \mu_1 x - \mu_2 y.

Целевая точка выходит за пределы треугольника, когда ресурс S сжимается: линия уровня растягивается, множитель лямбда растёт, а оптимум скользит по ребру x+y=S, пока не упрётся в вершину

Условия ККТ требуют одновременно четырёх вещей: стационарности (градиент Лагранжиана по x,yx, y равен нулю), допустимости прямой задачи (x+ySx+y\le S, x,y0x,y\ge0), допустимости двойственной (λ,μ1,μ20\lambda, \mu_1, \mu_2 \ge 0) и дополняющей нежёсткости (λ(x+yS)=0\lambda(x+y-S)=0, μ1x=0\mu_1 x = 0, μ2y=0\mu_2 y = 0). Последнее условие - ключевое: множитель может быть положительным, только если соответствующее ограничение выполняется как равенство. Стационарность по xx и yy (при x,y>0x,y>0, то есть μ1=μ2=0\mu_1=\mu_2=0) даёт:

p(xx0)+λ=0,q(yy0)+λ=0x=x0λp,    y=y0λq.p(x - x_0) + \lambda = 0, \qquad q(y - y_0) + \lambda = 0 \quad \Longrightarrow \quad x = x_0 - \frac{\lambda}{p}, \;\; y = y_0 - \frac{\lambda}{q}.

Метод активных ограничений

Метод активных ограничений решает задачу перебором гипотез о том, какие ограничения выполняются как равенства («активны»), а какие - нет:

  1. Гипотеза «ничего не активно». Проверяем безусловный минимум (x0,y0)(x_0, y_0). Если x0+y0Sx_0 + y_0 \le S - он же и есть решение, λ=0\lambda = 0.
  2. Гипотеза «активно только ресурсное ограничение». Подставляем x=x0λ/px = x_0 - \lambda/p, y=y0λ/qy = y_0 - \lambda/q в равенство x+y=Sx + y = S и находим множитель в замкнутой форме:

λ=pq(x0+y0S)p+q.\lambda = \frac{pq\,(x_0 + y_0 - S)}{p + q}.

Если оба полученных x,y0x, y \ge 0 - гипотеза подтвердилась, это и есть оптимум. Если одна из координат получилась отрицательной - переходим к следующей гипотезе.

  1. Гипотеза «активны ресурс и одна из неотрицательностей». Например, если xx ушёл в минус - фиксируем x=0x = 0, тогда из ресурсного ограничения y=Sy = S: решение - вершина допустимого треугольника.
Допустимый треугольник задачи КП: линия уровня целевой функции касается ресурсного ограничения x+y=S в точке оптимума, расстояние от целевой точки до оптимума показано скобкой
Допустимый треугольник задачи КП: линия уровня целевой функции касается ресурсного ограничения x+y=S в точке оптимума, расстояние от целевой точки до оптимума показано скобкой

На рисунке видно, почему метод и называется «активных ограничений»: допустимое множество - треугольник с вершинами (0,0)(0,0), (S,0)(S,0), (0,S)(0,S), а линии уровня целевой функции - концентрические эллипсы вокруг целевой точки (x0,y0)(x_0,y_0). Оптимум - это самая маленькая (по значению ff) линия уровня, которая ещё касается треугольника. Если целевая точка уже внутри треугольника, касание происходит в самой этой точке. Если она снаружи, эллипс расширяется, пока не коснётся ближайшего ребра или вершины.

Разбор числового примера

Возьмём данные по умолчанию в калькуляторе: целевые объёмы x0=8x_0 = 8, y0=7y_0 = 7, коэффициенты издержек p=1p = 1, q=2q = 2, ресурс S=10S = 10. Сначала проверяем гипотезу «ничего не активно»: x0+y0=15>S=10x_0 + y_0 = 15 > S = 10, значит, целевая точка не помещается в допустимую область, и ресурсное ограничение обязано быть активным.

Считаем множитель Лагранжа по формуле:

λ=pq(x0+y0S)p+q=12(1510)1+2=1033,33.\lambda = \frac{p q (x_0+y_0-S)}{p+q} = \frac{1 \cdot 2 \cdot (15 - 10)}{1 + 2} = \frac{10}{3} \approx 3{,}33.

Подставляем в выражения для координат:

x=x0λp=810/314,67,y=y0λq=710/325,33.x^\ast = x_0 - \frac{\lambda}{p} = 8 - \frac{10/3}{1} \approx 4{,}67, \qquad y^\ast = y_0 - \frac{\lambda}{q} = 7 - \frac{10/3}{2} \approx 5{,}33.

Обе координаты положительны, значит, гипотеза подтвердилась - вершину проверять не нужно. Проверка: x+y=4,67+5,33=10=Sx^\ast + y^\ast = 4{,}67 + 5{,}33 = 10 = S - сходится. Значение целевой функции в оптимуме:

f=12(4,678)2+122(5,337)25,56+2,78=8,33.f^\ast = \frac{1}{2}(4{,}67-8)^2 + \frac{1}{2}\cdot 2 \cdot (5{,}33-7)^2 \approx 5{,}56 + 2{,}78 = 8{,}33.

Экономический смысл множителя Лагранжа

Множитель λ\lambda - это не просто вспомогательное число, а теневая цена ресурса: он показывает, на сколько вырастут минимальные издержки, если ужесточить ограничение SS ровно на единицу. В примере выше λ3,33\lambda \approx 3{,}33 означает, что уменьшение ресурса на единицу (с 10 до 9) увеличит издержки примерно на 3,33 - и наоборот, ослабление ограничения на единицу настолько же их снизит. Именно поэтому в задачах планирования множитель Лагранжа читают как справедливую внутреннюю цену дефицитного ресурса: если внешняя цена его покупки ниже λ\lambda, выгодно докупить ресурс, если выше - не стоит.

Частые ошибки

  • Проверка знаков множителей пропускается. Если после решения системы стационарности получилась отрицательная координата, это не «странный ответ» - это сигнал, что гипотеза об активных ограничениях неверна, и нужно перейти к следующей (вершина треугольника).
  • Ограничение считается активным без проверки. Если целевая точка и так лежит в допустимой области (x0+y0Sx_0+y_0 \le S), ресурсное ограничение не активно, и множитель Лагранжа обязан быть равен нулю - принудительная подстановка в равенство x+y=Sx+y=S даст неверный, завышенный ответ.
  • Путаница знака при подстановке λ\lambda. В стационарности p(xx0)+λ=0p(x-x_0)+\lambda=0 множитель входит со знаком «плюс» именно потому, что ограничение записано как x+yS0x+y-S\le 0; при другой форме записи ограничения знак меняется - важно быть последовательным.
  • Игнорирование условия выпуклости. Метод активных ограничений в этой простой форме работает, только если QQ положительно (полу)определена. Если в матрице издержек встречаются отрицательные коэффициенты, задача может быть невыпуклой, и такого простого решения через стационарность недостаточно.

FAQ

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

Как понять, активно ли ограничение, не решая всю задачу? Достаточно проверить, попадает ли безусловный минимум целевой функции в допустимую область. Если да - ограничение не активно и его можно отбросить. Если нет - ограничение обязательно активно в оптимуме (для выпуклой задачи).

Что делать, если проекция на границу даёт отрицательную координату? Это означает, что оптимум лежит не на этом ребре, а в вершине допустимой области, где активны сразу два ограничения (например, ресурсное и неотрицательность одной из переменных). Нужно зафиксировать эту переменную равной нулю и пересчитать вторую из оставшегося ограничения.

Коротко

Задача квадратичного программирования решается методом активных ограничений: сначала проверяется, укладывается ли безусловный минимум в допустимую область, а если нет - строится система стационарности с множителем Лагранжа для активного ограничения. Если проекция на границу даёт отрицательные координаты, решение ищут в вершине допустимой области. Множитель Лагранжа λ\lambda при этом получает смысл теневой цены ресурса - меры того, насколько ужесточение ограничения увеличивает минимальные издержки.

Доверьте текст нейросети EssayAI

Открыть EssayAI

Бесплатно, на русском языке и без VPN

Читайте также

Атрибуты сущности в ER-модели: пять типов и примеры

Атрибуты сущности в ER-модели: пять типов и примеры

Разбираем пять типов атрибутов сущности в ER-модели: простой, составной, ключевой, многозначный, производный, с примерами и переходом к столбцам и таблицам реляционной схемы.

7 июля 20269 минут
Циркуляция векторного поля по контуру: формула и смысл

Циркуляция векторного поля по контуру: формула и смысл

Циркуляция векторного поля по контуру: что это такое, как вычислить линейный интеграл по параметризации и через ротор поля с теоремой Грина, разбор типичных ошибок и примеров расчёта.

7 июля 20267 минут
Динамическое программирование: основы и идея мемоизации

Динамическое программирование: основы и идея мемоизации

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

7 июля 20267 минут
Кодировка Unicode и UTF-8: как кодируются символы

Кодировка Unicode и UTF-8: как кодируются символы

Кодировка Unicode и UTF-8 простыми словами: как код символа превращается в байты, почему кириллица и эмодзи занимают 2-4 байта и как устроены префиксы 110, 1110, 10.

7 июля 20269 минут
Начальные и центральные моменты случайной величины: формулы

Начальные и центральные моменты случайной величины: формулы

Разбираем начальные и центральные моменты случайной величины: как выразить дисперсию, асимметрию и эксцесс через ν_k и вычислить их на примере дискретного распределения.

7 июля 20268 минут
Натуральная величина сечения многогранника плоскостью

Натуральная величина сечения многогранника плоскостью

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

7 июля 20268 минут