2015-05-05 3 views
0

Мне нужно повторно решить модель gurobi (с разными значениями переменных на каждой итерации). Вместо того, чтобы перестраивать каждую итерацию модели, я попытался настроить модель, а затем перебирать повторяющиеся оптимизации, но значения переменных не обновляются. Вот простой пример.Многократно повторяйте модель Gurobi в Python

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)