我正在使用字典排序来解决多目标问题。 我想为每个级别设置不同的时间限制和不同的 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间隙?
在求解中,您可以使用时间限制作为参数:
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);