Неопубликованная запись
Сравнение оптимизаторов: плюсы, минусы, подводные камни
Оптимизация — это центральное понятие во многих инженерных, научных и прикладных задачах. Где бы ни стояла цель «сделать лучше» — дешевле, быстрее, точнее — почти всегда за этим стоит задача оптимизации.
В её основе лежит поиск таких значений переменных, при которых некоторая функция достигает минимума или максимума с учётом заданных ограничений.
Задачи оптимизации применяются в самых разных отраслях. В логистике — это маршруты доставки и минимизация затрат. В финансах — подбор инвестиционного портфеля с учётом рисков. В производстве — оптимальное распределение ресурсов. В энергетике — балансировка потоков в сетях. В машинном обучении — обучение моделей, таких как SVM или регрессия, часто сводится к решению задач квадратичного или линейного программирования.
Типичная задача может выглядеть так: «Найти такие параметры, чтобы максимизировать прибыль, но не выйти за пределы бюджета и производственных мощностей». Формально это выражается через линейное (LP) или квадратичное программирование (QP), и решается с помощью специализированных оптимизаторов — программных инструментов, которые находят решение таких задач эффективно и надёжно.
В этой статье мы рассмотрим, какие бывают оптимизаторы для LP и QP, чем они отличаются и как выбрать подходящий инструмент под задачу.
Постановка задачи оптимизации
Прежде чем говорить о методах решения, кратко напомним, как формулируются задачи линейного и квадратичного программирования. Это поможет понимать, какие методы к чему применимы.
🔹 Линейное программирование (LP)

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

