【问题标题】:Docplex return first feasible solution foundDocplex 返回找到的第一个可行解决方案
【发布时间】:2022-08-18 02:42:50
【问题描述】:

我正在尝试使用 docplex 和 cplex 解决 NP-Hard 问题,并且我需要该 docplex 返回创建的第一个切实可行的解决方案并停止搜索。通常,当找到第 n 个最佳解决方案时停止。像这样的东西:

设置限制解决方案 n

    标签: cplex opl docplex


    【解决方案1】:

    您可以将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)
    

    【讨论】:

    • 非常感谢。可以在pyomo中做到吗?
    • 是的。我用 pyomo 中的一个例子更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2019-10-12
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多