Документация Engee

Когда следует использовать JuMP

JuMP — это язык алгебраического моделирования для математической оптимизации, написанный на языке Julia.

На этой странице объясняется, когда можно применять язык JuMP и, что более важно, когда его не следует применять.

Когда следует использовать JuMP

Язык JuMP следует использовать, когда нужно решить задачу оптимизации в ограничениях, сформулированную на языке математического программирования, то есть задачу, в которой есть следующее:

  • набор вещественно- или комплекснозначных переменных решения;

  • вещественная целевая функция со скалярным или векторным значением;

  • набор ограничений.

Основные доводы в пользу использования JuMP:

  • Удобство для пользователя

  • Отсутствие зависимости от решателя

    • JuMP использует универсальный независимый от решателя интерфейс, предоставляемый пакетом

MathOptInterface, что позволяет легко переключаться между несколькими открытыми и коммерческими пакетами программного обеспечения для оптимизации («решателями»). В разделе Supported solvers приводится таблица поддерживаемых в настоящее время решателей.

  • Простота внедрения

    • Сам язык JuMP написан полностью на Julia. Единственными двоичными зависимостями

являются решатели.

  • JuMP обеспечивает автоматическую установку большинства решателей.

  • Так как JuMP встроен в язык программирования общего назначения, он позволяет легко решать задачи оптимизации в рамках более общего рабочего процесса, например внутри моделирования, за веб-сервером или в качестве подзадачи в алгоритме разложения. Обратной стороной является то, что синтаксис JuMP ограничен синтаксисом и возможностями Julia.

  • Язык JuMP распространяется по лицензии MPL, а значит, его можно встраивать в коммерческое программное обеспечение, которое соответствует условиям этой лицензии.

  • Быстродействие

    • Тесты производительности показывают, что JuMP позволяет создавать задачи с той же скоростью, что и специализированные языки моделирования, такие как AMPL.

  • JuMP взаимодействует с большинством решателей в памяти, что избавляет от необходимости записывать промежуточные файлы.

  • Доступ к передовым алгоритмическим методам

    • JuMP поддерживает эффективное повторное решение моделей в памяти.

    • JuMP обеспечивает доступ к независимым и зависимым от решателя обратным вызовам.

Когда не следует использовать JuMP

Язык JuMP поддерживает широкий спектр классов оптимизации. Но есть и такие, которые он не поддерживает или которые лучше поддерживаются другими программными пакетами.

Оптимизация сложной функции Julia

Пакеты Julia хорошо компонуются друг с другом. Разработчики часто выбирают два не связанных между собой пакета и используют их вместе, чтобы получить новые возможности. JuMP не относится к таким пакетам.

Если нужно оптимизировать обычное дифференциальное уравнение из DifferentialEquations.jl или настроить нейронную сеть из Flux.jl, возможно, лучше будет обратить внимание на другие пакеты, например следующие:

Оптимизация методом «черного ящика», без производных или без ограничений

JuMP поддерживает нелинейные программы с ограничениями и целевыми функциями, содержащими пользовательские операторы. Однако функции должны быть автоматически дифференцируемыми или иметь явно заданные производные. (Дополнительные сведения см. в разделе Пользовательские операторы.)

Если функция представляет собой «черный ящик», который не поддается дифференцированию (например, результат моделирования на C++), JuMP не подходит для этой задачи. То же самое касается и случая, когда вы хотите использовать метод без производных.

Даже если задача дифференцируемая, но не содержит ограничений, использование JuMP имеет мало преимуществ по сравнению с инструментами, которые предназначены исключительно для минимизации функций (и имеет недостаток в виде дополнительных накладных расходов).

Возможные альтернативы:

Дисциплинированное выпуклое программирование

Возможные альтернативы:

Пакет Convex.jl также построен на основе MathOptInterface и использует тот же набор базовых решателей. Однако задачи вводятся иначе, и Convex.jl проверяет, относится ли задача к классу DCP.

Стохастическое программирование

JuMP требует детерминированных входных данных.

Если входные данные стохастические, лучше воспользоваться расширением JuMP, например одним из следующих:

Полиэдральные вычисления

JuMP не предоставляет средств для работы с многогранником, образованным набором линейных ограничений.

Возможные альтернативы: