Приведение к логическому, для целочисленного линейного программирования


11

Я хочу выразить следующее ограничение в целочисленной линейной программе:

y={0if x=01if x≠0.

У меня уже есть целочисленные переменные и мне обещают, что - 100 ≤ x ≤ 100 . Как я могу выразить вышеупомянутое ограничение в форме, подходящей для использования с решателем целочисленного линейного программирования?x,y−100≤x≤100

Это, вероятно, потребует введения некоторых дополнительных переменных. Какие новые переменные и ограничения мне нужно добавить? Можно ли сделать это чисто с помощью одной новой переменной? Два?

Эквивалентно, это спрашивает, как применить ограничение

y≠0 if and only if x≠0.

в контексте, где у меня уже есть ограничения, которые подразумевают и 0 ≤ y ≤ 1 .|x|≤1000≤y≤1


(Моя цель - исправить ошибку в https://cs.stackexchange.com/a/12118/755 .)


1
Что вы пробовали? Вы пробовали проработать несколько примеров, чтобы увидеть, видите ли вы образец? Если да, пытались ли вы сделать предположение, а затем попытались доказать это?
— Брика

1
Хех! Я вижу, что ты там сделал , @Brika. Если вам интересно посмотреть, что я попробовал, посмотрите здесь, а также объяснение, почему это было на самом деле неправильно . Если вы хотите увидеть мою следующую попытку, посмотрите мой ответ . Спасибо за чтение моих старых вопросов, и, если они могут быть улучшены в будущем, я хотел бы услышать любые ваши предложения!
— DW

Это очень хорошо. ;)
— Брика

Ответы:


4

Я думаю, что могу сделать это с одной дополнительной двоичной переменной δ∈{0,1} :

−100y≤x≤100y
0.001y−100.001δ≤x≤−0.001y+100.001(1−δ)

Обновить

xx

y−101δ≤x≤−y+101(1−δ)


1
Я подтвердил это, тщательно протестировав его с помощью небольшой программы. Спасибо за решение!
— DW

@ErwinKalvelagen, не могли бы вы объяснить вашу логику с помощью бинарной переменной delta, например, для более общего случая, если y = {a: x> 0, b: x <0}.
— Ник

1
@Nick Бинарная переменная используется для моделирования конструкции «ИЛИ». Смотрите здесь для ответа на ваш вопрос.
— Эрвин Кальвелаген

@ErwinKalvelagen, отличный ответ, я попытался применить ваш подход к моему вопросу здесь. Cs.stackexchange.com/questions/64794/… .
— Ник

1
xx

1

0≤x≤NN=100

  1. 0≤z1,z2,z≤1
  2. x−N(1−z1)≤0
  3. −x−Nz1≤−1
  4. −x−N(1−z2)≤0
  5. x−Nz2≤−1
  6. z1+z2−1≤z
  7. z≤z1
  8. z≤z2

z1=1⟺x≤0z2=1⟺x≥0z=z1∧z2


z=1−yx=100y=1z=0z1,z2x−Nz2≤−1x<Nx≤99x=99y=1y=0x−N≤x≤N0≤x≤N

1

t,ut=1x≥0u=1x≤0y=¬(t∧u)

0≤t,u,y≤11+x≤101t≤101+x1−x≤101u≤101−xt+u−1≤1−y1−y≤t1−y≤u

x≤99x≤100x≥−99

@ TLW, спасибо, что поймали это! Я отредактировал свой ответ, чтобы исправить ошибку. Я исчерпывающе проверил это с помощью небольшой программы и думаю, что сейчас это должно быть правильно.
— DW
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.