在 DOcplex 中设置每个词典级别的时间限制和全局工作内存限制

问题描述 投票:0回答:1

我正在使用字典排序来解决多目标问题。 我想为每个级别设置不同的时间限制和不同的 MIP GAP,即时间限制向量和大小等于目标数量的 MIP GAP 向量。我还想控制工作内存和节点存储。

问题:我找不到指定这些参数以使它们一起工作的方法。如果我指定时间限制和 MIP GAP 的向量,求解器将忽略工作内存参数。

我尝试过:

model = Model(name='Model_name')

model.parameters.parallel = -1 # oportunistic
model.parameters.workmem = 10000 # 10 GB 
model.parameters.mip.strategy.file = 3 # Save nodes on disk and compressed

model.set_multi_objective('max',objectives, priorities=[3,2,1], names=objective_names)

paramsets = model.build_multiobj_paramsets(timelimits=[time1, time2, time3], mipgaps=[gap1, gap2, gap3])

solution = model.solve(url=None, key=None, log_output=True, clean_before_solve=True, parameter_sets=paramsets)

当我运行模型时,不遵守 workmem 限制,内存使用量会增加,直到内存耗尽。我还收到以下消息:

warning: inconsistent parallel mode settings ignored, using opportunistic.

我也尝试过:

model = Model(name='Model_name')

model.parameters.parallel = -1 # oportunistic
model.parameters.workmem = 10000 # 10 GB 
model.parameters.mip.strategy.file = 3 # Save nodes on disk and compressed

model.maximize_static_lex(objectives, objnames=objective_names)
solution = model.solve(url=None, key=None, log_output=True, clean_before_solve=True)

通过最后一次尝试,workmem 限制和节点文件存储工作正常,但我无法为每个词典级别引入不同的时间限制和不同的间隙。 我的问题: 有没有办法控制workmem参数(全局),同时为每个词典级别指定不同的时间限制和mip间隙?

cplex docplex
1个回答
0
投票

在求解中,您可以使用时间限制作为参数:

timelimits=[5, 10]

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,lex_timelimits = timelimits)

在示例中https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoomultiobjective.py

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]
timelimits=[5, 10]

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,lex_timelimits = timelimits)

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);
© www.soinside.com 2019 - 2024. All rights reserved.