1.目标函数参数修改
有时候会出现在迭代过程中需要修改目标函数参数的情况,例如在利用次梯度求解拉格朗日松弛对偶问题,我们不可能重新生成整个模型。
通过尝试发现以下方法可行,即在迭代中直接修改并重新生成目标函数。
from gurobipy import *
m = Model('test')
x = m.addVar(vtype=GRB.BINARY, name="x")
y = m.addVar(vtype=GRB.BINARY, name="y")
z = m.addVar(vtype=GRB.BINARY, name="z")
m.setObjective(x + y + z, GRB.MAXIMIZE)
m.addConstr(x + y <= 1, "1")
m.addConstr(x + y + z <= 2, "1")
def set_obj(gamma, alpha, beta):
obj = LinExpr(0)
obj.addTerms(gamma, x)
obj.addTerms(-alpha, y)
obj.addTerms(beta, z)
# m.setObjective(obj, GRB.MAXIMIZE)
return obj
gamma = 1
alpha =2
beta = 3
obj = set_obj(gamma, alpha, beta)
m.setObjective(obj, GRB.MAXIMIZE)
m.write('test.lp')
m.optimize()
print('--------------------参数修改----------------------')
gamma = 5
alpha = 6
beta = 7
obj = set_obj(gamma, alpha, beta)
m.setObjective(obj, GRB.MAXIMIZE)
m.write('test1.lp')
m.optimize()
2.变量初始值赋值
需要修改变量值的情况一般出现在 Heuristic 给出初始可行解来加速求解器求解的时候。对于 Gurobi 可以采用 MIP starts 方法,链接中的官方文档给了一个简单的例子 (simple facility location problem)
# In Python:
# First open all plants
for p in plants:
open[p].Start = 1.0
3.约束修改
# 1. 在设置约束的时候,为每个约束添加约束name
for i in range(3):
model.addConstr(x[i] <= y+z, name='cons_%s' % (i))
# 2. 删除原模型中对应要修改的约束
for i in range(3):
constr_name = 'cons_' + str(i)
model.remove(model.getConstrByName(constr_name))
# 3. 重新添加约束
for i in range(3):
model.addConstr(x[i] <= y+z+1, name='cons_%s' % (i))