Le but ici est d'aider ** ceux qui commencent tout juste à optimiser avec Python à approfondir leur compréhension **.
Pour plus d'informations sur l'optimisation des combinaisons, voir "Utilisons l'optimisation des combinaisons". Nous procéderons en partant du fait qu'il existe des éléments tels que des modèles, des variables, des fonctions objectives et des contraintes.
--Personnes qui veulent apprendre l'optimisation avec Python
Problème d'optimisation de la production Je veux maximiser les profits en produisant des produits avec des matières premières limitées
Pour plus de détails, consultez [Recherche Google](https://www.google.co.jp/search?q=Problème de planification de la production + exemple).
Cette fois, on suppose que les données d'entrée d'origine sont préparées dans le tableau ci-dessous.
data.csv
,Ingrédient 1,Matière première 2,Matière première 3,Profit
Produit 1,1,4,3,5
Produit 2,2,4,1,4
Stock,40,80,50
python3
import pandas as pd
from pulp import *
from ortoolpy import addvars
Table d'entrée= pd.read_csv('data.csv', encoding='cp932', index_col=0) #Spécifications de lecture
Table variable,Stock=Table d'entrée.iloc[:-1,:].copy(),Table d'entrée.iloc[-1,:-1] #Divisez en deux
modèle= LpProblem(sense=LpMaximize) #Modèle d'optimisation linéaire
Table variable['variable'] = addvars(len(Table variable)) # 生産量を表すvariableを表に追加
modèle+= lpDot(Table variable.Profit,Table variable.variable) # 総Profitを表す目的関数
pour la matière première dans le tableau variable.columns[:-2]: #Traitement pour chaque produit
modèle+= lpDot(Table variable[Matériel],Table variable.variable) <=Stock[Matériel] # Matérielの使用量が在庫以下
modèle.solve() #Trouvez une solution avec un solveur
Table variable['résultat'] = Table variable.variable.apply(value) # variableの値(résultat)À la table
print('Fonction objective',value(modèle.objective)) # Fonction objectiveの表示
print(Table variable) # Table variableの表示
résultat
Fonction objectif 95.0
Matière première 1 Matière première 2 Matière première 3 Résultat variable de profit
Produit 1 1 4 3 5.0 v0001 15.0
Produit 2 2 4 1 4.0 v0002 5.0
python3
import pandas as pd
from pulp import *
from ortoolpy import addvars
Importez le package que vous souhaitez utiliser. Les variables du modèle sont représentées sous forme de colonnes dans la table des variables.
--pandas: utilisé pour travailler avec des modèles via des tables de variables.
python3
Table d'entrée= pd.read_csv('data.csv', encoding='cp932', index_col=0) #Spécifications de lecture
Si le fichier ne peut pas être préparé
from io import StringIO
Table d'entrée= pd.read_table(StringIO("""
Matière première 1 Matière première 2 Matière première 3 Bénéfice
Produit 1 1 4 3 5
Produit 2 2 4 1 4
Stock 40 80 50
"""),index_col=0)
Lisez les spécifications nécessaires dans le fichier et utilisez-le comme table d'entrée. Vous pouvez facilement le lire en utilisant pandas.read_csv.
python3
Table variable,Stock=Table d'entrée.iloc[:-1,:].copy(),Table d'entrée.iloc[-1,:-1] #Divisez en deux
Remplacez la partie bleue de la figure ci-dessus par "Tableau de variation" et la partie verte par "Inventaire". Vous pouvez utiliser des tranches dans la table d'entrée .iloc pour les récupérer librement à partir de la table.
Pour plus d'informations sur les tranches, consultez [Recherche Google](https://www.google.co.jp/search?q=python+numpy+ slices).
python3
modèle= LpProblem(sense=LpMaximize) #Modèle optimisé
Créez un modèle optimisé [^ 1] à l'aide de pulp.LpProblem. Indique que vous souhaitez maximiser la fonction objectif en spécifiant sense = LpMaximize. Si rien n'est spécifié, il sera minimisé.
[^ 1]: Pour les praticiens, l'état (problème) qu'ils veulent résoudre et le modèle qui l'abstraction pour le rendre plus facile à résoudre doivent être correctement séparés. Les chercheurs considèrent souvent le problème comme un modèle car il commence par un modèle formalisé. LpProblem correspond au modèle.
python3
Table variable['variable'] = addvars(len(Table variable)) # 生産量を表すvariableを表に追加
Dans les pandas, vous pouvez ajouter une nouvelle colonne nommée "Variable" dans la "Table des variables ['Variable'] =…". addvars vous permet de créer un tableau de variables. Une ligne du tableau des variables correspond à "1 variable et ses attributs".
python3
modèle+= lpDot(Table variable.Profit,Table variable.variable) # 総Profitを表す目的関数
Dans pulp, vous pouvez définir la fonction objectif avec "model + =…" [^ 2]. lpDot (c, x) signifie le produit interne, qui est $ c ^ T x $.
[^ 2]: C'est déroutant, mais ce n'est pas un ajout. Même si vous le faites deux fois, seul le second est valide.
python3
pour la matière première dans le tableau variable.columns[:-2]: #Traitement pour chaque produit
modèle+= lpDot(Table variable[Matériel],Table variable.variable) <=Stock[Matériel] # Matérielの使用量が在庫以下
Avec pulp, vous pouvez ajouter des contraintes avec "modèle + =… <= valeur". Vous pouvez également utiliser "> =" et "==", mais pas "! =".
python3
modèle.solve() #Trouvez une solution avec un solveur
Le modèle créé peut être résolu par un autre programme appelé solveur. Avec pulp, vous pouvez spécifier différents solveurs. Si vous ne spécifiez rien, il sera résolu à l'aide d'un solveur gratuit appelé CBC. CBC est installé avec l'installation de pâte.
python3
Table variable['résultat'] = Table variable.variable.apply(value) # variableの値(résultat)À la table
Lorsqu'elle est résolue avec un solveur, la valeur (XXX) peut être utilisée pour récupérer la valeur de XXX. Vous pouvez appliquer une valeur à toute la colonne de variables en faisant "Variable table.Variable.apply (value)". Une nouvelle colonne de résultats est créée par "Table des variables ['Résultat'] =…".
python3
print('Fonction objective',value(modèle.objective)) # Fonction objectiveの表示
print(Table variable) # Table variableの表示
Résultats republiés
Fonction objectif 95.0
Matière première 1 Matière première 2 Matière première 3 Résultat variable de profit
Produit 1 1 4 3 5.0 v0001 15.0
Produit 2 2 4 1 4.0 v0002 5.0
Si vous faites 15 pour le produit 1 et 5 pour le produit 2, vous constaterez que le profit total est au maximum de 95.
—— Lisez des livres et recherchez sur le Web.
Let's enjoy Mathematical Optimization!
Recommended Posts