2016-05-16 272 views
3

我需要使用不同的約束集來優化模型,但是這些約束的子集對於每個模型都是相同的。我的想法是建立一個包含所有變量和每次需要的所有約束的基礎模型。但是,它看起來不像Gurobi Model.copy()方法以我想象的方式複製變量。這是我希望能做的非常簡化的版本,它顯示我得到的錯誤。爲什麼在使用Model.copy()之後得到「GurobiError:變量不在模型中」?

>>> 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> = 0)爲什麼可以找到變量v時m.getVars() 清楚地示出v是在模型?
  2. 是否有任何其他方式重用 中的同一組變量和約束,以避免從頭重建每個模型?

軟件:Python的2.7.11和Gurobi 6.5 OS X埃爾卡皮坦(也在Ubuntu 15.04測試)

回答

1

我無法找到一個明確的答案問題1,爲什麼在m.getVars v ()在原始示例中返回True。我認爲「in」只是比較對象內的值而不是對象本身,但我沒有這方面的來源。

至於第二個問題,我發現了一個解決方案:

  1. 創建名稱變量,保存的名稱。
  2. 複製模型。
  3. 使用名稱複製映射變量。

簡單的例子:

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

...等等。

相關問題