【问题标题】:Gurobi objective with python dictionary values具有 python 字典值的 Gurobi 目标
【发布时间】:2015-03-31 09:59:22
【问题描述】:

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

【问题讨论】:

  • 你没有传递字典,你传递了一个值(0,如果xy默认为零); d[(x, y)] 在函数被调用之前 被评估,result 是参数。
  • 虽然默认 x 和 y = 0 有意义,但在这种情况下 m.objVal 不应该也返回 0 而不是 -5 吗?我不确定它是如何得出 -5 值的 ..

标签: python python-2.7 dictionary mathematical-optimization gurobi


【解决方案1】:

对于代码中的一个有点复杂的因果链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 具有特定值。

【讨论】:

  • 非常感谢大卫,这有帮助!
猜你喜欢
  • 1970-01-01
  • 2018-12-04
  • 1970-01-01
  • 2016-06-25
  • 2013-08-19
  • 2011-02-25
  • 2014-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多