Trying to define a 6 dimensional variable and I get too many values to unpack error

Tag: python , iterable-unpacking , gurobi Author: wubo438547641 Date: 2014-04-23

I am trying to use gurobi library in python (gurobi is an optimization library ) I got this error ---- Value Error: too many values to unpack

I'm trying to define a 6 dimensional variable in python. I defined each dimension as a list the dimensions were games, shifts, hours, pits, order1 and order2 Since only some combinations of these 6 dimensions are valid I defined combo as tuplelist to specify which combos exist. Then I wanted to define variables with the valid combos. Some of the objects like tuplelist and addVar comes with gurobipy library
The python code is :

from gurobipy import*
m=Model('mymodel')

combo, oi =multidict( {'(1,1,bj,1,1,1)': 100,
  '(1,1,bj,1,1,2)':200,
  '(1,1,bj,1,1,3)':200,
  '(1,1,bj,1,2,1)':50,
  '(1,1,bj,1,2,2)':70,
  '(1,1,bj,1,2,3)':70,
  '(1,1,cr,1,1,1)':400,
  '(1,1,cr,1,1,2)':450})

combo =tuplelist(['(1,1,bj,1,1,1)',
  '(1,1,bj,1,1,2)',
  '(1,1,bj,1,1,3)',
  '(1,1,bj,1,2,1)',
  '(1,1,bj,1,2,2)',
  '(1,1,bj,1,2,3)',
  '(1,1,cr,1,1,1)',
  '(1,1,cr,1,1,2)'])

x={}
for s,t,i,p,n,m in combo:
    x[s,t,i,p,n,m] = m.addVar(vtype=GRB.BINARY, obj=oi[s,t,i,p,n,m],name=s+","+t+","+i+","+p+","+n+","+m)
What happens when you run the code, and how does it differ from what you are trying to achieve?

Best Answer

Your "combo" variable is a string which you can't unpack into multiple variables. Your code also, if your code did run, the "m" variable is used to store your model, would be overwritten in the for loop.

from gurobipy import *
model=Model('mymodel')

combos, oi =multidict( {
    (1,1,'bj',1,1,1):100,
    (1,1,'bj',1,1,2):200,
    (1,1,'bj',1,1,3):200,
    (1,1,'bj',1,2,1):50,
    (1,1,'bj',1,2,2):70,
    (1,1,'bj',1,2,3):70,
    (1,1,'cr',1,1,1):400,
    (1,1,'cr',1,1,2):450})

x={}
for combo in combos:
    x[combo] = model.addVar(vtype=GRB.BINARY, 
                                  obj=oi[combo],
                                  name=".".join(map(str, combo)))

comments:

Thank you David. The following also worked : def label(c): return "x" + str(c).translate(None, " '")combo, oi = multidict( { (1,1,'bj',1,1,1): 100, (1,1,'bj',1,1,2):200, (1,1,'bj',1,1,3):200, (1,1,'bj',1,2,1):50, (1,1,'bj',1,2,2):70, (1,1,'bj',1,2,3):70, (1,1,'cr',1,1,1):400, (1,1,'cr',1,1,2):450 }) x={} # for s,t,i,p,n,k in combo: # x[s,t,i,p,n,k] = m.addVar(vtype=GRB.BINARY, obj=oi[s,t,i,p,n,k], # name=label((s,t,i,p,n,k)))