class WagnerWhitin:
def __init__(self):
pass
def run(self, dict_in, demand):
# Variablen definieren
var_kosten = dict_in["varCost"]
fix_kosten = dict_in["fixedCost"]
bestellung = np.array(demand) # Liste von den Bestellungen
anz_periode = len(demand) # Anzahl der Periode
min_kosten = 0 # Minimale Kosten
kosten = [[0 for i in range(anz_periode)] for j in range(anz_periode)] # Kostenmatrix
min_liste = [0 for i in range(anz_periode)] # liste von den minimalen Kosten je Periode
periode_liste = [] # liste von den Bestellperioden
bestellte_menge = [0 for i in range(anz_periode)] # Liste von den bestellten Mengen je Bestellperiode
i = 0
# aussuchen der Null Bestellungen ganz am Anfang
# beginnen mit der ersten Nicht-Null Bestellung
while bestellung[i] == 0:
bestellte_menge[i] = 0
i = i + 1
if i == anz_periode:
i = i - 1
break
# Beginn der Schleife von Kostenmatrix
for i in range(anz_periode):
if bestellung[i] > 0 or i == (
anz_periode - 1
): # Bedingung erfüllt, wenn die Bestellmenge nicht null ist oder ganz am Ende der Bestellperiode
for j in range(i, anz_periode):
kosten[j][i] += fix_kosten + min_kosten
for k in range(i + 1, j + 1):
kosten[j][i] += var_kosten * (k - i) * bestellung[k]
min_kosten = min(filter(None, kosten[i]))
min_liste[i] = min_kosten
# Surely this must have been a mistake?
# else:
# i += 1
# Rückwarts Schleife, Aussuchen der Bestellperiode,
# mit der Beachtung, dass es Null Bestellungen dazwischen geben
periode = anz_periode
while periode != 0:
if (
bestellung[periode - 1] != 0
): # Wenn die Bestellung von vorherigen Periode gleich null ist, dann geht es zu vor vorherigen Periode
index = kosten[periode - 1].index(min_liste[periode - 1])
periode_liste.insert(0, index)
periode = index
if periode == 0:
break
else:
periode = periode - 1
# Berechnung der bestellten Mengen je Bestellperiode
anz_bestellperiode = len(periode_liste)
for i in range(anz_bestellperiode):
start = periode_liste[i]
if i < (anz_bestellperiode - 1):
for j in range(start, periode_liste[i + 1]):
bestellte_menge[periode_liste[i]] += bestellung[j]
else:
for j in range(start, anz_periode):
bestellte_menge[periode_liste[i]] += bestellung[j]
# Definieren der Output Array
return np.array([0]) if len(demand) == 0 or bestellung.max() == 0 else np.array(bestellte_menge)