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


11

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

y={0if x=01if x0.

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

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

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

y0 if and only if x0.

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


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


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

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

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

Ответы:


4

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

100yx100y
0.001y100.001δx0.001y+100.001(1δ)

Обновить

xx

y101δxy+101(1δ)


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

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

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

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

1
xx

1

0xNN=100

  1. 0z1,z2,z1
  2. xN(1z1)0
  3. xNz11
  4. xN(1z2)0
  5. xNz21
  6. z1+z21z
  7. zz1
  8. zz2

z1=1x0z2=1x0z=z1z2


z=1yx=100y=1z=0z1,z2xNz21x<Nx99x=99y=1y=0xNxN0xN

1

t,ut=1x0u=1x0y=¬(tu)

0t,u,y11+x101t101+x1x101u101xt+u11y1yt1yu

x99x100x99

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