在Python中使用Gurobi并添加变量

时间:2017-05-18 12:01:27

标签: python-2.7 optimization gurobi

我正在尝试编写我的第一个Gurobi优化代码,这是我坚持的地方:

我的第一个下标有以下字典:

输入for k in range(1,11): i[k] = int(k) print i

输出{1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10}

而且,我的第二个下标有以下词典:

c_il = {1: 2, 2: 1, 3: 1, 4: 4, 5: 3, 6: 4, 7: 3, 8: 2, 9: 1, 10: 4}

c_iu = {1: 3, 2: 2, 3: 2, 4: 5, 5: 4, 6: 5, 7: 4, 8: 3, 9: 2, 10: 5}

我正在尝试创建如下变量:

x = m.addVars(i, c_il, vtype=GRB.BINARY, name="x")
x = m.addVars(i, c_iu, vtype=GRB.BINARY, name="x")

显然,它没有给出我想要的东西。我要找的是x_(i),(c_il)x_(i),(c_iu);忽略括号。

更清楚的是,以下是我尝试使用dicts ic_ilc_iu获取的内容:

{1: <gurobi.Var x[1,2]>,
 2: <gurobi.Var x[2,1]>,
 3: <gurobi.Var x[3,1]>,
 4: <gurobi.Var x[4,5]>,
 5: <gurobi.Var x[5,3]>,
 6: <gurobi.Var x[6,4]>,
 7: <gurobi.Var x[7,3]>,
 8: <gurobi.Var x[8,2]>,
 9: <gurobi.Var x[9,1]>,
 10: <gurobi.Var x[10,4]>,
 11: <gurobi.Var x[1,3]>,
 12: <gurobi.Var x[2,2]>,
 13: <gurobi.Var x[3,2]>,
 14: <gurobi.Var x[4,5]>,
 15: <gurobi.Var x[5,4]>,
 16: <gurobi.Var x[6,5]>,
 17: <gurobi.Var x[7,4]>,
 18: <gurobi.Var x[8,3]>,
 19: <gurobi.Var x[9,2]>,
 20: <gurobi.Var x[10,5]>}

由于我到处都在使用字典,因此我希望通过继续使用字典来保持一致,以便我可以使用我的参数进行乘法和加法,这些参数都在字典中。有没有办法用m.addVars或m.addVar创建这些变量?

谢谢!

编辑:修改以使其更清晰。

2 个答案:

答案 0 :(得分:1)

看起来你想创建10个由某个东西索引的变量。执行此操作的最佳方法是将两个索引创建为列表。如果你想要x [12],x [21],那么写:

from gurobipy import *

m = Model()
il = [ 12, 21, 31, 44, 53, 64, 73, 82, 91, 104 ]
x = m.addVars(il, vtype=GRB.BINARY, name="x")

如果你想写x [1,2],x [2,1],那么写:

from gurobipy import *

m = Model()
il = [ (1,2), (2,1), (3,1), (4,4), (5,3), (6,4), (7,3), (8,2), (9,1), (10,4) ]
x = m.addVars(il, vtype=GRB.BINARY, name="x")

答案 1 :(得分:0)

经过几年的经验,我可以轻松地将以下内容写为答案。由于我过去关心的是保持字典原样(我强烈批评和质疑......),一个快速的解决方案如下。

x = {}
for (i,j) in c_il.items():
    x[i,j] = m.addVar(vtype=GRB.BINARY, name="x%s"%str([i,j]))
for (i,j) in c_iu.items():
    x[i,j] = m.addVar(vtype=GRB.BINARY, name="x%s"%str([i,j]))

或者,

x = {(i,j): m.addVar(vtype=GRB.BINARY, name="x%s"%str([i,j])) 
         for (i,j) in c_il.items()}
for (i,j) in c_iu.items():
    x[i,j] = m.addVar(vtype=GRB.BINARY, name="x%s"%str([i,j]))

一个班轮替代品:

x = {(i,j): m.addVar(vtype=GRB.BINARY, name="x%s"%str([i,j])) 
     for (i,j) in [(k,l) for (k,l) in c_il.items()] + [(k,l) for (k,l) in c_iu.items()]}