CPLEX Python API manuel édition LP

Motivation

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

environnement

LP (problème de planification linéaire)

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. $ \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} $

Problème de réglage

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.

Paramètres variables

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.

  • names
    Vous pouvez spécifier le nom de la variable.
  • columns
    Il semble qu'une expression de contrainte puisse être définie, mais cela semble compliqué, donc elle est omise.

Description de la fonction objectif / expression de contrainte

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
    Vous pouvez définir le nom de l'expression de contrainte.
  • lin_expr
    Spécifiez le côté gauche de l'expression de contrainte. Le formulaire donne une paire clairsemée ou une liste sous forme de matrice.
  • rhs
    Spécifiez le côté droit de l'expression de contrainte.
  • senses
    Spécifiez un nombre égal ou différent qui représente la relation entre les côtés gauche et droit de l'expression de contrainte. La correspondance entre les symboles et les caractères à spécifier est la suivante.
  • \leq'L'
  • \geq'G'
  • ='E' --Contrainte de portée: 'R' ''
  • range_values
    Vous pouvez spécifier la valeur de la contrainte de plage.

Solution

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")

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

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.

la prochaine fois

Je ne sais pas s'il y en aura la prochaine fois, mais j'aimerais gérer QP.

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 manuel édition LP
Algorithme A * (édition Python)
Première 3e édition de Python
Tri par classe Python
API Evernote en Python
Liste des API Python pour OpenCV3
API C en Python 3
Mémo de l'API TensorFlow (Python)
Construction de l'API de vitesse explosive ~ Édition Charice ~
Génération de spécifications et génération de code dans le développement d'API REST (édition Python)