2017-07-21 4 views
1

Mein Code:ERROR GUROBI: Liste Index außerhalb des zulässigen Bereichs

import sys 
import gurobipy as grb 

GRB = grb.GRB 

m = grb.Model() 

m.Params.timeLimit = 3600 

b = m.addVars(10,10,15, vtype=GRB.BINARY) 
F = m.addVars(vtype=GRB.INTEGER) 

m.addConstrs(F == (b.sum(x,y,z) for x in range(10) for y in range(10) for z in range(15))) 

for x in range(10): 
    for y in range(10): 
     m.addConstrs(sum(b[x][y][z] for z in range(15)) <= 1) 

for z in range(15): 
    for y in range(10): 
     m.addConstrs(sum(b[x][y][z] for x in range(10)) <= 1) 

for x in range(10): 
    for z in range(15): 
     m.addConstrs(sum(b[x][y][z] for y in range(10)) <= 1) 

m.setObjective(F, GRB.MAXIMIZE) 
m.update() 
result = m.optimize() 

Der Code soll 10 Lehrer nehmen, 10 Klassenräume und 15 Stunden und geben die Anzahl der einzigartigen Zeitpläne, die gefunden werden können, als solche, für jedes (x, y, z) gibt es a (x ', y', z ') mit (x! = x'), (y! = y ') und (z! = z').

Die Idee hier war eine 3D "Matrix" mit Binärzahlen. Wenn 1, Lehrer x ist im Klassenzimmer y zur Zeit z, wenn 0, frei.

Das Problem, das ich habe, ist ein IndexError: Listenindex außerhalb des Bereichs. Ich habe x von 1 bis 10, y von 1 bis 10 und z von 1 bis 15.

Ich schätze alle Hilfe.

edit: nur für den Fall, ich bin einfügen Fehler hier:

Changed value of parameter timeLimit to 3600.0 
    Prev: 1e+100 Min: 0.0 Max: 1e+100 Default: 1e+100 
Traceback (most recent call last): 
    File "exec2.py", line 14, in <module> 
    F = m.addVars(vtype=GRB.INTEGER) 
    File "model.pxi", line 2261, in gurobipy.Model.addVars (../../src/python/gurobipy.c:73898) 
    File "model.pxi", line 198, in gurobipy.__listify.__init__ (../../src/python/gurobipy.c:47440) 
IndexError: list index out of range 

Antwort

1

Model.addConstr() nimmt einen linearen Ausdruck (LinExpr Objekt), während Model.addConstrs() einen Ausdruck Python-Generator nimmt. Sie sollten Ihre Einschränkungen wie folgt umschreiben:

m.addConstr(F == b.sum('*','*','*')) 
m.addConstrs(b.sum(x,y,'*') <= 1 for x in range(10) for y in range(10)) 
m.addConstrs(b.sum('*',y,z) <= 1 for y in range(10) for z in range(15)) 
m.addConstrs(b.sum(x,'*',z) <= 1 for x in range(10) for z in range(15)) 
Verwandte Themen