我正在处理约300万个约束的纯LP问题,目前我使用的是不同权重的目标函数。但是为了提高运行时间,我希望探索DoCPLEX多目标导入"ObjectiveSense“。在实现之前,我想了解这个解决方案是如何工作的。
例如:
我的目标函数是使用多目标的最大化(-1000_B -100_C +10_A -D -0.1_E),它是: ObjectiveSense.Maximize、-B、A、-C、-D、-E、priorities=5、4、3、2、1)。
权重的问题之一是,如果10_A获得B_1000 (在少数情况下这是可能的),则A被优先于B
多目标能阻止这种情况吗?它会严格区分B的优先顺序吗?
发布于 2020-10-07 06:47:40
你可以读
优先级:整数,默认为0。定义处理KPI的顺序。如果几个子目标具有相同的优先级,它们就混合在一起。
有了优先级,您就可以得到分级的KPI,因此,即使具有巨大的价值,KPI也不会比不太重要的KPI更重要。
让我分享一下动物园示例中的一个小例子:
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发布于 2021-08-20 01:10:55
在亚历克斯的评论中,多目标有用的情况是,当目标函数中由于优先级而产生的系数是不同的数量级。如果系数至少是1e6不同,这可能导致一些答案是舍入误差的一部分,你可能有数值不稳定性。在你的情况下,你在1e4不同,所以除非在配方中有另一个问题,你不太可能看到业绩的提高。如果这是一个LP,我建议您首先将"lpmethod“参数更改为4,因为您有这么大的模型。
你能对事情的进展发表评论吗?
https://stackoverflow.com/questions/64233725
复制相似问题