用Python重复解决Gurobi模型

时间:2015-05-05 18:23:34

标签: python optimization iteration gurobi

我需要反复解决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))

如何反复使用现有模型?

2 个答案:

答案 0 :(得分:1)

据推测,你在循环中缺少对n.setObjective()的调用。你只是更新局部变量而根本没有触及模型。

答案 1 :(得分:0)

只有a和b常量吗?然后,您只需要添加行

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

在循环中你可以完全删除a和b。

完整示例,更正了一些小问题,并将a=b=1放入i=0 - 循环的循环中:

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)