Логічні І: Використовуйте лінійні обмеження y1≥x1+x2−1 , y1≤x1 , у1≤ x2 , 0 ≤ y1≤ 1 , де у1 обмежено цілим числом. Це нав'язує бажані відносини. (Досить акуратно, що ви можете це зробити з просто лінійними нерівностями, так?)
Логічні АБО: Використовуйте лінійні обмеження у2≤ x1+ х2 , у2≥ x1 , у2≥ x2 , 0 ≤ y2≤ 1 , де у2 обмежене цілим числом.
Логічний НЕ: Використовуйте у3= 1 - х1 .
Логічне значення: Щоб виразити у4= ( х1⇒ x2) (тобто, у4= ¬ х1∨ x2 ), ми можемо адаптувати побудову для логічного АБО. Зокрема, використовуйте лінійні обмеження у4≤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, а не намагатися мінімізувати / максимізувати деяку функцію змінних).
Для деяких відмінних проблем з практикою та прикладів роботи я рекомендую формувати цілісні лінійні програми: Галерея шахраїв .