解决pyomo中的问题后cplex更改固定变量
cplex changes the fixed variable after solving the problem in pyomo
我正在尝试求解 MIP,我使用 pyomo,而 Cplex(Interactive Optimizer 20.1.0.0) 是求解器。
问题是我想修复一些二进制整数变量然后解决问题,我使用了:
model.y[1,4].fix(1)
model.y[2,3].fix(0)
,但我注意到在解决问题后,那些固定变量已更改为另一个值。
我怎么能说 cplex 不更改固定变量?
让我使用 bus example 固定启动 pyomo
import pyomo.environ as pyo
from pyomo.opt import SolverFactory
opt = pyo.SolverFactory("cplex")
model = pyo.ConcreteModel()
model.nbBus = pyo.Var([40,30], domain=pyo.PositiveIntegers)
#fixed start
model.nbBus[40].fix(3)
# end of fixed start
model.OBJ = pyo.Objective(expr = 500*model.nbBus[40] + 400*model.nbBus[30])
model.Constraint1 = pyo.Constraint(expr = 40*model.nbBus[40] + 30*model.nbBus[30] >= 300)
results = opt.solve(model)
print("nbBus40=",int(model.nbBus[40].value))
print("nbBus30=",int(model.nbBus[30].value))
给予
nbBus40= 3
nbBus30= 6
而如果您删除固定起点,您会得到
nbBus40= 6
nbBus30= 2
由于固定变量对我不起作用,我通过向模型添加新约束来解决我的问题,并且它起作用了。
def yvar_fix(model, i, j ):
if (i,j) in y_set_init:
constraint = (model.y[i,j] == 1)
else:
constraint = (model.y[i,j] == 0)
return constraint
model.yvar_fix = pe.Constraint(model.edges, rule=yvar_fix)
我正在尝试求解 MIP,我使用 pyomo,而 Cplex(Interactive Optimizer 20.1.0.0) 是求解器。 问题是我想修复一些二进制整数变量然后解决问题,我使用了:
model.y[1,4].fix(1)
model.y[2,3].fix(0)
,但我注意到在解决问题后,那些固定变量已更改为另一个值。 我怎么能说 cplex 不更改固定变量?
让我使用 bus example 固定启动 pyomo
import pyomo.environ as pyo
from pyomo.opt import SolverFactory
opt = pyo.SolverFactory("cplex")
model = pyo.ConcreteModel()
model.nbBus = pyo.Var([40,30], domain=pyo.PositiveIntegers)
#fixed start
model.nbBus[40].fix(3)
# end of fixed start
model.OBJ = pyo.Objective(expr = 500*model.nbBus[40] + 400*model.nbBus[30])
model.Constraint1 = pyo.Constraint(expr = 40*model.nbBus[40] + 30*model.nbBus[30] >= 300)
results = opt.solve(model)
print("nbBus40=",int(model.nbBus[40].value))
print("nbBus30=",int(model.nbBus[30].value))
给予
nbBus40= 3
nbBus30= 6
而如果您删除固定起点,您会得到
nbBus40= 6
nbBus30= 2
由于固定变量对我不起作用,我通过向模型添加新约束来解决我的问题,并且它起作用了。
def yvar_fix(model, i, j ):
if (i,j) in y_set_init:
constraint = (model.y[i,j] == 1)
else:
constraint = (model.y[i,j] == 0)
return constraint
model.yvar_fix = pe.Constraint(model.edges, rule=yvar_fix)