[PYTHON] Programmation linéaire avec PuLP

J'étudie la programmation non linéaire pour comprendre le noyau et ainsi de suite. Avant cela, je voulais réellement bouger mes mains avec la méthode de programmation linéaire, alors j'ai essayé d'utiliser PuLP, qui peut être utilisé gratuitement.

Cette fois, j'ai résolu l'exemple du chapitre 6 de "Optimisation des mathématiques qui peuvent être comprises", la programmation linéaire.

Il existe plusieurs exemples similaires, alors je les ai choisis et les ai modélisés avec PuLP.

Exemple 6.2

Utilisez les machines M1 et M2 pour fabriquer deux types de conteneurs A et B.Vous devez utiliser M1 pendant 2 minutes et la machine M2 pendant 4 minutes pour fabriquer un conteneur A. D'autre part, fabriquer un conteneur B. Cependant, il est nécessaire d'utiliser la machine M1 pendant 8 minutes et la machine M2 pendant 4 minutes. Les bénéfices pour la fabrication des conteneurs A et B sont respectivement de 29 yens et 45 yens. Comment planifier pour maximiser les profits Devrais-je le faire?

Lorsque le profit est modélisé en demandant la fonction objectif f et le nombre de conteneurs en demandant respectivement x et y, la formule est la suivante. Contraintes: 2x + 8y <= 60 4x + 4y <= 60 x >= 0, y >= 0

Fonction objectif: f = 29x + 45y → max

Voici donc le code qui permet de résoudre ces formules en les plongeant dans PuLP. Comme le nombre de conteneurs est calculé cette fois, la solution est un entier et la variable est spécifiée par Integer.

#Creat variables
x = pulp.LpVariable("x", cat = "Integer")
y = pulp.LpVariable("y", cat = "Integer")

#Create object function
problem = pulp.LpProblem("Container", pulp.LpMaximize)
problem += 29*x + 45*y  #(6.6)

#constrained condition
problem += 2*x + 8*y <= 60 #(6.4)
problem += 4*x + 4*y <= 60 #(6.4)
problem += x >= 0 #(6.5)
problem += y >= 0 #(6.5)

status = problem.solve()
print "Status", pulp.LpStatus[status]

print problem

print "Result"
print "x", x.value()
print "y", y.value()

Le résultat est,

Status Optimal
Container:
MAXIMIZE
29*x + 45*y + 0
SUBJECT TO
_C1: 2 x + 8 y <= 60
_C2: 4 x + 4 y <= 60
_C3: x >= 0
_C4: y >= 0

VARIABLES
x free Integer
y free Integer

Result
x 10.0
y 5.0

Exemple 6.3

Deux types d'alliages A et B sont fabriqués à partir de deux types de métaux M1 et M2. Les alliages A et B ont un bénéfice de 30 000 yens et 25 000 yens par tonne, respectivement. L'alliage A mélange les métaux M1 et M2 dans un rapport de 1: 1 et l'alliage B mélange les métaux M1 et M2 dans un rapport de 1: 3. Les métaux M1 et M2 peuvent être fournis respectivement à raison de 10 tonnes et 15 tonnes par jour Comment planifier la fabrication des alliages A et B pour maximiser les profits.

Lorsqu'il est modélisé, Contraintes: 0.5x + 0.25y <= 10 0.5x + 0.75y <= 15 x >= 0, y >= 0

Fonction objectif: f = 30x + 25y → max

Cette fois, lors du codage, la solution est une valeur continue, donc la variable est spécifiée comme Continue.

#Creat variables
x = pulp.LpVariable("x", cat = "Continuous")
y = pulp.LpVariable("y", cat = "Continuous")

#Create object function
problem = pulp.LpProblem("Alloy", pulp.LpMaximize)
problem += 30*x + 25*y  #(6.9)

#constrained condition
problem += 0.5*x + 0.25*y <= 10 #(6.7)
problem += 0.5*x + 0.75*y <= 15 #(6.7)
problem += x >= 0 #(6.8)
problem += y >= 0 #(6.8)

status = problem.solve()
print "Status", pulp.LpStatus[status]

print problem

print "Result"
print "x", x.value()
print "y", y.value()

Le résultat est,

Status Optimal
Alloy:
MAXIMIZE
30*x + 25*y + 0
SUBJECT TO
_C1: 0.5 x + 0.25 y <= 10
_C2: 0.5 x + 0.75 y <= 15
_C3: x >= 0
_C4: y >= 0

VARIABLES
x free Continuous
y free Continuous

Result
x 15.0
y 10.0

Exemple 6.7

Si la fonction objectif diverge et que la solution optimale n'existe pas comme dans cet exemple, "Status Unbounded" s'affiche comme illustré ci-dessous.

Contraintes: -x - y <= -1 -2x + y <= 1 x - 2y <= 1 x >= 0, y >= 0

Fonction objectif: f = x + y → max

#Creat variables
a = pulp.LpVariable("a", cat = "Continuous")
b = pulp.LpVariable("b", cat = "Continuous")

#Create object function
problem = pulp.LpProblem("Test", pulp.LpMaximize)
problem += a + b  #(6.16)

#constrained condition
problem += -a - b <= -2 #(6.14)
problem += -2*a + b <= 15 #(6.14)
problem += a - 2*b <= 15 #(6.14)
problem += a >= 0 #(6.15)
problem += b >= 0 #(6.15)

status = problem.solve()
print "Status", pulp.LpStatus[status]

print problem

Status Unbounded

Recommended Posts

Programmation linéaire avec PuLP
Programmation linéaire + pratique de la pulpe
[Problème d'optimisation mathématique] Méthode de programmation linéaire utilisant PuLP
Comment résoudre les problèmes de planification linéaire avec PuLP
Régression linéaire avec statsmodels
3. 3. Programmation IA avec Python
Optimisation apprise avec OR-Tools [Planification linéaire: modèle en plusieurs étapes]
Programmation Python avec Atom
Programmation compétitive avec python
Programmation Shader avec pyOpenGL
Résoudre des maths avec PuLP
Régression avec un modèle linéaire
Programmation asynchrone avec libev
Programmation avec Python Flask
Programmation asynchrone avec libev # 3
Optimisation apprise avec OR-Tools [Planification linéaire: gestion de projet]
Optimisation apprise avec OR-Tools [plan linéaire: raffinons l'huile]
Programmation avec Python et Tkinter
Essayez de programmer avec un shell!
Essayez la programmation GUI avec Hy
Coordinateur et plan linéaire entier
Jeu éducatif de programmation avec SenseHAT
[Python] Régression linéaire avec scicit-learn
Méthode de programmation linéaire par méthode de marqueur de voiture
Programmation réseau avec Python Scapy
Régression linéaire robuste avec scikit-learn
[Python] Programmation orientée objet apprise avec Pokemon
Programmation facile Python + OpenCV avec Canopy
Régression linéaire avec distribution t de Student
Programmation pour les humains avec un __repr__ bien défini
Programmation de compétition avec les paramètres de l'environnement local python
Algèbre linéaire pour la programmation Chapitre 4 (valeurs uniques, vecteurs propres)
Programmation normale avec la programmation Node-RED avec Raspberry Pi 3
Faites de la programmation embarquée avec un développement piloté par les tests avec googletest
Programmation sonore avec Go (super niveau d'introduction)
Ce que vous pouvez faire avec des compétences en programmation