Экспресс булевых логических операций в целочисленном линейном программировании (ILP)

58

У меня есть целочисленная линейная программа (ILP) с некоторыми переменными , которые предназначены для представления логических значений. В х I «ы ограничены целыми числами и держать либо 0 или 1 ( 0 х я1 ).xixi0xi1

Я хочу выразить логические операции над этими 0/1-значными переменными, используя линейные ограничения. Как я могу это сделать?

Более конкретно, я хочу установить (логическое И), у 2 = х 1х 2 (логическое ИЛИ), и у 3 = ¬ х 1 (логическое НЕ). Я использую очевидную интерпретацию 0/1 как логические значения: 0 = ложь, 1 = истина. Как мне написать ограничения ILP, чтобы гарантировать, что y i связаны с x i по желанию?y1=x1x2y2=x1x2y3=¬x1yixi

(Это можно рассматривать как запрос на сокращение от CircuitSAT до ILP или запрос на способ выразить SAT как ILP, но здесь я хочу увидеть явный способ кодирования логических операций, показанных выше.)

DW
источник

Ответы:

66

Логическое И: Используйте линейные ограничения y1x1+x21 , y1x1 , y1x2 , 0y11 , где y1 ограничено целым числом. Это навязывает желаемые отношения. (Довольно здорово, что вы можете сделать это с помощью линейных неравенств, а?)

Логическое ИЛИ: Используйте линейные ограничения y2x1+x2 , y2x1 , y2x2 , 0y21 , где y2 ограничено целым числом.

Логическое НЕ: используйте y3=1x1 .

y4=(x1x2)y4=¬x1x2y41x1+x2y41x1y4x20y41y4

x1x2x1x2x1x2

y5=x1x2x1x2y5x1+x2y5x1x2y5x2x1y52x1x20y51y5


И, в качестве бонуса, еще один метод, который часто помогает при формулировании задач, которые содержат смесь нулевых (булевых) переменных и целочисленных переменных:

xyy=1x0y=0x=00xU0y1yxxUyx|x|UUxUU|x|

xx0t0y1yxt=xytnx1,,xnyi=1xi1yi=0xi=0nt1,,tn0yi1yixiti=xiyit1++tn


Для некоторых отличных практических задач и проработанных примеров я рекомендую формулировать целочисленные линейные программы: A Rogues 'Gallery .

DW
источник
Какой решатель линейного программирования может решить эту проблему? поскольку в формате * .lp или * .mps одна сторона ограничения должна быть фиксированным целым числом, а не переменной.
boxi
4
xyyx0
-Я проверил это снова. lp_solve может решить эту проблему, но, например, qsopt не может. я не знаю почему но спасибо <3
boxi
xyxy0
1
@Pramod, хороший улов! Спасибо, что обнаружили эту ошибку. Вы совершенно правы. Я задал новый вопрос о том, как смоделировать этот случай, и я обновлю этот ответ, когда мы получим ответ на этот вопрос.
DW
19

y1x1+x21,y1x1,y1x2,
0x1+x22y11.
02y1x1x21.

Для НЕ, такое улучшение не доступно.

y=x1x2xnn

0xinyn1.
0nyxin1.
Абдельмонем Махмуд Амер
источник
В этой статье очень похожий подход: ncbi.nlm.nih.gov/pmc/articles/PMC1865583
Абдельмонем Махмуд Амер
3

Я нашел более короткое решение для XOR y = x1⊕x2 (x и y двоичные 0, 1)

только одна строка: x1 + x2 - 2 * z = y (z - любое целое число)

Bysmyyr
источник
x1=1,x2=0,z=200,y=1990y1
b