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