Модуль II·Статья III·~4 мин чтения

Линейное, квадратичное и полуопределённое программирование

Двойственность и условия оптимальности

Превратить статью в подкаст

Выберите голоса, формат и длину — AI запишет аудио

Линейное, квадратичное и полуопределённое программирование

Иерархия выпуклых задач

Выпуклое программирование — это «семейство» задач оптимизации различной сложности. Линейное программирование (ЛП) — простейшее: линейная цель, линейные ограничения. Квадратичное (КП) — квадратичная цель. Программирование второго порядка (SOCP) — конические ограничения. Полуопределённое (SDP) — матричные ограничения. Каждый следующий класс строго обобщает предыдущий. Понимание этой иерархии позволяет выбрать правильный инструмент для конкретной задачи.

Линейное программирование (ЛП)

Стандартная форма: min cᵀx при Ax ≤ b, x ≥ 0.

Здесь c ∈ ℝⁿ — вектор коэффициентов цели, A ∈ ℝ^{m×n} — матрица ограничений, b ∈ ℝᵐ — правые части.

Геометрия: область допустимых решений — выпуклый многогранник (политоп). Линейная целевая функция достигает минимума в вершине многогранника. Симплекс-метод (Данциг, 1947) «ходит» по вершинам, пока не найдёт оптимальную. Метод внутренней точки — движется через внутренность.

Двойственность ЛП: примальная задача min cᵀx при Ax ≥ b, x ≥ 0 имеет двойственную max bᵀy при Aᵀy ≤ c, y ≥ 0. Сильная двойственность выполнена всегда (при допустимости обеих задач).

Пример — задача о диете: минимизировать стоимость набора продуктов при условии получения достаточного количества питательных веществ. Это классическая ЛП-задача, решённая ещё в 1940-х годах.

Квадратичное программирование (КП)

Стандартная форма: min (1/2)xᵀPx + qᵀx при Ax ≤ b

P ∈ ℝ^{n×n} — матрица при квадратичном члене, должна быть ≽ 0 (положительно полуопределённой) для выпуклости задачи.

Почему ≽ 0? Квадратичная форма xᵀPx выпуклая тогда и только тогда, когда P ≽ 0. Критерий: все собственные значения ≥ 0.

Применение: Портфельная оптимизация Марковица

Дан набор активов с ожидаемыми доходностями μᵢ и ковариационной матрицей Σ. Задача: минимизировать риск wᵀΣw при обеспечении целевой доходности μᵀw ≥ r* и ограничении бюджета Σwᵢ = 1.

min (1/2)wᵀΣw при μᵀw ≥ r*, 1ᵀw = 1, w ≥ 0

Это КП! Ковариационная матрица Σ ≽ 0 по своей природе.

Применение: SVM

min (1/2)‖w‖² при yᵢ(wᵀxᵢ + b) ≥ 1 — строго выпуклое КП с уникальным решением.

Программирование второго порядка (SOCP)

Ограничение SOCP: ‖Aᵢx + bᵢ‖ ≤ cᵢᵀx + dᵢ — норма вектора ограничена линейной функцией x.

Геометрически: допустимое множество — пересечение конусов второго порядка с аффинными подпространствами.

Включает ЛП и КП: ЛП — частный случай (Aᵢ = 0, вырождается в линейное). КП с P ≽ 0 допускает SOCP-формулировку.

Пример: Robust линейное программирование

Имеем ЛП, но матрица A = Ā + δA содержит ошибку. Задача: min cᵀx при (Ā + δA)x ≤ b для всех ‖δA‖_F ≤ ρ.

Робастное ограничение: Āᵢᵀx + ρ‖xᵢ‖ ≤ bᵢ — это ограничение SOCP!

Полуопределённое программирование (SDP)

Задача SDP: min_{X} tr(CX) при tr(AᵢX) = bᵢ, i=1,...,m, X ≽ 0

