【问题标题】:Understanding DoCPLEX Multi Objective了解 DoCPLEX 多目标
【发布时间】:2020-10-06 21:01:02
【问题描述】:

我正在研究具有大约 300 万个约束的纯 LP 问题,并且我目前正在使用具有不同权重的目标函数。但为了提高运行时间,我希望探索 DoCPLEX 多目标导入“ObjectiveSense”。在实施之前,我想了解这个解决方案是如何工作的。

例如:

我的目标函数是最大化(-1000B -100C +10A -D -0.1E) 使用多目标是:ObjectiveSense.Maximize, [-B,A,-C,-D,-E], priority=[5, 4, 3, 2, 1])

权重的问题之一是如果 10A 得到 B1000(在少数情况下可能),那么 A 优先于 B

Multi-Objective 能防止这种情况吗?它会严格优先考虑 B 吗?

【问题讨论】:

    标签: linear-programming cplex docplex


    【解决方案1】:

    https://developer.ibm.com/docloud/blog/2019/03/12/multiobjective-optimization-for-lp-and-mip-in-cplex/

    你可以阅读

    优先级:一个整数,默认为 0。定义 KPI 的顺序 被处理。如果多个子目标具有相同的优先级,则它们 混合在一起。

    通过优先级,您可以获得分层的 KPI,因此即使具有巨大价值的不太重要的 KPI 也不会比不太重要的 KPI 更重要

    让我分享一个来自zoo 示例的小示例:

    from docplex.mp.model import Model
    
    mdl = Model(name='buses')
    
    nbbus50 = mdl.integer_var(name='nbBus50')
    nbbus40 = mdl.integer_var(name='nbBus40')
    nbbus30 = mdl.integer_var(name='nbBus30')
    
    cost = mdl.continuous_var(name='cost')
    co2emission = mdl.continuous_var(name='co2emission')
    
    mdl.add_constraint(nbbus50*50+nbbus40*40 + nbbus30*30 >= 200, 'kids')
    mdl.add_constraint(co2emission==nbbus50+nbbus40*1.1+nbbus30*1.2)
    mdl.add_constraint(cost==nbbus40*500 + nbbus30*400+nbbus50*625)
                    
    sense="min"
    exprs=[cost,co2emission]
    priorities=[1,2]
    weights=[1,1]
    mdl.set_multi_objective(sense, exprs, priorities, weights, abstols=None, reltols=None, names=None)
    
    mdl.solve(lex_mipgaps = [0.001, 0.05], log_output=True)
    
    for v in mdl.iter_integer_vars():
        print(v," = ",v.solution_value)
    
    print("The minimum cost is ",cost.solution_value);
    print("CO2 emission is ",co2emission.solution_value);
    

    给了

    nbBus50  =  4.0
    nbBus40  =  0
    nbBus30  =  0
    The minimum cost is  2500.0
    CO2 emission is  4.0
    

    【讨论】:

    • 感谢 Alex 的解释
    【解决方案2】:

    添加到 Alex 的评论中,多目标有用的情况是目标函数中的系数由于优先级而存在数量级不同。如果系数至少相差 1e6,这可能导致某些答案成为舍入误差的一部分,并且您可能会出现数值不稳定。在您的情况下,您处于 1e4 不同,因此除非配方中存在其他问题,否则您不太可能看到性能提升。如果这是 LP,我建议您先将“lpmethod”参数更改为 4,因为您有这么大的模型。

    你能评论一下事情的进展吗?

    【讨论】:

    • 最后我研究了这个问题,它通过 Multi-Objective 解决了,对于具有相同优先级的目标具有不同的权重,并且四舍五入将常量限制为 2 个小数位(它有 6 个小数位并导致不稳定)。该模型能够在 12 分钟内解决约 300 万个约束,这在 5 小时内取得了巨大的进步。
    猜你喜欢
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多