Unter der Annahme , ist eine Boolesche Variable in einem Programm ILP (dh , st ) und , begrenzt ist ganzzahlige Variablen zwischen und . Ich möchte die folgende Einschränkung auf hoher Ebene codieren:0 < = y < = 1 x 1 x 2 0 M.
Bisher habe ich folgendes:
Dies erzwingt, dass immer dann muss , wenn wahr ist, sonst gilt die Gleichung nicht. Wenn jedoch ist, schränkt nichts und könnte daher entweder oder . y 1 x 1 ≤ x 2 y 0 1
Welche andere Gleichung könnte ich hinzufügen, um die Einschränkung zu codieren?
integer-programming
Setzer22
quelle
quelle
Antworten:
Sie können dies tun, indem Sie die beiden Ungleichungen einführen
und
Ersteres codiert die Anforderung (Sie können sehen, dass wenn , der Term verschwindet; wenn , dann wird etwas Großes und die Ungleichung wird automatisch erfüllt). Letzteres codiert die Anforderung (aus ähnlichen Gründen). y = 1 M ( 1 - y ) y = 0 M ( 1 - y ) y = 0y=1⟹x1≤x2 y=1 M(1−y) y=0 M(1−y) y=0⟹x1>x2
Hoffentlich gibt Ihnen dies eine Vorstellung davon, wie Sie mit anderen Arten von Implikationen umgehen können, falls sie auftreten sollten. Grundsätzlich multiplizieren Sie mit etwas Großem und addieren / subtrahieren Sie es irgendwo.
quelle
Sie können eine Konstante hinzufügen und dann diese Einschränkung hinzufügen:0<A<M
Wenn ist, bleiben Sie mity=1
Und wenn ist, bleiben Sie mity=0
quelle
Untersuchen Sie Indikator- und SOS-Einschränkungen. Während Sie die Zielbeziehungen linear definieren können, wie in anderen Antworten erläutert, können spezielle Einschränkungen vom IP-Solver effizienter behandelt werden.
Wenn Sie die Einschränkungen direkt implementieren möchten, wie in der anderen Antwort beschrieben, versuchen Sie, das kleinstmögliche M zu verwenden, und ziehen Sie in Betracht, die Integritätstoleranz zu verringern, wenn Ihr Ergebnis nicht korrekt ist. Vermeiden Sie außerdem strenge Ungleichungen, da diese im Kontext der Gleitkomma-Arithmetik nicht eindeutig sind.
Verwenden von Indikatoreinschränkungen:
Die zweite Einschränkung entspricht für ganze Zahlen. Wenn Sie x 2 ≥ x 1 möchten, lassen Sie einfach die 1 fallen.x2>x1 x2≥x1
quelle