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


58

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

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

Більш конкретно, я хочу встановити (булева І), (булева АБО) та (булева НЕ). Я використовую очевидну інтерпретацію 0/1 як булеві значення: 0 = хибно, 1 = істинно. Як мені написати обмеження ILP, щоб переконатися, що пов'язані з бажанням ?y 2 = x 1 ∨ x 2 y 3 = ¬ x 1 y i x iy1=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∨x2 ), ми можемо адаптувати побудову для логічного АБО. Зокрема, використовуйте лінійні обмеження y4≤1−x1+x2 , y4≥1−x1 , y4≥x2 , 0≤y4≤1 , деy4 обмежене цілим числом.

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

XOR: Щоб виразити y5=x1⊕x2 (виключне або x1 і x2 ), використовуйте лінійні нерівності y5≤x1+x2 , y5≥x1−x2 , y5≥x2−x1 , y5≤2−x1−x2 , 0≤y5≤1 , деy5 обмежене цілим числом.


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

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

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


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


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

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

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

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

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

19

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

y1≥x1+x2−1,y1≤x1,y1≤x2,
Аналогічно для логічного АБО: 0 ≤ 2 y 1 - x 1 - x 2 ≤ 1
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
— 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=−1990≤y≤1

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