Der Zweck hier ist es, ** denjenigen zu helfen, die gerade erst anfangen, mit Python zu optimieren, um ihr Verständnis zu vertiefen **.
Weitere Informationen zur Kombinationsoptimierung finden Sie unter "Verwenden wir die Kombinationsoptimierung". Wir werden basierend auf der Tatsache vorgehen, dass es Elemente wie Modelle, Variablen, Zielfunktionen und Einschränkungen gibt.
Problem der Produktionsoptimierung Ich möchte den Gewinn maximieren, indem ich Produkte mit begrenzten Rohstoffen herstelle
Weitere Informationen finden Sie unter [Google-Suche](https://www.google.co.jp/search?q=Production Planning Problem + Example).
Dieses Mal wird davon ausgegangen, dass die ursprünglichen Eingabedaten in der folgenden Tabelle vorbereitet sind.
data.csv
,Zutat 1,Rohstoff 2,Rohstoff 3,Profitieren
Produkt 1,1,4,3,5
Produkt 2,2,4,1,4
Lager,40,80,50
python3
import pandas as pd
from pulp import *
from ortoolpy import addvars
Eingabetabelle= pd.read_csv('data.csv', encoding='cp932', index_col=0) #Spezifikationen lesen
Variablentabelle,Lager=Eingabetabelle.iloc[:-1,:].copy(),Eingabetabelle.iloc[-1,:-1] #In zwei Teile teilen
Modell-= LpProblem(sense=LpMaximize) #Lineares Optimierungsmodell
Variablentabelle['Variable'] = addvars(len(Variablentabelle)) # 生産量を表すVariableを表に追加
Modell-+= lpDot(Variablentabelle.Profitieren,Variablentabelle.Variable) # 総Profitierenを表す目的関数
für Rohmaterial in variabler Tabelle.columns[:-2]: #Verarbeitung für jedes Produkt
Modell-+= lpDot(Variablentabelle[Material],Variablentabelle.Variable) <=Lager[Material] # Materialの使用量が在庫以下
Modell-.solve() #Finden Sie eine Lösung mit einem Löser
Variablentabelle['Ergebnis'] = Variablentabelle.Variable.apply(value) # Variableの値(Ergebnis)Zum Tisch
print('Zielfunktion',value(Modell-.objective)) # Zielfunktionの表示
print(Variablentabelle) # Variablentabelleの表示
Ergebnis
Zielfunktion 95.0
Rohstoff 1 Rohstoff 2 Rohstoff 3 Gewinnvariable Ergebnis
Produkt 1 1 4 3 5.0 v0001 15.0
Produkt 2 2 4 1 4.0 v0002 5.0
python3
import pandas as pd
from pulp import *
from ortoolpy import addvars
Importieren Sie das gewünschte Paket. Modellvariablen werden in der Variablentabelle als Spalten dargestellt.
--pandas: Wird verwendet, um mit Modellen über variable Tabellen zu arbeiten. --Wenn Sie Anaconda verwenden, können Pandas so verwendet werden, wie sie sind. Wenn nicht, können Sie es mit "pip install pandas" installieren. --pulp: Sie können ein mathematisches Optimierungsmodell erstellen. --ortoolpy: Verwenden Sie die Variablengenerierungsfunktion (addvars).
python3
Eingabetabelle= pd.read_csv('data.csv', encoding='cp932', index_col=0) #Spezifikationen lesen
Wenn die Datei nicht vorbereitet werden kann
from io import StringIO
Eingabetabelle= pd.read_table(StringIO("""
Rohstoff 1 Rohstoff 2 Rohstoff 3 Gewinn
Produkt 1 1 4 3 5
Produkt 2 2 4 1 4
Lager 40 80 50
"""),index_col=0)
Lesen Sie die erforderlichen Spezifikationen aus der Datei und verwenden Sie sie als Eingabetabelle. Sie können es einfach mit pandas.read_csv lesen.
python3
Variablentabelle,Lager=Eingabetabelle.iloc[:-1,:].copy(),Eingabetabelle.iloc[-1,:-1] #In zwei Teile teilen
Ersetzen Sie "Variationstabelle" durch den blauen Teil in der obigen Abbildung und "Inventar" durch den grünen Teil. Sie können Slices in der Eingabetabelle .iloc verwenden, um sie frei aus der Tabelle abzurufen.
Weitere Informationen zum Schneiden finden Sie unter [Google-Suche](https://www.google.co.jp/search?q=python+numpy+ Slice).
python3
Modell-= LpProblem(sense=LpMaximize) #Optimiertes Modell
Erstellen Sie mit pulp.LpProblem ein optimiertes Modell [^ 1]. Gibt an, dass Sie die Zielfunktion maximieren möchten, indem Sie sense = LpMaximize angeben. Wenn nichts angegeben ist, wird es minimiert.
[^ 1]: Für Praktiker sollten der Zustand (das Problem), den sie lösen möchten, und das Modell, das es abstrahiert, um die Lösung zu vereinfachen, ordnungsgemäß getrennt werden. Forscher betrachten das Problem oft als Modell, weil es mit einem formalisierten beginnt. LpProblem entspricht dem Modell.
python3
Variablentabelle['Variable'] = addvars(len(Variablentabelle)) # 生産量を表すVariableを表に追加
In Pandas können Sie eine neue Spalte mit dem Namen "Variable" in die "Variablentabelle ['Variable'] = ..." einfügen. Mit addvars können Sie ein Array von Variablen erstellen. Eine Zeile in der Variablentabelle entspricht "1 Variable und ihren Attributen".
python3
Modell-+= lpDot(Variablentabelle.Profitieren,Variablentabelle.Variable) # 総Profitierenを表す目的関数
In Zellstoff können Sie die Zielfunktion mit "Modell + = ..." [^ 2] einstellen. lpDot (c, x) bedeutet inneres Produkt, das $ c ^ T x $ ist.
[^ 2]: Es ist verwirrend, aber keine Ergänzung. Selbst wenn Sie es zweimal tun, ist nur das zweite gültig.
python3
für Rohmaterial in variabler Tabelle.columns[:-2]: #Verarbeitung für jedes Produkt
Modell-+= lpDot(Variablentabelle[Material],Variablentabelle.Variable) <=Lager[Material] # Materialの使用量が在庫以下
Mit Zellstoff können Sie Einschränkungen mit "Modell + = ... <= Wert" hinzufügen. Alternativ können Sie "> =" und "==" verwenden, jedoch nicht "! =".
python3
Modell-.solve() #Finden Sie eine Lösung mit einem Löser
Das erstellte Modell kann von einem anderen Programm gelöst werden, das als Solver bezeichnet wird. Mit Pulp können Sie verschiedene Löser angeben. Wenn Sie nichts angeben, wird es mit einem freien Löser namens CBC gelöst. CBC wird mit der Zellstoffinstallation installiert.
python3
Variablentabelle['Ergebnis'] = Variablentabelle.Variable.apply(value) # Variableの値(Ergebnis)Zum Tisch
Bei Lösung mit einem Solver kann der Wert (XXX) verwendet werden, um den Wert von XXX abzurufen. Sie können den Wert auf die gesamte Variablenspalte anwenden, indem Sie "Variablentabelle.Variable.apply (Wert)" ausführen. Eine neue Ergebnisspalte wird mit "Variablentabelle ['Ergebnis'] = ..." erstellt.
python3
print('Zielfunktion',value(Modell-.objective)) # Zielfunktionの表示
print(Variablentabelle) # Variablentabelleの表示
Ergebnisse erneut veröffentlicht
Zielfunktion 95.0
Rohstoff 1 Rohstoff 2 Rohstoff 3 Gewinnvariable Ergebnis
Produkt 1 1 4 3 5.0 v0001 15.0
Produkt 2 2 4 1 4.0 v0002 5.0
Wenn Sie 15 für Produkt 1 und 5 für Produkt 2 machen, werden Sie feststellen, dass der Gesamtgewinn maximal 95 beträgt.
—— Lesen Sie Bücher und schauen Sie im Internet nach.
Let's enjoy Mathematical Optimization!
Recommended Posts