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