了解 DoCPLEX Multi Objective
Understanding DoCPLEX Multi Objective
我正在处理具有大约 300 万个约束的纯 LP 问题,我目前正在使用具有不同权重的 objective 函数。但为了缩短 运行 时间,我希望探索 DoCPLEX 多 objective 导入“ObjectiveSense”。在实施之前,我想了解这个解决方案是如何工作的。
例如:
我的Objective函数是最大化(-1000B -100C +10A -D -0.1E)
使用 Multi- Objective 是:ObjectiveSense.Maximize, [-B,A,-C,-D,-E], priorities=[5, 4, 3, 2, 1])
权重的问题之一是如果 10A 得到 B1000(这在少数情况下是可能的)然后 A 优先于 B
Multi-Objective 可以防止这种情况吗?它会严格优先考虑 B 吗?
你可以阅读
Priority: an integer, default 0. Defines the order in which KPIs will
be dealt with. If several sub-objectives have the same priority, they
are blended together.
通过优先级,您可以获得分层 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 的评论中,multi-objective 有用的情况是 objective 函数中的系数由于优先级而有数量级的不同。如果系数至少相差 1e6,这可能会导致某些答案成为舍入误差的一部分,并且您可能会出现数值不稳定。在您的情况下,您处于 1e4 不同的位置,因此除非公式中存在其他问题,否则您不太可能看到性能提升。如果这是 LP,我建议您首先将“lpmethod”参数更改为 4,因为您有这么大的模型。
你能评论一下事情的进展吗?
我正在处理具有大约 300 万个约束的纯 LP 问题,我目前正在使用具有不同权重的 objective 函数。但为了缩短 运行 时间,我希望探索 DoCPLEX 多 objective 导入“ObjectiveSense”。在实施之前,我想了解这个解决方案是如何工作的。
例如:
我的Objective函数是最大化(-1000B -100C +10A -D -0.1E) 使用 Multi- Objective 是:ObjectiveSense.Maximize, [-B,A,-C,-D,-E], priorities=[5, 4, 3, 2, 1])
权重的问题之一是如果 10A 得到 B1000(这在少数情况下是可能的)然后 A 优先于 B
Multi-Objective 可以防止这种情况吗?它会严格优先考虑 B 吗?
你可以阅读
Priority: an integer, default 0. Defines the order in which KPIs will be dealt with. If several sub-objectives have the same priority, they are blended together.
通过优先级,您可以获得分层 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 的评论中,multi-objective 有用的情况是 objective 函数中的系数由于优先级而有数量级的不同。如果系数至少相差 1e6,这可能会导致某些答案成为舍入误差的一部分,并且您可能会出现数值不稳定。在您的情况下,您处于 1e4 不同的位置,因此除非公式中存在其他问题,否则您不太可能看到性能提升。如果这是 LP,我建议您首先将“lpmethod”参数更改为 4,因为您有这么大的模型。
你能评论一下事情的进展吗?