如何在DOcplex中同时配置字典序层级参数与全局内存参数?
问题
我正在使用字典序排序(lexicographic ordering)处理多目标优化问题,需求是:
- 为每个目标层级设置独立的时间限制和MIP GAP(对应与目标数量匹配的时间限制向量、MIP GAP向量)
- 全局控制工作内存(workmem)和节点存储参数
但目前无法同时实现上述配置:
使用
build_multiobj_paramsets指定层级参数时,全局设置的workmem等参数被忽略,内存占用持续飙升直至耗尽,同时收到提示:warning: inconsistent parallel mode settings ignored, using opportunistic.对应代码:
model = Model(name='Model_name') model.parameters.parallel = -1 # opportunistic 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)使用
maximize_static_lex时,全局的workmem和节点存储参数正常生效,但无法为每个层级设置独立的时间限制和MIP GAP:model = Model(name='Model_name') model.parameters.parallel = -1 # opportunistic 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等参数,又能为每个字典序层级指定不同的时间限制和MIP GAP?
解决方案
可以通过将全局控制参数合并到每个层级的参数配置中,实现同时控制全局资源和层级专属参数的需求。当传入parameter_sets时,求解器会优先使用参数集中的配置,因此只需确保每个层级的参数集合包含全局参数即可。
方法1:扩展build_multiobj_paramsets生成的参数集
先通过工具方法生成基础层级参数,再批量注入全局参数:
model = Model(name='Model_name') # 定义需要全局控制的参数 global_config = { 'parallel': -1, # opportunistic模式 'workmem': 10000, # 10GB内存限制 'mip.strategy.file': 3 # 节点压缩存储到磁盘 } model.set_multi_objective('max', objectives, priorities=[3,2,1], names=objective_names) # 生成包含层级专属时间限制、MIP GAP的基础参数集 paramsets = model.build_multiobj_paramsets(timelimits=[time1, time2, time3], mipgaps=[gap1, gap2, gap3]) # 将全局参数合并到每个层级的配置中 for param_set in paramsets: param_set.update(global_config) # 执行求解 solution = model.solve(url=None, key=None, log_output=True, clean_before_solve=True, parameter_sets=paramsets)
方法2:手动构建全量参数集
直接为每个层级手动编写完整的参数配置,无需依赖工具方法:
model = Model(name='Model_name') model.set_multi_objective('max', objectives, priorities=[3,2,1], names=objective_names) # 手动构建每个层级的参数集,同时包含全局参数和层级专属参数 paramsets = [ { 'timelimit': time1, 'mipgap': gap1, 'parallel': -1, 'workmem': 10000, 'mip.strategy.file': 3 }, { 'timelimit': time2, 'mipgap': gap2, 'parallel': -1, 'workmem': 10000, 'mip.strategy.file': 3 }, { 'timelimit': time3, 'mipgap': gap3, 'parallel': -1, 'workmem': 10000, 'mip.strategy.file': 3 } ] solution = model.solve(url=None, key=None, log_output=True, clean_before_solve=True, parameter_sets=paramsets)
这两种方式都能确保每个层级在使用专属时间限制和MIP GAP的同时,严格遵循全局的内存、并行模式及节点存储配置。
内容的提问来源于stack exchange,提问作者Pol Gil Figuerola
相关产品推荐
相关产品推荐

