CPLEX Python API selbst erstellte manuelle LP-Edition

Motivation

Ich möchte CPLEX unter Python verwenden, aber es gibt nur ein englisches Handbuch, und es ist mühsam, jedes zu überprüfen. Daher muss ich selbst ein japanisches Handbuch schreiben. Bitte beachten Sie, dass es nicht erschöpfend ist, da es für meinen eigenen Gebrauch bestimmt ist. Das Programm soll in ein Jupiter-Notizbuch geschrieben sein.

Es basiert auf der folgenden Site. [Offizielles CPLEX Python API-Referenzhandbuch] https://www.ibm.com/support/knowledgecenter/en/SSSA5P_12.8.0/ilog.odms.cplex.help/refpythoncplex/html/cplex-module.html

Referenzartikel [Verwenden des optimierten Lösers CPLEX von IBM mit Python] https://qiita.com/leopardus/items/93cac0f97cb22151983a

Umgebung

LP (lineares Planungsproblem)

Dieses Mal werde ich hauptsächlich beschreiben, was beim Lösen von LP (Jupyter-Notebook-Format) erforderlich ist. Lassen Sie uns am Beispiel des folgenden Problems programmieren. $ \begin{align} \max\ \ &2x_1+3x_2 \\\ \text{s.t.}\ \ &3x_1+2x_2 \leq 24 \\\ &x_1+2x_2 \leq 16 \\\ &x_1 \leq 6 \\\ &x_1 \geq 0,x_2 \geq 0 \end{align} $

Problemstellung

import cplex

Erstellen Sie zunächst eine Instanz des Optimierungsproblems.

lp = cplex.Cplex()

Jetzt haben Sie ein leeres Problem ohne Daten. Stellen Sie dieses Problem dann als LP (Linear Planning Problem) ein.

lp.set_problem_type(lp.problem_type.LP)

Wenn Sie ein anderes Optimierungsproblem als LP erstellen möchten, ändern Sie das Argument der obigen Funktion in "lp.problem_type.MILP"

lp.problem_type.Es kann durch Verwendung von QP usw. unterstützt werden. Diesmal ist es LP



#### **`lp.problem_type.Ich ersetze LP.`**

Geben Sie dann an, ob die Zielfunktion maximiert oder minimiert werden soll. Standardmäßig ist es "Minimieren", das heißt, es ist ein Minimierungsproblem, aber dieses Mal ist es auf "Maximieren" der Maximierung eingestellt.

lp.objective.set_sense(lp.objective.sense.maximize)

Sie müssen nicht, aber geben Sie dem Problem einen Namen.

lp.set_problem_name("test_lp")

Bis zu diesem Punkt wurden die allgemeinen Einstellungen für LP abgeschlossen.

Variable Einstellungen

Als nächstes setzen Sie die Variablen.

lp.variables.add(names=["x1","x2"],lb=[0,0])

Um eine neue Variable hinzuzufügen, verwenden Sie die obige Funktion namens add, aber das Argument von add lautet `obj```` `lb```` `ub````` `types```` Es gibt 6 Typen: names `` `column. Die Erklärung von jedem ist wie folgt.

  • names
    Sie können den Namen der Variablen angeben.
  • columns
    Es scheint, dass ein Einschränkungsausdruck festgelegt werden kann, aber er scheint kompliziert zu sein, sodass er weggelassen wird.

Beschreibung der Zielfunktion / des Einschränkungsausdrucks

Stellen Sie die Zielfunktion ein.

lp.objective.set_linear("x1",2)
lp.objective.set_linear("x2",3)

Oder

lp.objective.set_linear([(0,2),(1,3)])

Wie oben erwähnt, werden die Argumente als "(Variablenname, Koeffizient)" oder "(Variablennummer, Koeffizient)" angegeben und können für jede Variable einzeln oder gemeinsam festgelegt werden. ist. Als nächstes werden wir den Einschränkungsausdruck beschreiben.

