我正在使用 Gurobi 6.0 和 Python 2.7。我很想知道 Gurobi 是否允许目标函数的值来自带有决策变量索引的字典。附上代码:
from gurobipy import *
d = {
(0, 0): 0,
(0, 1): -5,
(1, 0): 4,
(1, 1): 2,
(2, 0): 0,
(0, 2): 10
}
m = Model()
x = m.addVar(vtype=GRB.INTEGER)
y = m.addVar(vtype=GRB.INTEGER)
m.update()
m.addConstr(x + y <= 2)
m.setObjective(d[(x, y)], GRB.MAXIMIZE)
m.optimize()
print m.objVal
print x.x
print y.x
模型的答案是
-5.0
-0.0
-0.0
这显然没有意义,因为根据给定数据,max(d[(x,y)]) = 10 发生在 x=0 和 y=2 处。这里的问题是什么? Gurobi 甚至允许这样的字典引用吗?甚至允许吗?
最佳答案
对于一个有点复杂的因果链 d[(x,y)]
在你的代码中等同于 d[(0,1)]
,所以常量 - 5 最终成为您的目标函数。原因是
- gurobi.Var 定义了 __hash__
- gurobi.Var 定义了 __cmp__。它总是返回一个真实的对象
- 在你的例子中,x 和 y 的哈希值为 0 和 1
- Python 字典 lookup algorithm将 d[(x,y)] 解析为 d[(0,1)]
您尝试做的事情不适合整数编程框架。将其放入 gurobi 的最佳方法是添加 indicator variables x 和 y 取特定值。
关于python - 具有 python 字典值的 Gurobi 目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28261089/