解决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)