Введение
Нелинейные программы (NLP) — это класс задач оптимизации, в которых некоторые ограничения или целевая функция являются нелинейными:
Частично целочисленные нелинейно-линейные программы (MINLP) представляют собой расширения нелинейных программ, в которых некоторые (или все) переменные решения принимают дискретные значения.
Выбор решателя
JuMP поддерживает ряд нелинейных решателей; ищите NLP в списке в разделе Supported solvers. Однако очень немногие решатели поддерживают частично целочисленные нелинейно-линейные программы. В списке в разделе Supported solvers имена решателей, поддерживающих дискретные переменные, начинаются с «(MI)».
Если единственными нелинейностями в модели являются квадратичные члены (то есть умножение двух переменных решения), можно также использовать конические решатели второго порядка, которые обозначаются как SOCP. В большинстве случаев эти решатели ограничены выпуклыми квадратичными задачами и выдают ошибку при передаче невыпуклой квадратичной функции; однако Gurobi может решать задачи с невыпуклыми квадратичными членами.
Структура руководств
Общее представление о структуре этой части документации поможет вам понять, где искать нужную информацию.
-
Следующие руководства представляют собой практические примеры, в которых задача излагается словами, затем формулируется математически, а затем решается в JuMP. Решение обычно визуализируется каким-либо образом. Начните с них, если вы новичок в JuMP.
-
Rocket Control
-
Optimal control for a Space Shuttle reentry trajectory
-
Portfolio optimization
-
-
В руководстве Советы приводится ряд полезных переформулировок и приемов, которые можно использовать при моделировании нелинейных программ. Обратитесь к нему, если вы зашли в тупик, пытаясь сформулировать задачу в виде нелинейной программы.
-
Computing Hessians — это руководство для более опытных пользователей, в котором рассматривается вычисление гессиана лагранжиана нелинейной программы. Оно будет полезно лишь в особых случаях.
-
Остальные руководства менее подробны и оформлены в виде коротких примеров кода. В них меньше пояснений, но они могут содержать полезные фрагменты кода, особенно если вы пытаетесь решить похожую задачу.