lp.linear_constraints.add(names=["C1","C2","C3"],
                       lin_expr=[cplex.SparsePair(ind=["x1","x2"],val=[3,2]),
                                 cplex.SparsePair(ind=["x1","x2"],val=[1,2]),
                                 cplex.SparsePair(ind=["x1","x2"],val=[1,0])],
                       senses=["L","L","L"],
                       rhs=[24,16,6])

Oder

lp.linear_constraints.add(names=["C1","C2","C3"],
                       lin_expr=[[["x1","x2"],[3,2]],
                                 [["x1","x2"],[1,2]],
                                 [["x1","x2"],[1,0]]],
                       senses=["L","L","L"],
                       rhs=[24,16,6])

Wenn Sie lineare Einschränkungen hinzufügen möchten, müssen Sie eine Funktion namens linear_constraints.add verwenden, die auch mehrere Argumente wie Variablen enthält.

  • names
    Sie können den Namen des Einschränkungsausdrucks festlegen.
  • lin_expr
    Geben Sie die linke Seite des Einschränkungsausdrucks an. Das Formular enthält ein Sparse Pair oder eine Liste in Matrixform.
  • rhs
    Geben Sie die rechte Seite des Einschränkungsausdrucks an.
  • senses
    Geben Sie eine gleiche oder ungleiche Zahl an, die die Beziehung zwischen der linken und der rechten Seite des Einschränkungsausdrucks darstellt. Die Entsprechung zwischen Symbolen und Zeichen ist wie folgt.
  • \leq'L'
  • \geq'G'
  • ='E' --Range Einschränkung: `` `'R'```
  • range_values
    Sie können den Wert der Bereichsbeschränkung angeben.

Lösung

Nachdem wir das Problem definiert haben, werden wir es endlich lösen, aber vorher geben wir das Problem aus, das wir bisher definiert haben.

lp.write("test.lp")

スクリーンショット 2020-10-27 23.02.17.png

In der Ausgabedatei ist das Problem korrekt definiert. Finden Sie die Lösung, wenn Sie sie richtig definieren können.

lp.solve()

Zeigt an, ob durch Optimierung die optimale Lösung erhalten wurde.

print(lp.solution.get_status_string())

Ausgabe: optimal Und die optimale Lösung wird erhalten. Die optimale Lösung und der optimale Wert werden angezeigt.

print(lp.solution.get_values())
print(lp.solution.get_objective_value())

Ausgabe: [4.0, 6.0] 26.0 Die richtige Lösung wurde erhalten.

nächstes Mal

Ich weiß nicht, ob es das nächste Mal geben wird, aber ich würde gerne mit QP umgehen.

Code

import cplex

lp = cplex.Cplex()
lp.set_problem_type(lp.problem_type.LP)
lp.objective.set_sense(lp.objective.sense.maximize)
lp.set_problem_name("test_lp")

lp.variables.add(names=["x1","x2"],lb=[0.0,0.0])
lp.objective.set_linear([("x1",2),("x2",3)])
lp.linear_constraints.add(names=["C1","C2","C3"],
                       lin_expr=[[["x1","x2"],[3,2]],
                                 [["x1","x2"],[1,2]],
                                 [["x1","x2"],[1,0]]],
                       senses=["L","L","L"],
                       rhs=[24,16,6])

lp.write("test.lp")

lp.solve()
print(lp.solution.get_status_string())
print(lp.solution.get_values())
print(lp.solution.get_objective_value())


Recommended Posts

CPLEX Python API selbst erstellte manuelle LP-Edition
Ein * Algorithmus (Python Edition)
Erste Python 3rd Edition
Python selbst erstellte Klassensortierung
Evernote-API in Python
Liste der Python-APIs für OpenCV3
C-API in Python 3
TensorFlow API-Memo (Python)
Explosive Speed API Konstruktion ~ Charice Edition ~
Generierung von Spezifikationen und Code in der REST-API-Entwicklung (Python Edition)