使用Model.copy()后,为什么会出现“GurobiError:变量不在模型中”?

时间:2016-05-16 21:40:23

标签: python gurobi

我需要使用不同的约束集优化模型,但这些约束的子集对于每个模型都是相同的。我的想法是建立一个基础模型,其中包含所有变量和每次都需要的所有约束。但是,它看起来不像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>
  1. 为什么m.addConstr(v&gt; = 0)在m.getVars()时找不到变量v 清楚地显示v在模型中?
  2. 还有其他方法可以重用同一组变量和约束 为了避免从头开始重建每个模型?
  3. 软件:OS X El Capitan上的Python 2.7.11和Gurobi 6.5(也在Ubuntu 15.04上测试)

1 个答案:

答案 0 :(得分:1)

我无法找到问题1的明确答案,为什么m.getVars()中的v在原始示例中返回True。我想象着&#34;在&#34;只是比较对象中的值而不是对象本身,但我没有这个来源。

至于问题2,我找到了一个解决方案:

  1. 使用名称创建变量,保存名称。
  2. 制作模型副本。
  3. 使用名称在副本中映射变量。
  4. 简单示例:

    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()
    

    ......等等。