Logiczne AND: Użyj więzów liniowych , , , , gdzie jest ograniczone liczbą całkowitą. Wymusza to pożądany związek. (Całkiem fajne, że można to zrobić przy pomocy liniowych nierówności, co?)y1≥x1+x2−1y1≤x1y1≤x20≤y1≤1y1
Logiczne OR: Użyj ograniczeń liniowych , , , , gdzie jest ograniczone liczbą całkowitą.y2≤x1+x2y2≥x1y2≥x20≤y2≤1y2
Logiczne NOT: Użyj .y3=1−x1
Implikacja logiczna: Aby wyrazić (tj. ), możemy dostosować konstrukcję do logicznego OR. W szczególności użyj wiązań liniowych , , , , gdzie jest ograniczone liczbą całkowitą.y4=(x1⇒x2)y4=¬x1∨x2y4≤1−x1+x2y4≥1−x1y4≥x20≤y4≤1y4
Wymuszona implikacja logiczna: Aby wyrazić, że musi zostać utrzymany, po prostu użyj ograniczenia liniowego (zakładając, że i są już ograniczone do wartości boolowskich).x1⇒x2x1≤x2x1x2
XOR: Aby wyrazić (wyłączne lub z i ), użyj nierówności liniowych , , , , , gdzie jest ograniczone do liczby całkowitej.y5=x1⊕x2x1x2y5≤x1+x2y5≥x1−x2y5≥x2−x1y5≤2−x1−x20≤y5≤1y5
Jako bonus, jeszcze jedna technika, która często pomaga przy formułowaniu problemów, które zawierają mieszankę zmiennych zerowych (boolowskich) i zmiennych całkowitych:
Rzut na boolean (wersja 1): Załóżmy, że masz zmienną całkowitą i chcesz zdefiniować , aby jeśli i jeśli . Jeśli dodatkowo wiesz, że , możesz użyć nierówności liniowych , , ; Działa to jednak tylko wtedy, gdy znasz górną i dolną granicę . Lub, jeśli wiesz, że (czyli ) dla jakiegoś stałego , wtedy możesz użyć metody opisanej tutajxyy=1x≠0y=0x=00≤x≤U0≤y≤1y≤xx≤Uyx|x|≤U−U≤x≤UU. Ma to zastosowanie tylko, jeśli znasz górną granicę.|x|
Rzuć na boolean (wersja 2): Rozważmy ten sam cel, ale teraz nie znamy górnej granicy . Załóżmy jednak, że wiemy, że . Oto, w jaki sposób możesz wyrazić to ograniczenie w systemie liniowym. Najpierw wprowadź nową zmienną całkowitą . Dodaj nierówności , , . Następnie wybierz funkcję celu, aby zminimalizować . Działa to tylko wtedy, gdy nie masz jeszcze funkcji celu. Jeśli masz nieujemnych zmiennych całkowitych i chcesz rzutować wszystkie z nich na booleany, tak aby jeślixx≥0t0≤y≤1y≤xt=x−ytnx1,…,xnyi=1xi≥1 i jeśli , to możesz wprowadzić zmiennych z nierównościami , , i zdefiniować funkcję celu aby zminimalizować . Ponownie, to działa tylko nic innego, nie trzeba definiować funkcji celu (jeśli oprócz rzutów na wartość logiczną planujesz po prostu sprawdzić wykonalność wynikowej ILP, nie próbuj minimalizować / maksymalizować niektórych funkcji zmiennych).yi=0xi=0nt1,…,tn0≤yi≤1yi≤xiti=xi−yit1+⋯+tn
W przypadku problemów z doskonałą praktyką i sprawdzonych przykładów polecam Formułowanie całkowitych programów liniowych: Galeria Rogue'a .
Logiczną relację AND można modelować w jednym ograniczeniu zakresu zamiast w trzech ograniczeniach (jak w drugim rozwiązaniu). Więc zamiast trzech ograniczeń można go zapisać za pomocą ograniczenia pojedynczego zakresu Podobnie w przypadku logicznego OR:
NIE, nie ma takiej poprawy.
Ogólnie dla ( -way AND) ograniczenie będzie wynosić: Podobnie dla OR:y=x1∧x2∧⋯∧xn n
źródło
Znalazłem krótsze rozwiązanie dla XOR y = x1⊕x2 (xiy są binarne 0, 1)
tylko jedna linia: x1 + x2 - 2 * z = y (z jest dowolną liczbą całkowitą)
źródło