2015-05-05 188 views
0

我需要反覆求解一個gurobi模型(每次迭代使用不同的變量值)。我沒有重建每次迭代的模型,而是嘗試設置模型,然後循環重複優化,但變量值不更新。這是一個簡單的例子。在Python中反覆求解Gurobi模型

n = Model("Test") 
a = n.addVar(lb=0,name = "a") 
b = n.addVar(lb=0,name = "b") 
a=1 
b=1 
x = n.addVar(lb=0,name = "x") 
y = n.addVar(lb=0,name = "y") 
n.update() 
n.setObjective(a*x + b*y,GRB.MAXIMIZE) 
n.addConstr(x + y <= 10) 
n.addConstr(2*x + 3*y <= 20) 
n.addConstr(y<=5) 
n.update 
n.optimize() 
for v in n.getVars(): 
    print('%s %g' % (v.varName, v.x)) 

print('Obj: %g' % n.objVal) 

for i in (1,10): 
    n.update() 
    a=i*2 
    b=100/i 
    n.optimize() 
    for v in n.getVars(): 
     print('%s %g' % (v.varName, v.x)) 

如何反覆使用現有模型?

回答

1

大概你錯過了在循環中調用n.setObjective()。你只是更新局部變量而不實際觸摸模型。

0

只有a和b常量嗎?然後,你只需要添加行

x.obj = i*2 
y.obj = 100/i 

在循環,你可以刪除a和b完全地。

完整的示例,糾正了一些小問題,把a=b=1在循環的i=0 -iteration:

from gurobipy import Model, GRB 

n = Model('Test') 
x = n.addVar(lb=0, name='x') 
y = n.addVar(lb=0, name='y') 
n.update() 
n.ModelSense = GRB.MAXIMIZE 
n.addConstr(x + y <= 10) 
n.addConstr(2 * x + 3 * y <= 20) 
n.addConstr(y <= 5) 
n.update() 

for i in range(10): 
    x.Obj = i*2 if i else 1 
    y.Obj = 100/i if i else 1 
    n.optimize() 
    for v in n.getVars(): 
     print('%s %g' % (v.varName, v.x)) 
    print('Obj: %g' % n.objVal)