在 Python 中反复求解 Gurobi 模型

Solve Gurobi model repeatedly in 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))

如何反复使用现有模型?

大概您在循环中缺少对 n.setObjective() 的调用。您只是在更新局部变量而根本没有实际接触模型。

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)