Gurobi Modell wiederholt lösen

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

Hallo,
ich würde gerne ein Gurobi Modell k-mal lösen. Problem dabei ist , dass eine
Fehlermeldung bei den Zielfunktionen kommt.

Das Modell sieht folgendermaßen aus:

Code: Alles auswählen

from gurobipy import Model
import numpy as np
import gurobipy as GRB
from gurobipy import quicksum
models = {}
objective = {}
y= {}
omega = {}
c19 = {}
c20 = {}
obj = {}
K = np.arange(1)
L = np.arange(1) 
n = np.arange(144)
tau = np.arange(360)
f = np.array([100] * 16 + [400] *16 + [150] * 56 + [600] *56)
teta = np.array([400] * 16 + [1600] * 16 + [600] * 56 + [2400] *56)


for k in K:
                 models[k] = Model("RLP")
                 y[k] = models[k].addVars(tau, n, name="y")
                 omega[k] = models[k].addVars(L, tau, n, name="omega")
                 models[k].update()
                 obj[k] = models[k].setObjective(quicksum(f[j]*y[k][t, j] for t, j in y) , GRB.MAXIMIZE)
Dabei kommt folgende Fehlermeldung heraus:
'numpy.int32' object is not iterable
Kann mir jemand helfen das Problem zu lösen?

Liebe Grüße
__deets__
User
Beiträge: 14522
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und in welcher Zeile? Bitte poste den *gesamten* Stacktrace, dann kann man das sehen.
schuesra
User
Beiträge: 26
Registriert: Donnerstag 4. Oktober 2018, 17:40

Der Fehler kommt in der letzten Zeile, also da wo ich versuche die Zielfunktionen zu erstellen.


File "<ipython-input-44-fea71d194b0b>", line 25, in <genexpr>
obj[k] = models[k].setObjective(quicksum(f[j]*y[k][t, j] for t, j in y) , GRB.MAXIMIZE)

TypeError: 'numpy.int32' object is not iterable
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@schuesra: Du versuchst da die Schlüssel des Wörterbuchs `y` jeweils auf *zwei* Namen zu verteilen. Dazu müssten die Schlüssel aus iterierbaren Objekten mit jeweils zwei Elementen bestehen. Das tun sie offenbar nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
schuesra
User
Beiträge: 26
Registriert: Donnerstag 4. Oktober 2018, 17:40

Wie meinst du das mit jeweils auf zwei Namen verteilen? Verstehe nicht wirklich deine Hilfestellung. Könntest du es vielleicht anders erklären?
So wie ich dich verstehe reicht das eine k nicht aus. Du meinst weil ich einmal models[k] schreibe und einmal y[k]?
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@schuesra: Du schreibst ``… for t, j in y`` und dafür müsste `y` ja irgendie jweils *zwei* Werte liefern um die auf `t` und `j` zu verteilen. An der Stelle wird vielleicht klar warum man nicht so sauschlechte Namen ohne irgendeine Bedeutung verwenden sollte, denn wenn da stehen würde was die Werte jeweils bedeuten sollen, fallen solche Fehler schon beim schreiben, oder mindestens beim Lesen des Quelltextes auf. `y` ist ein Wörterbuch, das müsste also so etwas wie Tupel als Schlüssel haben, damit dieser Teil des Ausdrucks nicht zu der Ausnahme führt.

Code: Alles auswählen

In [17]: y = {42: 'answer'}

In [18]: for a, b in y:
    ...:     print(a, b)
    ...: 
    ...:     
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-18-41dca7560709> in <module>()
----> 1 for a, b in y:
      2     print(a, b)
      3 

TypeError: 'int' object is not iterable

In [19]: y = {(42, 23): 'answer'}

In [20]: for a, b in y:
    ...:     print(a, b)
    ...:     
42 23
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
schuesra
User
Beiträge: 26
Registriert: Donnerstag 4. Oktober 2018, 17:40

Soweit verstanden, allerdings bekomme ich auch eine Fehlermeldung wenn ich das ändere:

Code: Alles auswählen

 obj[k] = models[k].setObjective(quicksum(f[j]*y[k][t, j] for t in tau for j in n) , GRB.MAXIMIZE)
Dabei kommt folgende Fehlermeldung: TypeError: 'builtin_function_or_method' object is not subscriptable
Es ist sehr schwierig für mich als Nichtinformatiker mit den Fehlermeldungen umzugehen. Ich sitze schon seit mehreren Tagen an dieser einen Zeile und werde so langsam wahnsinnig :/
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

Du versucht aif eine Funktion wie auf eine Liste zuzugreifen.
print[0] zum Beispiel.
Benutzeravatar
__blackjack__
User
Beiträge: 13068
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@schuesra: Da habe ich jetzt keine Lust das Anhand des Quelltextes nachzuvollziehen. Schau halt einfach mal was genau an der Zeile das Problem ist. Also lass Dir davor mal die Werte hinter den einzelnen Namen und Teilausdrücken ausgeben, solange bis Du es auf ein minimales Beispiel eingedampft hast. Irgend etwas bei dem Ausdruck ist halt nicht das was Du denkst was es ist, also musst Du Deine Erwartung an die einzelnen Werte und Zwischenergebnisse mal überprüfen. Neben den Werten, könnte die Ausgabe des jeweiligen Typs auch helfen. Den Typ eines Wertes kann man mit der `type()`-Funktion ermitteln.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten