在 Python 中使用 Gurobi 并添加变量

Using Gurobi in Python and adding variables

我正在尝试编写我的第一个 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);忽略括号。

更清楚的是,以下是我试图通过使用字典 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 创建这些变量?

谢谢!

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

您似乎想要创建 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")

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

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()]}