Какой решатель я должен использовать в Drake для решения смешанной целочисленной программы с нелинейными ограничениями? - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь решить нелинейную программу со смешанными целыми числами с помощью Drake с помощью решателя Snopt, но обнаружил следующую ошибку:

ValueError: Возможности drake :: solvers :: SnoptSolver не соответствует требованиям MathematicalProgram ({ProgramAttributes: GenericConstraint, QuadraticCost, LinearConstraint, LinearEqualityConstraint, BinaryVariable})

Какой решатель / альтернативный подход рекомендуется в моем случае?

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

Как вы упомянули, ваше ограничение:

x[k+1] = A * ((1-b[k]) * x1[k] + b[k] * x2[k])

, где b[k] - двоичная переменная, x1[k], x2[k], x[k+1] - непрерывные переменные.

Это ограничение можно переформулировать как смешанное - целочисленное линейное ограничение. Вам нужно

b[k] = 1, then x[k+1] = A * x2[k]
b[k] = 0, then x[k+1] = A * x1[k]

Обычно, если при фиксации двоичной переменной 0 или 1 оставшееся ограничение является линейным, тогда ограничения можно переформулировать как смешанные целочисленные линейные ограничения. Есть два подхода к преобразованию вашего ограничения в смешанное целочисленное линейное ограничение, а именно подход big-M и подход выпуклой оболочки, как объясняется в этом учебном пособии .

В качестве быстрой демонстрации подхода с выпуклой оболочкой предположим, что ваша переменная ограничена

x1[k] ∈ ConvexHull(v₁, v₂, ..., vₘ)
x2[k] ∈ ConvexHull(w₁, w₂, ..., wₙ)

где v₁, v₂, ..., vₘ, w₁, w₂, ..., wₙ - все заданные точки.

Мы вводим два слабых места переменные s1, s2. Мы намерены наложить следующие ограничения:

b[k] = 1, then s1 = 0, s2 = A * x2[k]
b[k] = 0, then s2 = 0, s1 = A * x1[k]
x[k+1] = s1 + s2

Приведенные выше ограничения означают, что выпуклая оболочка точки (b[k], s2, x2[k]) - это многогранник с вершинами

(1, A * w₁, w₁)
(1, A * w₂, w₂)
...
(1, A * wₙ, wₙ)
(0, 0, w₁)
(0, 0, w₂)
...
(0, 0, wₙ) 

С этими вершинами многогранник записан в V-представлении. Вы можете преобразовать это V-представление в H-представление. Это H-представление обозначается как

H * [b[k], s2, x2[k]] <= h

, где каждая строка H является нормалью к грани многогранника. Это H-представление является (смешанным целочисленным) линейным ограничением на переменные b[k], s2, x2[k]. Альтернативная формулировка, чтобы ограничить это b[k], s2, x2[k] до l ie внутри многогранника, состоит в том, чтобы записать (b[k], s2, x2[k]) как выпуклую комбинацию вершин многогранника (вам также нужно будет ввести выпуклые комбинации весов в качестве переменных решения со всеми весами неотрицательна, а сумма весов равна 1). Используя этот подход с выпуклой комбинацией, вам не нужно преобразовывать V-представление в H-представление. Вот смешанные целочисленные линейные ограничения для b[k], s2, x2[k] с использованием подхода выпуклой комбинации.

b[k] = λ₁ + λ₂ + ... + λₙ
s2 = A*(λ₁w₁ + λ₂w₂ + ... + λₙwₙ)
x2[k] = λ₁w₁ + λ₂w₂ + ... + λₙwₙ + λₙ₊₁w₁ + λₙ₊₂w₂ + ... + λ₂ₙwₙ
1 = λ₁ + λ₂ + ... + λₙ + λₙ₊₁ + λₙ₊₂ + ... + λ₂ₙ
λᵢ ≥ 0 ∀ i = 1, ..., 2n
b[k] is binary

где веса λᵢ, i = 1, ..., 2n - это новые переменные резерва, представляющие веса выпуклой комбинации. Вы можете проверить, что эти ограничения обеспечивают выполнение

if b[k] = 0, then s2 = 0.
if b[k] = 1, then s2 = A*x2[k]

. Точно так же мы знаем, что выпуклая оболочка точки (b[k], s1, x1[k]) является многогранником со следующими вершинами

(1, 0, v₁)
(1, 0, v₂)
...
(1, 0, vₘ)
(0, A*v₁, v₁)
(0, A*v₂, v₂)
...
(0, A*vₘ, vₘ)

, и мы можем написать линейные ограничения из H-представления многогранника. Мы объединяем два набора линейных ограничений, полученных из многогранников, вместе с линейным ограничением x[k+1] = s1 + s2, мы получаем смешанные целочисленные линейные ограничения вашей задачи. Для подробного объяснения этого подхода с выпуклой оболочкой вы можете обратиться к связанному выше руководству.

2 голосов
/ 05 мая 2020

Смешанная целочисленная нелинейная оптимизация - очень сложная проблема, и для этого существует лишь несколько программных средств оптимизации, например: Couenne , Baron . Drake не поддерживает ни один из этих решателей.

Drake поддерживает решатели для наиболее распространенных выпуклых программ со смешанными целыми числами (таких как MILP, MIQP, MISOC). Но для их использования ваша задача оптимизации должна иметь только выпуклые ограничения (например, линейные равенства и неравенства).

Один из способов продолжить использование нелинейного решателя, такого как SNOPT, для решения вашей проблемы оптимизации - это установить двоичные ограничения, как показано ниже. . Скажем, вы хотите, чтобы x был двоичным, тогда вы можете добавить гладкое ограничение x * (x - 1) = 0. (Обратите внимание, что последнее проверяется, если x = 0 или x = 1.) Это, однако, очень "жестко". ограничение и может привести к проблемам с числом c. Также обратите внимание, что при этом у вас нет никаких гарантий с точки зрения нахождения допустимого решения, если оно существует (гарантии, которые у вас есть при смешанном целочисленном выпуклом программировании), и решающая программа может сходиться к локальному минимуму.

...