Инструменты и применения

В реальной работе алгоритмы из курса обычно не пишут с нуля — используют зрелые солверы; важно знать, какой под какую задачу.

Солвер — готовая библиотека, реализующая методы оптимизации (часто промышленного качества), которой задают задачу в стандартной форме.

Зачем учить методы, если есть солверы

Мы реализовали градиентный спуск, симплекс, отжиг вручную — чтобы понимать, что происходит внутри. В продакшене же берут отлаженные солверы: они быстрее, надёжнее, обрабатывают вырожденные случаи. Но без понимания методов вы не сможете ни выбрать правильный солвер, ни диагностировать, почему он не сходится, ни правильно поставить задачу. Знание = осознанное использование инструментов.

Карта солверов

БиблиотекаДля чегоКласс задач
scipy.optimizeОбщая численная оптимизацияГладкие, BFGS/Ньютон, без/с ограничениями, корни
cvxpyВыпуклая оптимизация декларативноLP, QP, SOCP, SDP — формулируешь, солвер сам решает
PuLPЛинейное и целочисленное программированиеLP / MILP, простой синтаксис
Google OR-ToolsКомбинаторика и расписанияМаршруты, упаковка, расписания, CP-SAT

Как это выглядит (для чтения)

Эти примеры используют сторонние библиотеки, поэтому в браузере не запускаются — они помечены как текст и приведены для знакомства с синтаксисом.

# scipy: безусловная минимизация методом BFGS
from scipy.optimize import minimize
res = minimize(lambda v: (v[0]-3)**2 + (v[1]+1)**2, x0=[0, 0], method="BFGS")
print(res.x)        # ~ [3, -1]

# cvxpy: выпуклая задача задаётся почти как на бумаге
import cvxpy as cp
x = cp.Variable(2)
prob = cp.Problem(cp.Maximize(30*x[0] + 20*x[1]),
                  [4*x[0] + 2*x[1] <= 40, 2*x[0] + 3*x[1] <= 42, x >= 0])
prob.solve()        # находит (6, 8), прибыль 340

Заметьте: в cvxpy мы не пишем симплекс — лишь декларируем задачу, а солвер выбирает метод. Но узнаёте задачу? Это наш цех из раздела про LP.

Где оптимизация работает в реальном мире

ОбластьЧто оптимизируютТипичный класс
Машинное обучениеВеса модели (минимум ошибки)Невыпуклая, SGD/Adam
ФинансыПортфель (доход против риска)Выпуклая QP, многокритериальная
ЛогистикаМаршруты доставкиКомбинаторная, OR-Tools
ПроизводствоПлан выпуска при ресурсахLP / MILP
ЭнергетикаЗагрузка электростанцийMILP, большие масштабы
ИнженерияФорма крыла, конструкцииНевыпуклая с ограничениями

Маленький практический итог исполнимо

Соберём «шпаргалку выбора» как данные и распечатаем — финальный взгляд на курс.

guide = [
    ("гладкая выпуклая, малое n", "Ньютон / BFGS (scipy)"),
    ("выпуклая с ограничениями", "cvxpy / внутренняя точка"),
    ("линейная / целочисленная", "симплекс, PuLP, OR-Tools"),
    ("невыпуклая, большое n",    "SGD / Adam"),
    ("комбинаторная (маршруты)", "OR-Tools / метаэвристики"),
    ("чёрный ящик без градиента", "отжиг / ГА / Нелдер-Мид"),
]
for task, tool in guide:
    print(f"{task:28s}-> {tool}")

Вывод:

гладкая выпуклая, малое n   -> Ньютон / BFGS (scipy)
выпуклая с ограничениями    -> cvxpy / внутренняя точка
линейная / целочисленная    -> симплекс, PuLP, OR-Tools
невыпуклая, большое n       -> SGD / Adam
комбинаторная (маршруты)    -> OR-Tools / метаэвристики
чёрный ящик без градиента   -> отжиг / ГА / Нелдер-Мид

Как работает под капотом

Промышленные солверы (Gurobi, CPLEX для MILP; IPOPT для нелинейного; OSQP для QP) реализуют те же идеи, что мы прошли, но с десятилетиями инженерной полировки: численная устойчивость, предобработка (presolve), параллелизм, эвристики отсечения. Ваше преимущество как понимающего инженера — правильно сформулировать задачу (выпукло, хорошо обусловленно, в подходящем классе) и распознать, когда солвер врёт о сходимости. Формулировка важнее выбора солвера: выпуклая постановка решается за секунды, невыпуклая той же задачи — за часы и без гарантий.

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

  • Писать алгоритм с нуля в продакшене. Зрелый солвер почти всегда быстрее и надёжнее; ручная реализация — для учёбы.
  • Брать общий солвер для специальной задачи. LP лучше решит симплекс/cvxpy, а не общий нелинейный минимизатор.
  • Не проверять статус сходимости. Солвер может вернуть «решение», не достигнув оптимума — всегда читайте флаг успеха.

Итоги

  • В продакшене используют солверы: scipy (общая), cvxpy (выпуклая), PuLP (LP/MILP), OR-Tools (комбинаторика).
  • Знание методов нужно, чтобы выбрать солвер, поставить задачу и диагностировать проблемы.
  • Оптимизация — двигатель ML, финансов, логистики, производства; правильная формулировка важнее выбора солвера.
Проверьте себя
1. Какой инструмент удобнее для декларативной выпуклой оптимизации?
AOR-Tools
Bcvxpy — задаёшь задачу, солвер сам выбирает метод
CРучной градиентный спуск
DPuLP только для нелинейных
2. Зачем понимать методы, если есть готовые солверы?
AНезачем
BЧтобы выбрать солвер, правильно поставить задачу и диагностировать несходимость
CЧтобы писать всё с нуля в продакшене
DСолверы не нужны
3. Что обычно важнее для скорости решения — выбор солвера или формулировка задачи?
AТолько выбор солвера
BФормулировка: выпуклая постановка решается за секунды, невыпуклая той же задачи — за часы
CНи то ни другое
DТолько язык программирования