Експресувати булеві логічні операції в лінійному програмуванні нульового цілого цілого (ILP)


58

У мене є ціла лінійна програма (ILP) з деякими змінними , які призначені для відображення булевих значень. S »обмежені цілими числами і тримати або 0 , або 1 ( ).x i 0 x i1xixi0xi1

Я хочу висловити булеві операції на цих змінних 0/1, використовуючи лінійні обмеження. Як я можу це зробити?

Більш конкретно, я хочу встановити (булева І), (булева АБО) та (булева НЕ). Я використовую очевидну інтерпретацію 0/1 як булеві значення: 0 = хибно, 1 = істинно. Як мені написати обмеження ILP, щоб переконатися, що пов'язані з бажанням ?y 2 = x 1x 2 y 3 = ¬ x 1 y i x iy1=x1x2y2=x1x2y3=¬x1yixi

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

Відповіді:


66

Логічні І: Використовуйте лінійні обмеження y1x1+x21 , y1x1 , y1x2 , 0y11 , де y1 обмежено цілим числом. Це нав'язує бажані відносини. (Досить акуратно, що ви можете це зробити з просто лінійними нерівностями, так?)

Логічні АБО: Використовуйте лінійні обмеження y2x1+x2 , y2x1 , y2x2 , 0y21 , де y2 обмежене цілим числом.

Логічний НЕ: Використовуйте y3=1x1 .

Логічне значення: Щоб виразити y4=(x1x2) (тобто, y4=¬x1x2 ), ми можемо адаптувати побудову для логічного АБО. Зокрема, використовуйте лінійні обмеження y41x1+x2 , y41x1 , y4x2 , 0y41 , деy4 обмежене цілим числом.

Вимушене логічне значення: Щоб виразити, що x1x2 має виконуватися, просто використовуйте лінійне обмеження x1x2 (припускаючи, що x1 і x2 вже обмежені булевими значеннями).

XOR: Щоб виразити y5=x1x2 (виключне або x1 і x2 ), використовуйте лінійні нерівності y5x1+x2 , y5x1x2 , y5x2x1 , y52x1x2 , 0y51 , деy5 обмежене цілим числом.


І, як бонус, ще одна методика, яка часто допомагає формулювати проблеми, що містять суміш нульових (булевих) змінних і цілих змінних:

Передача на булеву (версія 1): Припустимо, у вас є ціла змінна x , і ви хочете визначити y так, що y=1 якщо x0 і y=0 якщо x=0 . Якщо ви додатково знаєте, що 0xU , то ви можете використовувати лінійні нерівності 0y1 , yx , xUy ; однак це працює лише у тому випадку, якщо ви знаєте верхню та нижню межіx . Або, якщо ви знаєте, що|x|U (тобтоUxU ) для деякої постійноїU , тоді можна використовувати описанийтутметод. Це застосовується лише в тому випадку, якщо ви знаєте верхню межу на|x|.

У ролях булевих (версія 2): Розглянемо ту саму мету, але тепер ми не знаємо верхньої межі на x . Однак припустимо, що ми знаємо, що x0 . Ось як ви могли б висловити це обмеження в лінійній системі. Спочатку введіть нову цілу змінну t . Додайте нерівності 0y1 , yx , t=xy . Потім виберіть цільову функцію, щоб ви мінімізували t . Це працює лише в тому випадку, якщо ви ще не мали об'єктивної функції. Якщо у вас є nневід’ємні цілі змінні x1,,xn і ви хочете передати їх всім булевим, так що yi=1 якщо xi1 і yi=0 якщо xi=0 , то ви можете ввести n змінні t1,,tn з нерівностями 0yi1 , yixi ,ti=xiyi і визначити цільову функцію для мінімізаціїt1++tn . Знову ж таки, це працює лише, інакше не потрібно визначати об'єктивну функцію (якщо, окрім залишків булевих, ви планували просто перевірити доцільність результуючого ILP, а не намагатися мінімізувати / максимізувати деяку функцію змінних).


Для деяких відмінних проблем з практикою та прикладів роботи я рекомендую формувати цілісні лінійні програми: Галерея шахраїв .


який лінійний програміст може вирішити це? тому що у форматі * .lp або * .mps одна сторона обмеження має бути фіксованим цілим числом, а не змінною.
boxi

4
@boxi, я нічого не знаю про формат * .lp або * .mps, але кожен цілочисельний лінійний програміст повинен вирішити це. Зауважте, що якщо у вас є щось на кшталт , це еквівалентно y - x 0 , що може бути у бажаному форматі. xyyx0
DW

-Я ще раз перевірив. lp_solve може вирішити це, але, наприклад, qsopt не може. я не знаю чому. але дякую <3
boxi

@boxi, я щойно перевірив інтерфейс інтерфейсу інтерфейсу QSopt, і він міг обробляти такі обмеження, як тільки я змінив на x - y 0 , тому я не впевнений, що відбувається. (Я використовував формат * .lp.) Я був би здивований, якби будь-який вирішувач ILP не зміг обробити ці системи. Якщо у вас є додаткові запитання щодо QSopt, ви, ймовірно, перенесіть їх на форуми підтримки QSopt. xyxy0
DW

1
@Pramod, хороший улов! Дякуємо, що помітили цю помилку. Ви абсолютно праві. Я задав нове запитання про те, як моделювати цей випадок, і я оновлю цю відповідь, коли отримаю відповідь на цю справу.
DW

19

Логічне відношення AND може моделюватися в одному обмеженні діапазону замість трьох обмежень (як в іншому рішенні). Тож замість трьох обмежень його можна записати, використовуючи обмеження для одного діапазону 0 x 1 + x 2 - 2 y 11

y1x1+x21,y1x1,y1x2,
Аналогічно для логічного АБО: 0 2 y 1 - x 1 - x 21
0x1+x22y11.
02y1x1x21.

ДЛЯ НЕ, такого покращення немає.

y=x1x2xnn

0xinyn1.
0nyxin1.

Дуже подібний підхід є у цій роботі: ncbi.nlm.nih.gov/pmc/articles/PMC1865583
Abdelmonem Mahmoud Amer

3

Я знайшов коротший розв’язок для XOR y = x1⊕x2 (x і y - двійкові 0, 1)

лише один рядок: x1 + x2 - 2 * z = y (z - будь-яке ціле число)


x1=1,x2=0,z=200,y=1990y1

b
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.