【问题标题】:Python CPLEX warm starts from infeasible solutionPython CPLEX 暖从不可行的解决方案开始
【发布时间】:2020-09-05 07:30:17
【问题描述】:

我目前解决了一个(整数)LP 问题,其中包括以下数学约束作为伪代码。

Packages_T1 + Packages_T2 + Packages_T3 + RPackages = 25

它代表三辆包裹卡车(T1、T2 和 T3),每辆包裹都可以分配给其中的包裹,外加目标函数中使用的残留/溢出包裹变量。当前值 25 代表总包需求。

假设我想重新解决这个问题,但将当前 25 包的需求更改为 35 包。当我从具有 25 个包的先前解决方案热启动时,CPLEX 错误指出所提供的解决方案不可行:这非常有意义。但是,它随后无法修复以前的解决方案,即使最直接的方法是为每个约束“增加”RPackages 变量。

我的问题是,是否有可能仍将先前解决的问题中的信息用作新问题的热启动。例如,有没有办法从解决方案中删除所有 RPackages 并重新计算它们以适应新的约束右侧?我想到的“最后手段”努力是自己手动重新计算所有这些RPackages 值并将它们替换为旧解决方案,但更倾向于使用更自动化的解决方案来解决这个问题。我正在使用标准的 CPLEX Python API 作为参考。

提前谢谢你。

【问题讨论】:

    标签: python linear-programming cplex


    【解决方案1】:

    即使热启动不可行,CPLEX 也可以使用一些信息。

    让我使用来自

    的动物园示例

    https://www.linkedin.com/pulse/making-optimization-simple-python-alex-fleischer/

    from docplex.mp.model import Model
    
    mdl = Model(name='buses')
    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)
    
    warmstart=mdl.new_solution()
    warmstart.add_var_value(nbbus40,4)
    warmstart.add_var_value(nbbus30,0)
    mdl.add_mip_start(warmstart)
    
    
    sol=mdl.solve(log_output=True)
    
    for v in mdl.iter_integer_vars():
        print(v," = ",v.solution_value)
    

    给予

    Warning:  No solution found from 1 MIP starts.
    Retaining values of one MIP start for possible repair.
    

    【讨论】:

    • 非常感谢您的迅速回复。最后两条消息确实是我在当前热启动我的问题时也观察到的。您是否知道有任何方法可以验证 CPLEX 是否实际使用(某些部分)在开始时提供的不可行解决方案?
    • 如果您编写 warmstart.add_var_value(nbbus40,8),那么您将在日志中看到“1 个 MIP 启动提供的解决方案中的 1 个。MIP 启动 'm1' 定义了目标为 4000.0000 的初始解决方案。”跨度>
    • 这是有道理的,因为 nbbus40 = 8 的值满足模型中的唯一约束,因此提供了一个可行的解决方案。过去,当从现有解决方案重新启动相同的问题时,这也对我有用。然而,在我的新案例中,由于我原来的问题中描述的等式约束,现有的热启动解决方案在新问题中是不可行的。因此,我觉得 CPLEX 只是忽略了 .sol 文件中的信息并从头开始,即使这感觉不是最佳的。您还有什么建议吗?
    • 您可以使用 •Level 4 MIPStartRepair:CPLEX 尝试修复不可行的 MIP 启动,根据设置尝试修复不可行 MIP 启动的频率的参数 CPXPARAM_MIP_Limits_RepairTries(即 IloCplex::参数::MIP::Limits::RepairTries)。在 mdl.add_mip_start(warmstart,effort_level=4)
    • 我已经在我的代码中实现了这一点,但无济于事。它仍然提示我未从 MIP 启动中找到解决方案的消息,并且 CPLEX 将保留一个以进行可能的修复。我将尝试编辑我的 MIP 启动文件,使其符合右侧的新约束,如果失败,请暂时从头开始运行程序。非常感谢您的努力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    • 2019-11-21
    • 2019-10-12
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多