Optimalwerte der Dualvariablen in Gurobi Modell

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
schuesra
User
Beiträge: 26
Registriert: Donnerstag 4. Oktober 2018, 17:40

Ich bin am verzweifeln. Ich versuche ein Gurobi Modell zu implementieren und soweit funktioniert auch alles und bekomme sinnvolle Zielfunktionswerte heraus. Für jedes "b" greife ich auf andere unterschiedliche Teile des D_tj_RLP Arrays und des S_tj_RLP Arrays zurück.
Daher bekomme ich für jedes "b" einen anderen Zielfunktionswert. Es kommen auch immer die gleichen Werte heraus, wenn ich das Programm neu aufrufe. Nun das Problem: Ich möchte auf die optimalen Werte der Dualvariablen zugreifen. Diese existieren für jedes i und jedes l. Diese lassen sich anhand constraint 19 herausfinden. Diese werden mir auch ausgegeben. Wenn ich allerdings die Funktion wiederholt aufrufe, dann werden mir andere Werte zurückgegeben und das kann ja absolut nicht sein. Gleicher Code, aber andere Rückgabewerte, wie kann das sein? Ich habe euch mal den Code reinkopiert und hoffe, dass ihr damit was anfangen könnt. Falls ihr den Code für die Übergabearrays braucht, kann ich den gerne auch noch posten. Zur Übersicht zunächst mal das Gurobi Modell:

Code: Alles auswählen

# Model
def berechne_BP_RLP(f, teta, flugkapazität, a, D_tj_RLP, S_tj_RLP, flüge, perioden, produkte,  nshowupsamples):
    m = Model("RLP")
    
#Erstelle Entscheidungsvariablen für die akzeptierten BA der jeweiligen Produkte
#decision varibales
    accept = m.addVars(perioden, produkte, name="accept")
    denie = m.addVars(nshowupsamples, perioden, produkte, name="denie")
    m.update()

#Objective (18)
    obj = sum(f[j]*accept[t, j] for t,j in accept) - 0.005*sum(teta[j]*denie[l, t, j] for l in nshowupsamples for t in perioden for j in produkte)
    m.setObjective(obj, GRB.MAXIMIZE)

#constraint 19
    c19 = m.addConstrs(sum(a[i,j]*(S_tj_RLP[l, t, j]*accept[t,j] - denie[l,t,j])
            for t in perioden for j in produkte) <= flugkapazität[i] for i in flüge for l in nshowupsamples)

#constraint 20
    m.addConstrs(denie[l,t,j] <= S_tj_RLP[l, t, j]*accept[t,j]
                for l in nshowupsamples for t in perioden for j in produkte)

#constraint 21
    m.addConstrs(accept[t, j] <= D_tj_RLP[t, j] for t,j in accept)

    m.optimize()
    
    for i in flüge:
        for l in nshowupsamples:
            bp[i,l]= c19[i,l].Pi
            bpi[i] = bp[i,:].sum()

    return bpi[0], bpi[1], bpi[2], bpi[3]
    

for b in range(12):
    myy[b] = berechne_BP_RLP(f, teta, flugkapazität, a, D_tj_RLP[b], S_tj_RLP[200*(b+1)-200:200*(b+1)], flüge, perioden, produkte, nshowupsamples)
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Die Funktion ist auf jeden Fall nicht ”pure”. Da werden mindestens zwei Objekte einfach so ausserhalb der Funktion verändert, so dass man sich nicht sicher sein kann, das tatsächlich beim nächsten Aufruf mit den gleichen Daten gearbeitet wird.

Zudem kann es schon sein, dass bei Optimierungsalgorithmen nicht deterministisch vorgegangen wird. Sei es weil das tatsächlich explizit im Algorithmus steht, oder weil Datenstrukturen verwendet werden, bei denen es beispielsweise keine Garantien über die Reihenfolge der Elemente gibt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten