了解DoCPLEX多目标

问题描述

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

例如:

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

权重的问题之一是,如果10 A获得B 1000(在少数情况下有可能),则A的优先级高于B

多目标是否可以避免这种情况?它会严格地优先于B吗?

解决方法

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

您可以阅读

Priority:一个整数,默认为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