我需要优化具有不同约束集的模型,但这些约束的子集对于每个模型都是相同的。我的想法是构建一个包含每次都需要的所有变量和所有约束的基本模型。但是,它看起来并不像 Gurobi Model.copy() 方法按照我想象的方式复制变量。这是我希望做的事情的一个非常简化的版本,它显示了我遇到的错误。
>>> from gurobipy import Model
>>> m0 = Model("test")
>>> v = m0.addVar(lb=-1, ub=1)
>>> m0.update()
>>> print m0
<gurobi.Model Continuous instance test: 0 constrs, 1 vars, Parameter changes: LogFile=gurobi.log>
>>> print v in m0.getVars()
True
>>> m = m0.copy()
>>> print m
<gurobi.Model Continuous instance test_copy: 0 constrs, 1 vars, Parameter changes: LogFile=gurobi.log>
>>> print v in m.getVars()
True
>>> m0.addConstr(v <= 0)
<gurobi.Constr *Awaiting Model Update*>
>>> m0.update()
>>> print m0
<gurobi.Model Continuous instance test: 1 constrs, 1 vars, Parameter changes: LogFile=gurobi.log>
>>> m.addConstr(v >= 0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "model.pxi", line 2196, in gurobipy.Model.addConstr (../../src/python/gurobipy.c:66304)
File "model.pxi", line 2089, in gurobipy.Model.__addConstr (../../src/python/gurobipy.c:64663)
gurobipy.GurobiError: Variable not in model
>>> print m
<gurobi.Model Continuous instance test_copy: 0 constrs, 1 vars, Parameter changes: LogFile=gurobi.log>
- 为什么 m.getVars() 时 m.addConstr(v >= 0) 找不到变量 v
清楚地表明 v 在模型中?
- 有没有其他方法可以重用同一组变量和约束
为了避免从头开始重建每个模型?
软件:OS X El Capitan 上的 Python 2.7.11 和 Gurobi 6.5(也在 Ubuntu 15.04 上进行了测试)
对于问题 1,我找不到关于为什么 m.getVars() 中的 v 在原始示例中返回 True 的明确答案。我想“in”只是比较对象内的值而不是对象本身,但我没有这方面的来源。
对于问题2,我找到了解决办法:
- 创建带有名称的变量,保存名称。
- 复制模型。
- 使用名称映射副本中的变量。
简单的例子:
from gurobipy import Model
m0 = Model("test")
v_name = 'v'
v0 = m0.addVar(lb=-1, ub=1, name=v_name)
m0.update()
m = m0.copy()
# returns True
print v0 in m.getVars()
m0.addConstr(v0 <= 0)
m0.update()
# won't work
#m.addConstr(v0 >= 0)
# will work
v = m.getVarByName(v_name)
m.addConstr(v >= 0)
m.update()
更复杂的例子:
from gurobipy import Model
v_name = {}
m0 = Model("test")
v0 = {}
for i in range(10):
v_name[i] = "v{0}".format(i)
v0[i] = m0.addVar(lb=-1, ub=1, name=v_name[i])
m0.update()
m = m0.copy()
v = {}
for i in range(10):
m0.addConstr(v0[i] <= 0)
v[i] = m.getVarByName(v_name[i])
m.addConstr(v[i] >= 0)
m0.update()
m.update()
... 等等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)