Je veux utiliser CPLEX sur Python, mais il n'y a qu'un manuel en anglais, et il est difficile de vérifier chacun d'eux, donc je dois écrire moi-même un manuel japonais. Veuillez noter qu'il n'est pas exhaustif car il est pour mon propre usage. Le programme est censé être écrit dans le notebook jupyter.
Il est basé sur le site suivant. [Manuel de référence officiel de l'API CPLEX Python] https://www.ibm.com/support/knowledgecenter/en/SSSA5P_12.8.0/ilog.odms.cplex.help/refpythoncplex/html/cplex-module.html
Article de référence [Utilisation du solveur optimisé d'IBM CPLEX avec Python] https://qiita.com/leopardus/items/93cac0f97cb22151983a
Cette fois, je décrirai principalement ce qui est nécessaire lors de la résolution de LP (format de notebook jupyter).
Programmons en utilisant le problème suivant comme exemple.
import cplex
Tout d'abord, créez une instance du problème d'optimisation.
lp = cplex.Cplex()
Vous avez maintenant un problème vide sans données. Définissez ensuite ce problème comme un LP (problème de planification linéaire).
lp.set_problem_type(lp.problem_type.LP)
Si vous souhaitez créer un problème d'optimisation autre que LP, définissez l'argument de la fonction ci-dessus sur
lp.problem_type.MILP```
lp.problem_type.Il peut être pris en charge en utilisant QP, etc. Cette fois c'est LP
#### **`lp.problem_type.Je remplace LP.`**
Spécifiez ensuite s'il faut maximiser ou réduire la fonction objectif. Par défaut, il s'agit de "minimiser", c'est-à-dire qu'il s'agit d'un problème de minimisation, mais cette fois, il est réglé sur "maximiser" la maximisation.
lp.objective.set_sense(lp.objective.sense.maximize)
Vous n'êtes pas obligé, mais donnez un nom au problème.
lp.set_problem_name("test_lp")
Jusqu'à présent, les paramètres généraux de LP ont été terminés.
Ensuite, définissez les variables.
lp.variables.add(names=["x1","x2"],lb=[0,0])
Pour ajouter une nouvelle variable, utilisez la fonction ci-dessus appelée add, mais l'argument de add est obj
`lb```` `ʻub````
types ` Il existe 6 types: `` noms
colonnes```. L'explication de chacun est la suivante.
obj
lb
ub
types
lp.variables.type.integer '' ou `` 'I'```
lp.variables.type.binary '' ou `` 'B' ''
lp.variables.type.continuous '' ou 'C' '' --Demi entier:
lp.variables.type.semi_integer``` ou
'N'` --Semi-continu:
lp.variables.type.semi_continuous``` ou
'S'`` `names
columns
Définissez la fonction objectif.
lp.objective.set_linear("x1",2)
lp.objective.set_linear("x2",3)
Ou
lp.objective.set_linear([(0,2),(1,3)])
Comme mentionné ci-dessus, les arguments peuvent être donnés sous la forme (nom de la variable, coefficient) '' ou
(nombre de variable, coefficient) '', et peuvent être définis individuellement ou collectivement pour chaque variable. est.
Ensuite, nous décrirons l'expression de contrainte.
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])
Ou
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])
Si vous souhaitez ajouter des contraintes linéaires, vous devez utiliser une fonction appelée linear_constraints.add, qui a également plusieurs arguments comme des variables.
names
lin_expr
rhs
senses
'L'
'G'
'E'
--Contrainte de portée:
'R' ''range_values
Maintenant que nous avons défini le problème, nous allons enfin le résoudre, mais avant cela, sortons le problème que nous avons défini jusqu'à présent.
lp.write("test.lp")
En regardant le fichier de sortie, le problème est correctement défini. Trouvez la solution lorsque vous pouvez la définir correctement.
lp.solve()
Indique si la solution optimale a été obtenue suite à l'optimisation.
print(lp.solution.get_status_string())
Sortie: `ʻoptimal`` Et la solution optimale est obtenue. La solution optimale et la valeur optimale sont affichées.
print(lp.solution.get_values())
print(lp.solution.get_objective_value())
production:
[4.0, 6.0] 26.0
La solution correcte a été obtenue.
Je ne sais pas s'il y en aura la prochaine fois, mais j'aimerais gérer QP.
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