Mittlerweile habe ich es schon 100 mal gelesen, Artikel mit den Titeln "Why you don't want to dynamically create variables" oder "Keep data out of your variable names". Diese machen auch unheimlich viel Sinn und verweisen immer wieder auf Dictionaries bzw. Listen, dennoch komme ich aber bei meinem jetzigen Problem nicht weiter. Ich glaube die Umsetzung ist relativ trivial, leider sehe ich zum jetzigen Zeitpunkt aber den Wald vor lauter Bäumen nicht.
Zum Hintergrund: Ich nutze derzeit Pulp um ein Lineares Programm (Optimierungsproblem unter Randbedingungen aus der BWL) zu formulieren. Im Vorfeld weiß ich, dass ich 2 Motoren ansteuere (Motor A und Motor B) und 1400 Zeitinkremente habe. Dazu habe ich für jeden Zeitschritt eine binäre Variable xa (für Motor A) und eine xb (für Motor B), wobei 1 jeweils "An" und 0 eben "Aus" bedeutet. Durch technische Restriktionen, welche ich durch die Formulierung der Randbedingungen berücksichtige, habe ich zusätzlich noch für jeden Zeitschritt die binäre Variablen sa und sb (ob Motor A bzw. B in t startet) und eben ha und hb (ob Motor A bzw. B in t hält).
Die Modellerstellung, das Lösen mittels Gurobi, etc. hat bis jetzt alles wunderbar geklappt. Jetzt möchte ich diese Modellerstellung aber eben parametrieren, d.h. dass ich es als Funktion aufrufe und im Vorfeld nicht weiß, ob ich Motor A & B habe oder vielleicht Motor A, Motor B, Motor C und Motor D.
Ich zeig euch einfach mal was ich meine:
So habe ich es am Anfang per Hand gemacht:
Code: Alles auswählen
from pulp import *
prob_kssplus = LpProblem("prob_kssplus",LpMinimize)
xa0 = LpVariable("xa0",0,1,LpInteger)
xa1 = LpVariable("xa1",0,1,LpInteger)
xa2 = LpVariable("xa2",0,1,LpInteger)
xa3 = LpVariable("xa3",0,1,LpInteger)
...
xb0 = LpVariable("xb0",0,1,LpInteger)
xb1 = LpVariable("xb1",0,1,LpInteger)
xb2 = LpVariable("xb2",0,1,LpInteger)
xb3 = LpVariable("xb3",0,1,LpInteger)
...
(usw. undsofort, analog fuer sa,ha,sb,hb)
Code: Alles auswählen
xa = dict()
sa = dict()
ha = dict()
xb = dict()
sb = dict()
hb = dict()
for i in range(1400):
# Komponente a
xa[i]=LpVariable('xa'+str(i).zfill(5),0,1,LpInteger)
sa[i]=LpVariable('sa'+str(i).zfill(5),0,1,LpInteger)
ha[i]=LpVariable('ha'+str(i).zfill(5),0,1,LpInteger)
# Komponente b
xb[i]=LpVariable('xb'+str(i).zfill(5),0,1,LpInteger)
sb[i]=LpVariable('sb'+str(i).zfill(5),0,1,LpInteger)
hb[i]=LpVariable('hb'+str(i).zfill(5),0,1,LpInteger)
Circa so:
Code: Alles auswählen
motoren = ["A","B","C"] #Die bekomme ich dann von extern übergeben
zustaende =["x","s","h"]
for motor in motoren:
for zustand in zustaende:
for i in range(1400):
zustand+motor+i = LpVariable(zustand+motor+str(i).zfill(5),0,1,LpInteger) #Ist natürlich quatsch was hier steht, soll nur den Sinn verdeutlichen
Gruß
Hendrik