【发布时间】:2022-08-18 02:42:50
【问题描述】:
我正在尝试使用 docplex 和 cplex 解决 NP-Hard 问题,并且我需要该 docplex 返回创建的第一个切实可行的解决方案并停止搜索。通常,当找到第 n 个最佳解决方案时停止。像这样的东西:
设置限制解决方案 n
我正在尝试使用 docplex 和 cplex 解决 NP-Hard 问题,并且我需要该 docplex 返回创建的第一个切实可行的解决方案并停止搜索。通常,当找到第 n 个最佳解决方案时停止。像这样的东西:
设置限制解决方案 n
您可以将parameters.mip.limits.solutions 与 docplex python api 一起使用
对this code 的一个小改动给出了
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
使用all other 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)
【讨论】: