2016-02-09 1 views
0

J'espère que ce n'est pas un doublon mais je n'arrive pas à trouver une réponse spécifique à ce problème. Je suis assez nouveau sur Python, donc ça peut être évident mais je n'arrive pas à trouver mon erreur. Donc, le problème est: J'utilise gurobi pour optimiser un modèle de flux réseau. Mais j'ai du mal à formuler les contraintes parce que je dois itérer sur 2 variables (je suppose que c'est le problème).Optimisation en Python: l'objet 'Var' n'est pas itérable

Voici le premier code:

from gurobipy import * 
import optimization 

def beer(P, S, W, SP, g, d, b, c, m, n): 

    # Create new model 
    m = Model("Beer-Flow") 

    # Create variables 
    x = { (i,j,p) : m.addVar(name = "x[%s,%s,%s]" % (i,j,p)) for i,j in W for p in P } 
    y = { (i,j) : m.addVar(name = "y[%s,%s]" % (i,j)) for i,j in W } 

    # Integrate variables 
    m.update() 

    # Set objective 
    m.setObjective(quicksum(y[i,j] * d[i,j] * c for (i,j) in W), GRB.MINIMIZE) 

    # Add constraints 
    for i in S: 
     m.addConstr((quicksum(x[i2,j,p])for p in P for (i2,j) in W if i2 == i) - (quicksum(x[i2,j,p]for p in P for (i2,j) in W if j == i)) == b[i,p]) 

    for i,j in W: 
     m.addConstr(m * y[i,j] >= (quicksum(x[i,j,p] * w[p] for p in P))) 
     m.addConstr(n * y[i,j] >= (quicksum(x[i,j,p] for p in P))) 

    return m 

# Fill sets and parameters 
P, g = multidict({"full" : 12, "empty" : 4 }) 
S = {"Brauerei","München","Stuttgart","Göttingen","Bielefeld","Magdeburg" } 
W, d = multidict({("Brauerei", "München") : 558, ("Brauerei", "Stuttgart") : 437, ("Brauerei","Göttingen") : 142, 
        ("Brauerei", "Bielefeld") : 45, ("Brauerei", "Magdeburg") : 290, ("München", "Brauerei") : 558,       
        ("München", "Stuttgart") : 232, ("München", "Göttingen") : 500, ("München", "Bielefeld") : 600, 
        ("München", "Magdeburg") : 523, ("Stuttgart", "Brauerei") : 437, ("Stuttgart", "München") : 232, 
        ("Stuttgart", "Göttingen") : 408, ("Stuttgart", "Bielefeld") : 492, ("Stuttgart", "Magdeburg") : 572, 
        ("Göttingen", "Brauerei") : 142, ("Göttingen", "München") : 500, ("Göttingen", "Stuttgart") : 408, 
        ("Göttingen", "Bielefeld") : 180, ("Göttingen", "Magdeburg") : 197, ("Bielefeld", "Brauerei") : 45, 
        ("Bielefeld", "München") : 600, ("Bielefeld", "Stuttgart") : 492, ("Bielefeld", "Göttingen") : 180, 
        ("Bielefeld", "Magdeburg") : 254, ("Magdeburg", "Brauerei") : 290, ("Magedeburg", "München") : 523, 
        ("Magdeburg", "Stuttgart") : 572, ("Magdeburg", "Göttingen") : 197, ("Magdeburg", "Bielefeld") : 254})  
SP, b = multidict({("München", "full") : 1840, ("Brauerei", "empty") : -1700, ("Stuttgart", "full") : 1400, ("Stuttgart", "empty") : -1550, 
        ("Göttingen","full") : 380, ("Göttingen", "empty") : - 400, ("Bielefeld", "full") : 840, ("Bielefeld", "empty") : -800, 
        ("Magdeburg", "full") : 600, ("Magdeburg", "empty") : -500, ("Brauerei", "full") : -5600, ("Brauerei", "empty") : 4950}) 
c = 1 
m = 24000 
n = 2000 


# Create model for given sets and parameters 
m = beer(P, S, W, SP, g, d, b, c, m, n) 

# Run optimization and print results 
m.optimize() 
optimization.print_result(m) 

La partie qui ne fonctionne pas est:

for i in S: 
      m.addConstr((quicksum(x[i2,j,p])for p in P for (i2,j) in W if i2 == i) - (quicksum(x[i2,j,p]for p in P for (i2,j) in W if j == i)) == b[i,p]) 

L'erreur est: type 'Var' est pas itérables En Java par exemple que je pouvais le faire par deux boucles pour p et i (essayé en Python, ne fonctionnait pas), mais je n'ai aucune idée de comment je peux résoudre ce problème avec Python.

Nous vous remercions à l'avance

+0

S'il vous plaît donner un [mcve ] et le retraçage complet. – jonrsharpe

+2

Et pour votre propre santé mentale, utilisez des noms de variables plus descriptifs! – mhlester

Répondre

0

On dirait un paren au mauvais endroit:

m.addConstr((quicksum(x[i2,j,p])for p in P for (i2,j) in W if i2 == i) - (quicksum(x[i2,j,p]for p in P for (i2,j) in W if j == i)) == b[i,p]) 
          ^Closes the quicksum call on a single value, not the whole genexpr 

par rapport à l'autre utilisation de quicksum sur la même recherche:

m.addConstr((quicksum(x[i2,j,p])for p in P for (i2,j) in W if i2 == i) - (quicksum(x[i2,j,p]for p in P for (i2,j) in W if j == i)) == b[i,p]) 
                          ^Note no paren, so it's quicksum-ing the whole generator expression 
+0

Merci beaucoup! Ça fonctionne en ce moment. – Warj