Как оптимизаторы решают задачи LP и QP?
Современные решатели задач оптимизации используют разные подходы в зависимости от структуры задачи: линейная она или квадратичная, большого ли размера, разреженная или плотная. Ниже — три основных метода, которые лежат в основе большинства LP и QP оптимизаторов.
🔹 Симплекс-метод
Симплекс-метод — один из старейших и наиболее известных алгоритмов для решения задач линейного программирования. Его разработал Джордж Данциг в середине XX века. Метод опирается на геометрию: допустимая область решений при линейных ограничениях — это выпуклый многогранник, а целевая функция — линейная плоскость. Оптимум всегда достигается на одной из вершин этого многогранника. Алгоритм начинает с одной вершины и последовательно переходит к соседним, улучшая значение целевой функции, пока не найдёт оптимальную. Несмотря на то, что в теории его худшее время — экспоненциальное, на практике симплекс-метод работает очень быстро и стабильно, особенно на задачах среднего размера и с разреженной структурой. Он широко используется в промышленности и встроен почти во все оптимизаторы: CPLEX, Gurobi, HiGHS и другие.
🔹 Метод внутренней точки (Interior Point Method)
Методы внутренней точки — более современные алгоритмы, активно развивавшиеся с 1980-х годов. В отличие от симплекса, который перемещается по границе допустимой области, IPM-методы движутся внутри неё, приближаясь к оптимальному решению по гладкой кривой. Алгоритм решает серию приближённых задач с барьерной функцией, которая предотвращает выход за границы области допустимых решений. Эти методы особенно хорошо подходят для задач большого размера с плотной структурой, поскольку их итерации масштабируются более предсказуемо, чем у симплекса. Они также обеспечивают высокую численную стабильность и точность. IPM используется для решения как LP, так и QP задач и доступен во всех крупных решателях. Например, Gurobi может автоматически выбрать IPM, если видит, что задача большая и «плотная».
🔹 Метод активных ограничений (Active-set Method)
Метод активных ограничений применяется преимущественно для задач квадратичного программирования. Его идея заключается в том, что в оптимальной точке не все ограничения задачи влияют на решение — лишь некоторые из них становятся равенствами. Алгоритм пытается на каждой итерации угадать, какие ограничения «активны», и решает задачу только по ним, последовательно уточняя этот набор. Это даёт значительный выигрыш, если задача небольшая или если доступно хорошее начальное приближение — так называемый warm start. Метод особенно популярен в задачах управления и машинного обучения, например, при обучении SVM. Он также часто применяется в реальном времени, когда решение требуется быстро и с известными начальными условиями. Хотя активные множества менее универсальны, они эффективно работают в своём классе задач.
Обзор популярных оптимизаторов: open-source и коммерческие
Когда вы формулируете задачу оптимизации — будь то линейная модель логистики или квадратичная модель управления температурой — её всё равно нужно решать с помощью специального инструмента. Такие инструменты называются оптимизаторы (солверы). Сегодня существует множество решений, от открытых и бесплатных до высокопроизводительных коммерческих пакетов, которые используются в промышленности, банковской сфере, логистике и научных исследованиях.
Открытые (Open-Source) оптимизаторы
Открытые оптимизаторы привлекают своей доступностью, отсутствием лицензионных отчислений и возможностью заглянуть «под капот». За последние годы их качество и производительность значительно выросли.
HiGHS (High-performance General Solver)
- Тип: Open-source (MIT License).
- Задачи: LP, MILP, QP.
- Особенности: Современный и быстрый решатель, разрабатываемый в Университете Эдинбурга. Поддерживает симплекс-метод и методы внутренней точки. Сравним по производительности с коммерческими решениями. Например, научная библиотека SciPy использует HiGHS в качестве стандартного решателя LP начиная с версии 1.6.0, а также подключает решатель HiGHS MIP для задач дискретной оптимизации начиная с версии 1.9.0.
- Когда использовать: Для высокопроизводительного решения LP/QP задач с открытой лицензией. Отличен для академических и исследовательских проектов.
- Интерфейсы: C++, Python, Julia, Rust, R, JavaScript, Fortran, C#.
OSQP (Operator Splitting QP Solver)
- Тип: Open-source (Apache 2.0).
- Задачи: QP (включая LP как частный случай с ( Q = 0 )).
- Особенности: Специализированный решатель QP, основанный на методе ADMM. Хорошо работает в системах управления, робототехнике, встраиваемых системах и машинном обучении. Поддерживает генерацию C-кода для embedded.
- Когда использовать: Для задач QP, особенно когда важна скорость, устойчивость и работа в ограниченных условиях.
- Интерфейсы: C, Python, MATLAB, Julia, R.
CVXOPT
- Тип: Open-source (GPL v3).
- Задачи: LP, QP, SOCP, SDP.
- Особенности: Python-библиотека для выпуклой оптимизации, использует свои структуры матриц. Реализует метод внутренней точки.
- Когда использовать: Для академических задач, связанных с выпуклой оптимизацией в экосистеме SciPy/NumPy.
- Интерфейсы: Python.
GLPK (GNU Linear Programming Kit)
- Тип: Open-source (GPL v3).
- Задачи: LP, MILP.
- Особенности: Классический решатель с поддержкой симплекс-метода и собственным языком моделирования GNU MathProg.
- Когда использовать: В образовании, небольших задачах, при условии совместимости с GPL.
- Интерфейсы: C, Python (через pyomo, pulp), Java, R и др.
Коммерческие оптимизаторы
Коммерческие решатели предлагают высочайшую производительность, устойчивость и поддержку. Это стандарт в индустрии для критически важных и больших задач.
Gurobi Optimizer
- Тип: Коммерческий (есть академическая лицензия).
- Задачи: LP, QP, QCP, MILP, MIQP, MIQCP.
- Особенности: Один из самых быстрых и стабильных решателей. Реализует симплекс, внутреннюю точку, эвристики и разветвление-границы. Поддерживает много языков, отличная документация.
- Когда использовать: В бизнесе, логистике, энергетике и финансах, где важны максимальная скорость и надёжность.
- Интерфейсы: Python, C, C++, Java, .NET, R, MATLAB.
IBM CPLEX Optimizer
- Тип: Коммерческий (есть академическая лицензия).
- Задачи: LP, QP, QCP, MILP, MIQP, MIQCP, CP.
- Особенности: Старейший промышленный решатель. Надёжен и стабилен, поддерживает constraint programming и интеграцию с IBM продуктами.
- Когда использовать: Альтернатива Gurobi, особенно если уже используется экосистема IBM или нужен CP.
- Интерфейсы: Python, C, C++, Java, .NET, MATLAB, OPL.
MOSEK
- Тип: Коммерческий (есть академическая лицензия).
- Задачи: LP, QP, QCP, MILP, MIQP, MIQCP, SOCP, SDP.
- Особенности: Сильнейший в конической оптимизации. Высокоточный внутренний метод, хорошо работает на плохо обусловленных задачах.
- Когда использовать: В задачах с коническими ограничениями или при необходимости численно устойчивого IPM.
- Интерфейсы: Python, C, C++, Java, .NET, MATLAB, R.
Языки моделирования и API
Формулировать задачи напрямую в C или Python API не всегда удобно. Поэтому широко используются высокоуровневые библиотеки:
- Pyomo (Python): мощный фреймворк для LP/MIP/QP/CP, поддерживает множество солверов.
- PuLP (Python): простая библиотека для LP/MILP, легко подключается к CBC, CPLEX, Gurobi и др.
- CVXPY (Python): инструмент для выпуклой оптимизации, автоматически проверяет выпуклость по правилам DCP.
- JuMP (Julia): язык моделирования с высокой производительностью, встроенный в язык Julia.
- AMPL, GAMS: коммерческие языки моделирования с широкой поддержкой солверов, популярны в научных и промышленных задачах.
Эти инструменты позволяют описывать модель оптимизации в форме, близкой к математической записи, и автоматически передавать её нужному решателю.
В следующем разделе мы кратко сравним эти решатели по ключевым характеристикам и обсудим, как выбрать подходящий под конкретную задачу.
Производительность: Кто быстрее?
Это, пожалуй, самый частый вопрос, который возникает при выборе оптимизатора.
Общая тенденция
Коммерческие решатели (Gurobi, CPLEX, MOSEK) традиционно лидируют по производительности, особенно на больших и сложных задачах LP, QP, а особенно MILP/MIQP. Эти компании инвестируют огромные ресурсы в исследования, разработки, препроцессинг, численную устойчивость и подбор метода в зависимости от структуры задачи. Их ядра оптимизированы до предела, в том числе с использованием многопоточности и SIMD-инструкций.
HiGHS — лидер в Open-Source
HiGHS — самый быстрый open-source универсальный оптимизатор на сегодня. Он демонстрирует отличные результаты на LP и MILP-задачах, во многих случаях приближаясь к Gurobi/CPLEX, а на отдельных тестах даже обгоняя их (особенно на LP с простой структурой). Поддержка QP у HiGHS также активно развивается, хотя пока отстаёт от коммерческих решений.
OSQP — спецназ для QP
OSQP — не универсальный решатель, а инструмент, заточенный под быстрое и устойчивое решение QP-задач с определённой структурой (в системах управления, машинном обучении, embedded). Он не конкурирует напрямую с Gurobi на произвольных задачах, но в своей нише — невероятно быстр и умеет работать с разреженными матрицами, поддерживает warm start и генерацию C-кода.
Остальные Open-Source решатели
GLPK и CVXOPT значительно уступают по скорости и масштабируемости. Их основная область применения — обучение, академические прототипы и небольшие задачи. Они стабильны и просты в использовании, но не рассчитаны на решение больших моделей.
Где искать бенчмарки?
Он регулярно публикует обновляемые тесты по следующим направлениям:
- Линейное программирование (LP).
- Квадратичное программирование (QP).
- Целочисленное программирование (MILP).
- SOCP, SDP, MINLP и др.
Академические исследования и обзоры по Open-Source солверам
Помимо общих бенчмарков (например, тестов Ханса Миттельмана), существуют и специализированные академические исследования, фокусирующиеся на сравнении именно открытых оптимизаторов.
Такие исследования, как правило:
- Тестируют популярные на момент публикации open-source решатели: GLPK, Clp, CBC, SCIP, HiGHS и др.
- Используют реальные и стандартные тестовые наборы: Netlib, MIPLIB, Mittelmann LP и др.
- Анализируют: время решения,надёжность (доля успешно решённых задач),иногда точность решения (выполнение ограничений, устойчивость).
Часто в таких статьях подтверждается, что коммерческие решатели в среднем быстрее, особенно на больших задачах. Однако и среди open-source решений находятся конкурентоспособные участники — например, HiGHS и Clp показывают отличные результаты на LP-задачах малой и средней размерности, а SCIP — на некоторых MILP-задачах.
Что ещё можно почитать?
- Официальные публикации разработчиков (например, сравнение Gurobi с другими решателями на их сайте) могут быть полезны, но всегда читайте с критическим взглядом.
- Академические статьи, сравнивающие решатели в прикладных областях (например, «Сравнение QP-решателей в задачах управления движением робота»), дают более объективные результаты, особенно в узких задачах.
Как выбрать подходящий оптимизатор? Практические соображения
Выбор решателя зависит от типа задачи, масштаба, ограничений лицензирования, а также ваших целей — исследование, прототип, прод.
🔹 Определите тип задачи
- Только LP или QP, без целочисленных переменных?
▸ Нужна максимальная скорость и надёжность: Gurobi, CPLEX, MOSEK.
▸ Нужен быстрый open-source: HiGHS.
▸ Узкоспециализированная QP-задача (MPC, машинное обучение, embedded): OSQP.
▸ Маленькие задачи и обучение: CVXOPT, PuLP/Pyomo с бэкендом HiGHS или GLPK.
- Есть целочисленные переменные (MILP/MIQP)?
▸ Коммерческие: Gurobi, CPLEX, MOSEK.
▸ Open-source: HiGHS (очень силён в MILP), GLPK (для небольших задач).
- Есть конические ограничения (SOCP/SDP)?
▸ MOSEK — часто лучший выбор.
▸ CVXOPT — академическая альтернатива.
▸ Gurobi и CPLEX — не являются изначально нативными коническими решателями, но предоставляют частичную поддержку таких задач.
🔹 Оцените масштаб и производительность
- Прототип / небольшая задача.
▸ Подойдёт любой: начните с простого в интеграции — PuLP + HiGHS/CBC, CVXOPT, CVXPY.
- Крупная промышленная задача.
▸ Лучше использовать коммерческие солверы или HiGHS.
▸ Обязательно тестируйте на реальных данных.
🔹 Учитывайте лицензионные ограничения и бюджет
- Академическое использование.
▸ Все топовые коммерческие солверы предоставляют бесплатные лицензии: Gurobi, CPLEX, MOSEK.
- Коммерческий проект с бюджетом.
▸ Лицензии Gurobi/CPLEX/MOSEK стоят недёшево, но окупаются для критических задач.
- Коммерческий проект без бюджета/нужен open-source.
▸ HiGHS (MIT), OSQP (Apache 2.0) — отличные выборы.
▸ GPL-лицензии (GLPK, CVXOPT) несовместимы с проприетарным ПО.
🔹 Удобство использования и экосистема
▸ Все крупные солверы поддерживают Python API.
▸ Используйте Pyomo, CVXPY, JuMP — они позволяют быстро менять бэкенд и ускоряют разработку.
▸ OSQP — лучший выбор для embedded-систем.
🔹 Надёжность и поддержка
- Для критически важных задач.
▸ Коммерческие решатели обеспечивают техническую поддержку, надёжность и ответственность.
▸ HiGHS и OSQP — активно развиваются, с живыми сообществами и быстрым реагированием на баги.
Вывод
- Для серьёзных задач MILP/MIQP — Gurobi/CPLEX без конкуренции.
- Для LP/QP — HiGHS — реальная альтернатива.
- Для специализированных QP — OSQP вне конкуренции по скорости.
- Для учёбы и простых задач — GLPK, CVXOPT всё ещё живы.
Бонус: решаем задачи из примеров на Python
В качестве завершающего акцента давайте покажем, как можно реально решить классическую задачу линейного программирования, которую мы разбирали выше, — с помощью Python и библиотеки scipy.optimize.
Задача
Нужно определить, сколько изделий A и B производить, чтобы получить максимум прибыли, не превышая ресурсы:
- Изделие A требует 2 часа работы станка и 1 кг сырья, приносит $40 прибыли;
- Изделие B — 1 час работы станка и 1 кг сырья, приносит $30 прибыли;
- Всего доступно 100 часов и 80 кг.
Формально:

Решение QP-задачи — управление температурой
Напомним: нам нужно подобрать мощность охлаждения (u_t) на интервале в 5 часов, чтобы температура в серверной комнате плавно снизилась к комфортным 22 °C, начиная с 25 °C, и суммарное отклонение от цели было минимальным.


Лев Менделевич, разработчик программного обеспечения