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.
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
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
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