Explication du modèle d'optimisation de la production par Python

introduction

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.

Personne cible

--Personnes qui veulent apprendre l'optimisation avec Python

Problème de cible

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

Code Python

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

Commentaire

Spécification du paquet

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.

Lecture du tableau d'entrée

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.

image.png

Division de la table d'entrée

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

Créer un modèle

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.

Ajouter une colonne de variables

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

Ajouter une fonction objectif

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.

Ajouter une condition de contrainte

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 "! =".

Exécution du solveur

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.

Ajouter un résultat

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'] =…".

Voir les résultats

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.

Autre

Étudier

—— Lisez des livres et recherchez sur le Web.

Let's enjoy Mathematical Optimization!

Recommended Posts

Explication du modèle d'optimisation de la production par Python
Liste des articles liés à l'optimisation par Python vers Docker
Modèle de commutation de Markov par Python
Extension du dictionnaire python par argument
Optimisation du plan de production de plaquettes semi-conductrices
Comportement de python3 par le serveur de Sakura
Histoire d'approximation de puissance par Python
[Mémo d'apprentissage] Bases de la classe par python
Branchement conditionnel de Python appris avec la chimioinfomatique
Échelle de gris par matrice-Reinventor of Python image processing-
Exemple d'analyse de squelette tridimensionnelle par Python
Pandas du débutant, par le débutant, pour le débutant [Python]
Analyse d'image de microtomographie à rayons X par Python
Implémentation Python du modèle Markov caché continu
Retour par CNN (modèle construit de vision de la torche)
Python en optimisation
Optimisation de la planification de la production à l'aide de la programmation linéaire (Python + PuLP)
Fonction de transmission / modèle d'espace d'état du circuit série RLC et simulation par Python
Mémorandum d'extraction par requête python bs4
Les bases de Python ①
Bases de python ①
Copie de python
Minimisez le nombre de polissages en optimisant la combinaison
Juger la finition du mahjong par l'optimisation des combinaisons
Amélioration de la metrix de performance par modèle d'apprentissage en 2 étapes
Optimisation de portefeuille avec Python (modèle de distribution moyenne de Markovitz)
Explication de la distance d'édition et de l'implémentation en Python
Introduction de Python
Fonction de transmission / modèle d'espace d'état du système ressort / masse / amortisseur et simulation par Python
[Python] Implémentation du clustering à l'aide d'un modèle gaussien mixte
[Traitement du langage 100 coups 2020] Résumé des exemples de réponses par Python
Traitement d'image par matrice Basics & Contents-Reinventor of Python image processing-
Implémentation d'estimation la plus probable du modèle de sujet en python
Explication du concept d'analyse de régression à l'aide de python Partie 2
Résumé des articles sur Python du chercheur Yukiya dans une société pharmaceutique
○○ Résolution de problèmes dans le département de mathématiques avec optimisation
Python - Explication et résumé de l'utilisation des 24 meilleurs packages
Explication du concept d'analyse de régression à l'aide de Python Partie 1
Regrouper par éléments consécutifs d'une liste en Python
Explication du concept d'analyse de régression à l'aide de Python Extra 1
Implémentation d'estimation bayésienne de variante du modèle de sujet en python
Explication sur l'erreur NoReverseMatch dans "python django super introduction"
Mémo de "Cython-Accélérer Python en fusionnant avec C"
Jugement des nombres premiers par Python
[Python] Opération d'énumération
Liste des modules python
Mémo de visualisation par Python
Traitement de la communication par Python
Unification de l'environnement Python
Optimisation de la planification de la production (OU-Tools)
Copie des préférences python
Principes de base du grattage Python
[python] comportement d'argmax
Utilisation des locaux Python ()
le zen de Python
Installation de Python 3.3 rc1
Optimisation du regroupement par combinaison
Bibliothèque d'optimisation Python Pulp
# 4 [python] Bases des fonctions
Réponse de Beamformer par python