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


58

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

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

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

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

Ответы:


66

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

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

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

y4=(x1⇒x2)y4=¬x1∨x2y4≤1−x1+x2y4≥1−x1y4≥x20≤y4≤1y4

x1⇒x2x1≤x2x1x2

y5=x1⊕x2x1x2y5≤x1+x2y5≥x1−x2y5≥x2−x1y5≤2−x1−x20≤y5≤1y5


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

xyy=1x≠0y=0x=00≤x≤U0≤y≤1y≤xx≤Uyx|x|≤U−U≤x≤UU|x|

xx≥0t0≤y≤1y≤xt=x−ytnx1,…,xnyi=1xi≥1yi=0xi=0nt1,…,tn0≤yi≤1yi≤xiti=xi−yit1+⋯+tn


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


Какой решатель линейного программирования может решить эту проблему? поскольку в формате * .lp или * .mps одна сторона ограничения должна быть фиксированным целым числом, а не переменной.
— boxi

4
x≤yy−x≥0

-Я проверил это снова. lp_solve может решить эту проблему, но, например, qsopt не может. я не знаю почему но спасибо <3
— boxi

x≤yx−y≤0

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

19

y1≥x1+x2−1,y1≤x1,y1≤x2,
0≤x1+x2−2y1≤1.
0≤2y1−x1−x2≤1.

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

y=x1∧x2∧⋯∧xnn

0≤∑xi−ny≤n−1.
0≤ny−∑xi≤n−1.

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

3

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

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


x1=1,x2=0,z=200,y=−1990≤y≤1

≠b
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.