Einführung
Schreiben Sie einen Löser für die ganzzahlige lineare Programmierung .
Herausforderung
Ihre Aufgabe ist es, einen Löser für die ganzzahlige lineare Programmierung (ILP) zu schreiben. In ILP werden lineare Ungleichungen einer Menge von Unbekannten (von denen alle ganze Zahlen sind) angegeben, und das Ziel besteht darin, das Minimum oder Maximum einer linearen Funktion zu finden.
Zum Beispiel für die Ungleichungen (Beispiel aus Mixed Integer Linear Programming )
4x+2y-15≤0
x+2y- 8≤0
x+ y- 5≤0
- x ≤0
- y ≤0
und die Zielfunktion 3x+2y
sollte das Maximum der Zielfunktion 12
( x=2,y=3
) sein, während das Minimum 0
( x=y=0
) sein sollte.
Die Eingabe wird als 2d-Array (oder ein beliebiges Äquivalent gemäß den Standardspezifikationen) angegeben. Jede Zeile entspricht einer Ungleichung, mit Ausnahme der letzten Zeile. Die Zahlen im Array sind die Koeffizienten, und der ≤0
Teil wird immer weggelassen. Wenn sich n
in jeder Zeile Elemente befinden , bedeutet dies, dass n-1
Unbekanntes vorhanden ist.
Die letzte Zeile des Arrays entspricht der linearen Funktion. Die Koeffizienten werden aufgelistet.
Beispielsweise ist das Eingabearray für das obige Problem
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,0]].
Die Ausgabe sollte das Minimum und das Maximum sein, die in einer angemessenen Form angegeben werden.
Für das folgende Problem (zwei der Einschränkungen werden aus dem obigen Problem entfernt):
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]].
Das Maximum ist noch 12
, aber das Minimum existiert nicht und die Zielfunktion kann beliebig große (im Sinne des Absolutwertes) negative Werte haben. In diesem Fall sollte das Programm 12
einen falschen Wert ausgeben , der vom Antwortenden festgelegt wird. Ein anderer Fall ist, dass es überhaupt keine Lösung gibt, zum Beispiel
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]].
In diesem Fall sollten auch falsche Werte ausgegeben werden. Es wäre schön, den Fall zu unterscheiden, in dem der "optimale Wert" für die Zielfunktion unendlich ist, und den Fall, in dem es überhaupt keine Lösungen gibt, dies jedoch nicht erforderlich ist.
Die Eingabe enthält nur ganzzahlige Koeffizienten sowohl für die Ungleichungen als auch für die Zielfunktion. Alle Unbekannten sind auch ganze Zahlen. Die Koeffizientenmatrix der Ungleichungen hat garantiert den vollen Rang.
Testfälle
Dank an @KirillL. um einen Fehler in der ursprünglichen Testsuite zu finden und mein Verständnis für ILP-Probleme zu vertiefen.
Input
Output
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,1]]
[1,13]
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]]
[-inf, 12]
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]]
[NaN, NaN]
[[-1,-1,-1,-1,-1,8],[1,1,1,1,0,0],[5,5,5,5,6,7]]
[55, inf]
[[-1,-1,-1,-1,-1,8],[1,1,1,1,0,0],[0,0,0,0,0,4]]
[4, 4]
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[0,0,4]]
[NaN, NaN]
Technische Daten
Sie müssen sich keine Sorgen um die Ausnahmebehandlung machen.
Dies ist Code-Golf , die niedrigste Anzahl von Bytes gewinnt.
Maximale Anzahl der Unbekannten:
9
. Die maximale Anzahl von Ungleichheiten:12
.Sie können Eingaben und Ausgaben über jedes Standardformular vornehmen und das Format frei wählen.
Wie üblich gelten hier Standardlücken .
quelle
Antworten:
Python 3 , 534 Bytes
Probieren Sie es online!
Überblick
Es ist ein iterativer Algorithmus, der vom Origo ausgeht. Es sammelt die Nachbarpositionen und weist eine mögliche Funktion zu:
x:(a,b)
Wox
ist die Position,a
ist die Summe der Abstände der Position von den Halbräumen jeder linearen Ungleichung,b
ist der Wert des Ziels an dieser Position.x:(a,b) < y:(c,d)
iffa<c
odera=c and b<d
Die Iteration stoppt, wenn:
quelle
Matlab, 226 Bytes
HAFTUNGSAUSSCHLUSS : Keine "originelle" Implementierung, nur zum Spaß.
Einfache Lösung unter Ausnutzung der
intlinprog
Funktion:Es gibt die optimalen Werte zurück oder inf (-inf), wenn das Problem unbegrenzt ist, oder nan, wenn es nicht durchführbar ist.
quelle