Logisches UND: Verwenden Sie die linearen Bedingungen , , , , wobei eine ganze Zahl sein muss. Dies erzwingt die gewünschte Beziehung. (Ziemlich gut, dass man das mit linearen Ungleichungen machen kann, oder?)y1≥x1+x2−1y1≤x1y1≤x20≤y1≤1y1
Logisches ODER: Verwenden Sie die linearen Bedingungen , , , , wobei eine ganze Zahl sein muss.y2≤x1+x2y2≥x1y2≥x20≤y2≤1y2
Logisches NICHT: Verwenden Sie .y3=1−x1
Logische Implikation: Um (dh ) , können wir die Konstruktion für das logische ODER anpassen. Verwenden Sie insbesondere die linearen Bedingungen , , , , wobei eine ganze Zahl sein muss.y4=(x1⇒x2)y4=¬x1∨x2y4≤1−x1+x2y4≥1−x1y4≥x20≤y4≤1y4
Forcierte logische Implikation: Um auszudrücken, dass muss, verwenden Sie einfach die lineare Einschränkung (unter der Annahme, dass und bereits auf boolesche Werte beschränkt sind).x1⇒x2x1≤x2x1x2
XOR: Um (das Exklusiv-Oder von und ) , verwenden Sie lineare Ungleichungen , , , , , wobei eine ganze Zahl sein muss.y5=x1⊕x2x1x2y5≤x1+x2y5≥x1−x2y5≥x2−x1y5≤2−x1−x20≤y5≤1y5
Und als Bonus eine weitere Technik, die oft hilft, wenn Probleme formuliert werden, die eine Mischung aus null-eins (booleschen) Variablen und ganzzahligen Variablen enthalten:
Umwandlung in Boolean (Version 1): Angenommen, Sie haben eine Ganzzahlvariable und möchten so definieren , dass wenn und wenn . Wenn Sie zusätzlich wissen, dass , können Sie die linearen Ungleichungen , , ; Dies funktioniert jedoch nur, wenn Sie eine Ober- und Untergrenze für . Oder, wenn Sie das wissen ( ) für eine Konstante , dann können Sie die hier beschriebene Methode verwendenxyy=1x≠0y=0x=00≤x≤U0≤y≤1y≤xx≤Uyx|x|≤U−U≤x≤UU. Dies gilt nur, wenn Sie eine Obergrenze für.|x|
Cast to Boolean (Version 2): Betrachten wir dasselbe Ziel, aber jetzt kennen wir keine Obergrenze für . Nehmen wir jedoch an, wir wissen, dass . Hier erfahren Sie, wie Sie diese Einschränkung in einem linearen System ausdrücken können. Führen Sie zunächst eine neue Ganzzahlvariable . Addiere Ungleichungen , , . Wählen Sie dann die Zielfunktion, damit Sie minimieren . Dies funktioniert nur, wenn Sie noch keine objektive Funktion hatten. Wenn Sie nicht negative Ganzzahlvariablen und alle in boolesche Werte umwandeln möchten, ist wennxx≥0t0≤y≤1y≤xt=x−ytnx1,…,xnyi=1xi≥1 und wenn , dann können Sie Variablen mit Ungleichungen , , und die Zielfunktion definieren um zu minimieren . Dies funktioniert wiederum nur, wenn nichts anderes erforderlich ist, um eine Zielfunktion zu definieren (außer wenn Sie die Machbarkeit des resultierenden ILP auf Boolesche Werte überprüfen und nicht versuchen, eine Funktion der Variablen zu minimieren / maximieren).yi=0xi=0nt1,…,tn0≤yi≤1yi≤xiti=xi−yit1+⋯+tn
Für einige exzellente Übungsaufgaben und Beispiele empfehle ich die Formulierung ganzzahliger linearer Programme: A Rogues 'Gallery .
Die logische UND-Beziehung kann in einer Bereichsbedingung anstelle von drei Bedingungen (wie in der anderen Lösung) modelliert werden . Anstelle der drei Bedingungen kann die einzige Bereichsbedingung In ähnlicher Weise gilt für logisches ODER:
Für NOT ist keine solche Verbesserung verfügbar.
Im Allgemeinen ist für ( Wege-UND) die Einschränkung: Ähnliches gilt für OR: n 0 ≤ & Sigma; x i - n y ≤ n - 1y=x1∧x2∧⋯∧xn n 0 ≤ n y - Σ x i ≤ n - 1
quelle
Ich habe eine kürzere Lösung für XOR y = x1⊕x2 gefunden (x und y sind binär 0, 1)
nur eine Zeile: x1 + x2 - 2 * z = y (z ist eine beliebige ganze Zahl)
quelle