1

我将 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 甚至允许这样的字典引用吗?甚至允许吗?

4

1 回答 1

4

对于您的代码中有些复杂的因果链d[(x,y)]等价于d[(0,1)],因此常数 -5 最终成为您的目标函数。原因是

  • gurobi.Var 定义了 __hash__
  • gurobi.Var 定义了 __cmp__ 。它总是返回一个真实的对象
  • 在您的情况下, x 和 y 的哈希值为 0 和 1
  • python字典查找算法将d[(x,y)]解析为d[(0,1)]

您尝试做的事情不适合整数编程框架。将其放入 gurobi 的最佳方法是添加x 和 y 具有特定值的指标变量

于 2015-02-01T19:24:27.193 回答