我试图解决一个NP难题使用docplex和cplex,我需要docplex返回第一个事实解决方案建立和停止搜索。通常,当找到第n个最好的解决方案时,停止。就像这样:
集合极限解n
发布于 2022-06-11 16:44:47
您可以在docplex python中使用parameters.mip.limits.solutions。
对这段代码的一个小改动给出
from docplex.mp.model import Model
mdl = Model(name='buses')
mdl.parameters.mip.limits.solutions=1
nbbus40 = mdl.integer_var(name='nbBus40')
nbbus30 = mdl.integer_var(name='nbBus30')
mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
mdl.minimize(nbbus40*500 + nbbus30*400)
mdl.solve()
print("int sol limit = ",mdl.parameters.mip.limits.solutions.get())
for v in mdl.iter_integer_vars():
print(v," = ",v.solution_value)这给
int sol limit = 1
nbBus40 = 8.0
nbBus30 = 0使用所有其他apis,您也可以这样做。
例如,使用pyomo:
import pyomo.environ as pyo
from pyomo.opt import SolverFactory
opt = pyo.SolverFactory("cplex")
opt.options['mip limits solutions'] = 1
model = pyo.ConcreteModel()
model.nbBus = pyo.Var([40,30], domain=pyo.PositiveIntegers)
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)
opt.solve(model)
print("nbBus40=",model.nbBus[40].value)
print("nbBus30=",model.nbBus[30].value)https://stackoverflow.com/questions/72586034
复制相似问题