python - 具有 python 字典值的 Gurobi 目标

标签 python python-2.7 dictionary mathematical-optimization gurobi

我正在使用 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/

相关文章:

python - 心理学/Postgres : Connections hang out randomly

python - youtube-dl 只提取播放列表信息

python - 在windows上编译疯狂的python

python - 使用哪个三元运算符?

java - 在 Java 中将 List<> 内容过滤到字典中

python - 从无限 While 循环保存到文本文件

python - 绘制前 10 名与所有其他值的对比图

python-2.7 - Python多维数组

带有自定义键的 C++ 映射

javascript - Scala 嵌套可更新映射?