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

Введение

Нелинейные программы (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 — это руководство для более опытных пользователей, в котором рассматривается вычисление гессиана лагранжиана нелинейной программы. Оно будет полезно лишь в особых случаях.

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