где X — симметричная матрица n×n, X ≽ 0 означает положительную полуопределённость.

Переменная — матрица X! Это обобщение ЛП (переменная — вектор x) на матричный случай.

Почему это выпуклая задача? Множество ≽ 0 матриц — выпуклый конус. Целевая функция tr(CX) — линейная.

Полный разбор: SDP-релаксация задачи MAX-CUT

Задача: граф G = (V, E). Разбить вершины на два множества S и V∖S, максимизируя число рёбер между ними.

ЦЛП-формулировка: xᵢ ∈ {−1, +1}. Разрез: (1/4)Σ_{(i,j)∈E} (1 − xᵢxⱼ). NP-трудная.

SDP-релаксация (Гёманс-Вильямсон, 1995): заменяем xᵢ ∈ {±1} на векторы vᵢ ∈ ℝⁿ с ‖vᵢ‖ = 1. Произведение xᵢxⱼ → скалярное произведение vᵢᵀvⱼ. Матрица Yᵢⱼ = vᵢᵀvⱼ ≽ 0!

max (1/4)Σ_{(i,j)∈E}(1 − Yᵢⱼ) при Yᵢᵢ = 1, Y ≽ 0

Решение: это SDP! Рандомизированное округление (случайная гиперплоскость) даёт 0.878-аппроксимацию MAX-CUT.

Что это означает: алгоритм гарантированно находит разрез, составляющий не менее 87.8% от оптимального. Это лучший известный полиномиальный алгоритм.

Решатели

На практике задачи решаются специализированными пакетами:

  • CVXPY (Python): высокоуровневый язык для описания задач
  • MOSEK: коммерческий, очень быстрый для LP/QP/SOCP/SDP
  • SCS: открытый, масштабируемый для больших SDP
  • ECOS: эффективный для встроенных систем

Пример на CVXPY: x = cp.Variable(n); prob = cp.Problem(cp.Minimize(0.5*cp.quad_form(x,P) + q.T@x), [A@x <= b]); prob.solve()

Иерархия классов задач

Существует естественная иерархия выпуклых конических программ по выразительной силе и сложности: LP ⊂ QP ⊂ SOCP ⊂ SDP

Каждый следующий класс строго мощнее: SDP может выразить SOCP через стандартное вложение, SOCP включает QP с положительно полуопределёнными матрицами, QP включает LP. Сложность также растёт: LP решается за O(n^{3.5}) симплексом или внутренней точкой, QP — за O(n³), SOCP — за O(n^{3.5}), SDP — за O(n^{6.5}) для общих задач, хотя структурированные могут быть существенно быстрее.

Промышленные решатели

  • LP: Gurobi, CPLEX, MOSEK, HiGHS (open source) — миллионы переменных за секунды
  • QP: OSQP, qpOASES (для управления в реальном времени), Gurobi
  • SOCP: ECOS, MOSEK, SCS — широко используются в финансах для робастных портфелей
  • SDP: SDPT3, SeDuMi, MOSEK, COSMO — для задач до нескольких тысяч переменных
  • Универсальные моделирующие языки: CVXPY, JuMP, YALMIP — позволяют записать задачу в естественной форме и автоматически привести к канонической для решателя

Современные применения

  • LP в авиации: American Airlines решает задачи с миллионами переменных для назначения экипажей
  • QP в робототехнике: квадратурные регуляторы (LQR) и MPC (Model Predictive Control) — основа управления манипуляторами и квадрокоптерами
  • SOCP в финансах: робастные портфели Гольдфарба-Айенгара учитывают неопределённость в оценках доходностей через эллипсоидные множества
  • SDP в квантовых вычислениях: задачи квантовой томографии, оценки квантовых каналов формулируются через SDP
  • SDP в комбинаторике: релаксация Гёманса-Уильямсона для MAX-CUT даёт 0.878-аппроксимацию через SDP — рекордный результат теоретической информатики

§ Акт · что дальше