Цель Gurobi со значениями словаря Python
Я использую Gurobi 6.0 с Python 2.7. Мне любопытно узнать, позволяет ли Гуроби целевой функции иметь значения из словаря с индексами переменных решения. Прикрепление кода:
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 согласно заданным данным. В чем здесь проблема? Разрешает ли Гуроби такие словарные ссылки? Это даже разрешено?
1 ответ
Для несколько сложной причинной цепочки d[(x,y)]
в вашем коде эквивалентно d[(0,1)]
Таким образом, константа -5 становится вашей целевой функцией. Причины
- gurobi.Var определил __hash__
- gurobi.Var определил __cmp__. Возвращает правдивый объект
- В вашем случае х и у имеют хэш-значения 0 и 1
- Алгоритм поиска в словаре Python разрешает d[(x,y)] в d[(0,1)]
То, что вы пытаетесь сделать, не вписывается в структуру целочисленного программирования. Лучший способ поместить это в gurobi - переменные индикатора, которые x и y принимают определенные значения.