Ekspresowe operacje logiczne typu boolowskiego w programowaniu liniowym całkowitym zero-jeden (ILP)


58

Mam całkowity program liniowy (ILP) z niektórymi zmiennymi które mają reprezentować wartości boolowskie. Wartości muszą być liczbami całkowitymi i zawierać 0 lub 1 ( ).xixi0≤xi≤1

Chcę wyrazić operacje boolowskie na tych zmiennych o wartości 0/1, używając ograniczeń liniowych. Jak mogę to zrobić?

Mówiąc dokładniej, chcę ustawić (boolean AND), (boolean OR), a (boolean NOT). Używam oczywistej interpretacji 0/1 jako wartości boolowskich: 0 = fałsz, 1 = prawda. Jak napisać ograniczenia ILP, aby upewnić się, że są odpowiednio powiązane z ?y1=x1∧x2y2=x1∨x2y3=¬x1yixi

(Może to być postrzegane jako prośba o redukcję z CircuitSAT do ILP lub prośba o sposób wyrażenia SAT jako ILP, ale tutaj chcę zobaczyć wyraźny sposób kodowania operacji logicznych pokazanych powyżej.)

Odpowiedzi:


66

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 .


który solver programowania liniowego może to rozwiązać? ponieważ w formacie * .lp lub * .mps jedna strona ograniczenia musi być stałą liczbą całkowitą, a nie zmienną.
— boxi

4
@boxi, nie wiem nic o formacie * .lp lub * .mps, ale każdy solver programowania liniowego powinien być w stanie to rozwiązać. Zauważ, że jeśli masz coś takiego jak , jest to równoważne , który może być w żądanym formacie. x≤yy−x≥0
— DW

-i sprawdził to ponownie. lp_solve może to rozwiązać, ale na przykład qsopt nie. nie wiem dlaczego. ale dzięki <3
— boxi

@boxi, właśnie sprawdziłem graficzny interfejs użytkownika apletu QSopt i może on obsłużyć tego rodzaju ograniczenia po zmianie na , więc nie jestem pewien, co się dzieje. (Użyłem formatu * .lp.) Byłbym zaskoczony, gdyby jakikolwiek solver ILP nie był w stanie obsłużyć tych systemów. Jeśli masz dodatkowe pytania dotyczące QSopt, prawdopodobnie powinieneś je zabrać na fora wsparcia QSopt. x≤yx−y≤0
— DW

1
@Pramod, dobry połów! Dziękujemy za wykrycie tego błędu. Masz całkowitą rację. Zadałem nowe pytanie, w jaki sposób modelować tę skrzynkę, i zaktualizuję tę odpowiedź, gdy otrzymamy odpowiedź na to.
— DW

19

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:

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

NIE, nie ma takiej poprawy.

Ogólnie dla ( -way AND) ograniczenie będzie wynosić: Podobnie dla OR: y=x1∧x2∧⋯∧xnn

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

Bardzo podobne podejście znajduje się w tym dokumencie: ncbi.nlm.nih.gov/pmc/articles/PMC1865583
— Abdelmonem Mahmoud Amer

3

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ą)


Aby wyrazić równość w ILP, potrzebujesz dwóch nierówności. Ponadto, aby uniknąć rozwiązania , potrzebujesz jeszcze dwóch nierówności, . Ta odpowiedź ma cztery nierówności i dodatkową zmienną w porównaniu do sześciu nierówności w odpowiedzi DW. x1=1,x2=0,z=200,y=−1990≤y≤1
— JiK

Aby wyrazić równość w ILP wystarczy tylko jedno równanie, dotyczy to zarówno teorii LP, jak i oprogramowania takiego jak Gurobi lub CPLEX. @jk, myślę, że masz na myśli, że „wyrażanie” a ”wymaga dwóch nierówności.”≠b
— whitegreen 18.01.18
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.