linprog(method=’interior-point’)#
- scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=(0, None), method='highs', callback=None, options=None, x0=None, integrality=None)
Lineare Programmierung: Minimieren einer linearen Zielfunktion unter linearen Gleichheits- und Ungleichheitsnebenbedingungen mit der Interior-Point-Methode von [4].
Veraltet seit Version 1.9.0: method=’interior-point’ wird in SciPy 1.11.0 entfernt. Sie wird durch method=’highs’ ersetzt, da letztere schneller und robuster ist.
Lineare Programmierung löst Probleme der folgenden Form
\[\begin{split}\min_x \ & c^T x \\ \mbox{so dass} \ & A_{ub} x \leq b_{ub},\\ & A_{eq} x = b_{eq},\\ & l \leq x \leq u ,\end{split}\]wobei \(x\) ein Vektor von Entscheidungsvariablen ist; \(c\), \(b_{ub}\), \(b_{eq}\), \(l\) und \(u\) Vektoren sind; und \(A_{ub}\) und \(A_{eq}\) Matrizen sind.
Alternativ, das heißt
minimieren
c @ x
so dass
A_ub @ x <= b_ub A_eq @ x == b_eq lb <= x <= ub
Beachten Sie, dass standardmäßig
lb = 0undub = Nonegilt, es sei denn, dies wird mitboundsangegeben.- Parameter:
- c1-D-Array
Die Koeffizienten der linearen Zielfunktion, die minimiert werden soll.
- A_ub2-D-Array, optional
Die Matrix der Ungleichheitsbedingungen. Jede Zeile von
A_ubgibt die Koeffizienten einer linearen Ungleichheitsbedingung fürxan.- b_ub1-D-Array, optional
Der Vektor der Ungleichheitsbedingungen. Jedes Element stellt eine Obergrenze für den entsprechenden Wert von
A_ub @ xdar.- A_eq2-D-Array, optional
Die Matrix der Gleichheitsbedingungen. Jede Zeile von
A_eqgibt die Koeffizienten einer linearen Gleichheitsbedingung fürxan.- b_eq1-D-Array, optional
Der Vektor der Gleichheitsbedingungen. Jedes Element von
A_eq @ xmuss gleich dem entsprechenden Element vonb_eqsein.- boundsSequenz, optional
Eine Sequenz von
(min, max)-Paaren für jedes Element inx, die die minimale und maximale Wert dieser Entscheidungsvariablen definieren. Verwenden SieNone, um anzuzeigen, dass keine Grenze existiert. Standardmäßig sind die Grenzen(0, None)(alle Entscheidungsvariablen sind nicht-negativ). Wenn ein einzelnes Tupel(min, max)bereitgestellt wird, dienenminundmaxals Grenzen für alle Entscheidungsvariablen.- methodstr
Dies ist die methodenspezifische Dokumentation für ‘interior-point’. ‘highs’, ‘highs-ds’, ‘highs-ipm’, ‘revised simplex’ und ‘simplex’ (Legacy) sind ebenfalls verfügbar.
- callbackcallable, optional
Callback-Funktion, die einmal pro Iteration ausgeführt werden soll.
- Rückgabe:
- resOptimizeResult
Ein
scipy.optimize.OptimizeResultmit den Feldern- x1-D-Array
Die Werte der Entscheidungsvariablen, die die Zielfunktion minimieren und gleichzeitig die Bedingungen erfüllen.
- funfloat
Der optimale Wert der Zielfunktion
c @ x.- slack1-D-Array
Die (nominal positiven) Werte der Schlupfvariablen,
b_ub - A_ub @ x.- con1-D-Array
Die (nominal nullen) Residuen der Gleichheitsbedingungen,
b_eq - A_eq @ x.- successbool
True, wenn der Algorithmus erfolgreich eine optimale Lösung findet.- statusint
Eine Ganzzahl, die den Exit-Status des Algorithmus darstellt.
0: Optimierung erfolgreich abgeschlossen.1: Iterationslimit erreicht.2: Problem scheint unzulässig zu sein.3: Problem scheint unbeschränkt zu sein.4: Numerische Schwierigkeiten aufgetreten.- messagestr
Eine Zeichenkette, die den Beendigungsstatus des Algorithmus beschreibt.
- nitint
Die Gesamtzahl der Iterationen in allen Phasen.
Siehe auch
Die Dokumentation für die restlichen Parameter finden Sie unter
scipy.optimize.linprog- Optionen:
- ——-
- maxiterint (Standard: 1000)
Die maximale Anzahl von Iterationen des Algorithmus.
- dispbool (Standard: False)
Auf
Truesetzen, wenn Indikatoren des Optimierungsstatus bei jeder Iteration auf der Konsole ausgegeben werden sollen.- presolvebool (Standard: True)
Presolve versucht, triviale Unzulässigkeiten zu identifizieren, triviale Unbeschränktheit zu erkennen und das Problem zu vereinfachen, bevor es an den Hauptlöser übergeben wird. Es wird generell empfohlen, die Standardeinstellung
Truebeizubehalten. Setzen Sie aufFalse, wenn Presolve deaktiviert werden soll.- tolfloat (Standard: 1e-8)
Abbruchtoleranz, die für alle Abbruchkriterien verwendet werden soll; siehe [4] Abschnitt 4.5.
- autoscalebool (Standard: False)
Auf
Truesetzen, um eine automatische Äquilibrierung durchzuführen. Erwägen Sie die Verwendung dieser Option, wenn die numerischen Werte in den Bedingungen um mehrere Größenordnungen voneinander abweichen.- rrbool (Standard: True)
Auf
Falsesetzen, um die automatische Entfernung redundanter Gleichungen zu deaktivieren.- alpha0float (Standard: 0.99995)
Die maximale Schrittgröße für die Vorhersage-Korrektur-Suchrichtung von Mehrota; siehe \(\beta_{3}\) in [4] Tabelle 8.1.
- betafloat (Standard: 0.1)
Die gewünschte Reduzierung des Pfadparameters \(\mu\) (siehe [6]), wenn die Vorhersage-Korrektur von Mehrota nicht verwendet wird (unüblich).
- sparsebool (Standard: False)
Auf
Truesetzen, wenn das Problem nach der Voreingrenzung als dünn (sparse) behandelt werden soll. Wenn entwederA_eqoderA_ubdünn ist, wird diese Option automatisch aufTruegesetzt, und das Problem wird auch während der Voreingrenzung als dünn behandelt. Wenn Ihre Nebenbedinungsmatrizen hauptsächlich Nullen enthalten und das Problem nicht sehr klein ist (weniger als etwa 100 Nebenbedingungen oder Variablen), sollten Sie erwägen,Truezu setzen oderA_equndA_ubals dünne Arrays bereitzustellen.- lstsqbool (Standard:
False) Auf
Truesetzen, wenn das Problem als sehr schlecht konditioniert erwartet wird. Dies sollte immer aufFalsebelassen werden, es sei denn, es treten schwere numerische Schwierigkeiten auf. Lassen Sie dies beim Standardwert, es sei denn, Sie erhalten eine Warnmeldung, die darauf hindeutet.- sym_posbool (Standard: True)
Auf
Truebelassen, wenn die Normalgleichungsmatrix als gut konditionierte symmetrische positiv definite Matrix erwartet wird (fast immer). Lassen Sie dies beim Standardwert, es sei denn, Sie erhalten eine Warnmeldung, die darauf hindeutet.- choleskybool (Standard: True)
Auf
Truesetzen, wenn die Normalgleichungen durch explizite Cholesky-Zerlegung gefolgt von expliziter Vorwärts-/Rückwärtssubstitution gelöst werden sollen. Dies ist typischerweise schneller für numerisch gutartige Probleme.- pcbool (Standard: True)
Auf
Truebelassen, wenn die Vorhersage-Korrektur-Methode von Mehrota verwendet werden soll. Dies ist fast immer (wenn nicht immer) vorteilhaft.- ipbool (Standard: False)
Auf
Truesetzen, wenn der verbesserte Startpunktvorschlag gemäß [4] Abschnitt 4.3 gewünscht ist. Ob dies vorteilhaft ist oder nicht, hängt vom Problem ab.- permc_specstr (Standard: ‘MMD_AT_PLUS_A’)
(Wirkt sich nur aus bei
sparse = True,lstsq = False,sym_pos = True, und keine SuiteSparse.) Eine Matrix wird in jeder Iteration des Algorithmus faktorisiert. Diese Option gibt an, wie die Spalten der Matrix zur Erhaltung der Dünnheit permutiert werden sollen. Akzeptable Werte sindNATURAL: natürliche Reihenfolge.MMD_ATA: minimale Gradreihenfolge auf der Struktur von A^T A.MMD_AT_PLUS_A: minimale Gradreihenfolge auf der Struktur von A^T+A.COLAMD: ungefähre Minimalgrad-Spaltenordnung.
Diese Option kann die Konvergenz des Interior-Point-Algorithmus beeinflussen; testen Sie verschiedene Werte, um zu bestimmen, welcher für Ihr Problem am besten funktioniert. Weitere Informationen finden Sie unter
scipy.sparse.linalg.splu.- unknown_optionsdict
Optionale Argumente, die von diesem speziellen Löser nicht verwendet werden. Wenn unknown_options nicht leer ist, wird eine Warnung ausgegeben, die alle ungenutzten Optionen auflistet.
Hinweise
Diese Methode implementiert den in [4] dargestellten Algorithmus mit Ideen aus [8] und einer Struktur, die von den einfacheren Methoden in [6] inspiriert ist.
Die primär-duale Pfadfolgemethode beginnt mit anfänglichen „Schätzungen“ der primären und dualen Variablen des Standardformularproblems und versucht iterativ, die (nichtlinearen) Karush-Kuhn-Tucker-Bedingungen für das Problem mit einem allmählich reduzierten logarithmischen Barrierebegriff, der zur Zielfunktion hinzugefügt wird, zu lösen. Diese spezielle Implementierung verwendet eine homogene selbstduale Formulierung, die bei Bedarf Zertifikate für Nichtlösbarkeit oder Unbeschränktheit liefert.
Der Standardstartpunkt für die primären und dualen Variablen ist der in [4] Abschnitt 4.4 Gleichung 8.22 definierte. Optional (durch Setzen der Startpunktoption
ip=True) kann ein alternativer (potenziell verbesserter) Startpunkt gemäß den zusätzlichen Empfehlungen von [4] Abschnitt 4.4 berechnet werden.Eine Suchrichtung wird mit der von Mehrota vorgeschlagenen und in [4] Abschnitt 4.1 beschriebenen Vorhersage-Korrektur-Methode berechnet. (Eine mögliche Verbesserung wäre die Implementierung der Methode der Mehrfachkorrekturen, die in [4] Abschnitt 4.2 beschrieben wird.) In der Praxis geschieht dies durch Lösen der Normalgleichungen, [4] Abschnitt 5.1 Gleichungen 8.31 und 8.32, abgeleitet aus den Newton-Gleichungen [4] Abschnitt 5 Gleichungen 8.25 (vergleiche mit [4] Abschnitt 4 Gleichungen 8.6-8.8). Der Vorteil des Lösens der Normalgleichungen anstelle von 8.25 direkt ist, dass die beteiligten Matrizen symmetrisch und positiv definit sind, so dass eine Cholesky-Zerlegung anstelle der teureren LU-Zerlegung verwendet werden kann.
Mit den Standardoptionen hängt der für die Zerlegung verwendete Löser von der Verfügbarkeit von Drittanbietersoftware und der Kondition des Problems ab.
Für dichte Probleme werden die Löser in folgender Reihenfolge versucht:
scipy.linalg.cho_factorscipy.linalg.solvemit der Optionsym_pos=Truescipy.linalg.solvemit der Optionsym_pos=Falsescipy.linalg.lstsq
Für dünne Probleme
sksparse.cholmod.cholesky(wenn scikit-sparse und SuiteSparse installiert sind)scipy.sparse.linalg.factorized(wenn scikit-umfpack und SuiteSparse installiert sind)scipy.sparse.linalg.splu(das SuperLU verwendet, das mit SciPy geliefert wird)scipy.sparse.linalg.lsqr
Wenn der Löser aus irgendeinem Grund fehlschlägt, werden nacheinander robustere (aber langsamere) Löser in der angegebenen Reihenfolge versucht. Das Versuchen, Fehlen und Neustarten der Faktorisierung kann zeitaufwendig sein. Wenn das Problem numerisch herausfordernd ist, können Optionen gesetzt werden, um Lösungsversuche zu umgehen, die fehlschlagen. Das Setzen von
cholesky=Falseüberspringt zu Löser 2,sym_pos=Falseüberspringt zu Löser 3 undlstsq=Trueüberspringt zu Löser 4 für sowohl dünne als auch dichte Probleme.Mögliche Verbesserungen zur Bekämpfung von Problemen mit dichten Spalten in ansonsten dünnen Problemen sind in [4] Abschnitt 5.3 und [10] Abschnitt 4.1-4.2 beschrieben; letzteres diskutiert auch die Linderung von Genauigkeitsproblemen im Zusammenhang mit der Substitutionsmethode für freie Variablen.
Nachdem die Suchrichtung berechnet wurde, wird die maximal mögliche Schrittgröße, die die Nicht-Negativitätsbeschränkungen nicht aktiviert, berechnet, und die kleinere dieser Schrittgröße und Eins wird angewendet (wie in [4] Abschnitt 4.1). [4] Abschnitt 4.3 schlägt Verbesserungen zur Auswahl der Schrittgröße vor.
Der neue Punkt wird gemäß den Abbruchbedingungen von [4] Abschnitt 4.5 getestet. Die gleiche Toleranz, die über die Option
tolgesetzt werden kann, wird für alle Prüfungen verwendet. (Eine mögliche Verbesserung wäre, die verschiedenen Toleranzen unabhängig einstellbar zu machen.) Wenn Optimalität, Unbeschränktheit oder Nichtlösbarkeit erkannt wird, terminiert der Lösungsablauf; andernfalls wiederholt er sich.Während das Top-Level-Modul
linprogein Problem der FormMinimieren
c @ x
Unter den Nebenbedingungen
A_ub @ x <= b_ub A_eq @ x == b_eq lb <= x <= ub
erwartet, wobei
lb = 0undub = Noneist, es sei denn, sie sind inboundsgesetzt. Das Problem wird automatisch in die FormMinimieren
c @ x
Unter den Nebenbedingungen
A @ x == b x >= 0
zur Lösung konvertiert. Das heißt, das ursprüngliche Problem enthält Gleichheits-, Ober- und Variablenbeschränkungen, während der methodenspezifische Löser Gleichheitsbeschränkungen und Nicht-Negativität der Variablen erfordert.
linprogkonvertiert das ursprüngliche Problem in Standardform, indem es einfache Grenzen in Ungleichheitsbeschränkungen umwandelt, nicht-negative Schlupfvariablen für Ungleichheitsbeschränkungen einführt und unbeschränkte Variablen als Differenz zwischen zwei nicht-negativen Variablen ausdrückt. Das Problem wird vor der Berichterstattung der Ergebnisse wieder in die ursprüngliche Form zurückkonvertiert.Referenzen
[4] (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)Andersen, Erling D., und Knud D. Andersen. „The MOSEK interior point optimizer for linear programming: an implementation of the homogeneous algorithm.“ High performance optimization. Springer US, 2000. 197-232.
[6] (1,2)Freund, Robert M. „Primal-Dual Interior-Point Methods for Linear Programming based on Newton’s Method.“ Unpublished Course Notes, March 2004. Verfügbar am 25.02.2017 unter https://ocw.mit.edu/courses/sloan-school-of-management/15-084j-nonlinear-programming-spring-2004/lecture-notes/lec14_int_pt_mthd.pdf
[8]Andersen, Erling D., und Knud D. Andersen. „Presolving in linear programming.“ Mathematical Programming 71.2 (1995): 221-245.
[9]Bertsimas, Dimitris, und J. Tsitsiklis. „Introduction to linear programming.“ Athena Scientific 1 (1997): 997.
[10]Andersen, Erling D., et al. Implementation of interior point methods for large scale linear programming. HEC/Universite de Geneve, 1996.