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
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.
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.
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.
obj
`obj = [2,3]`
eingestellt werden.lb
ub
types
`lp.variables.type.integer``` oder`
'I'```lp.variables.type.binary``` oder
`'B'````lp.variables.type.continuous``` oder` `'C'``` --Halbe Ganzzahl:
lp.variables.type.semi_integer``` oder
'N'``` --Semi-Continuous: ``
lp.variables.type.semi_continuous oder` `'S'
names
columns
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
lin_expr
rhs
senses
'L'
'G'
'E'
--Range Einschränkung: `` `'R'``` range_values
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")
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.
Ich weiß nicht, ob es das nächste Mal geben wird, aber ich würde gerne mit QP umgehen.
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