Docplex,大量迭代(ItCnt=1.25e+08)

2024-05-26 11:54:03 发布

您现在位置:Python中文网/ 问答频道 /正文

在运行cplex模型“docplex(python)”时,我注意到cplex多次重复相同的间隙值(超过300次)。没有任何改进,还有大量节点有待探索(即使问题不够大,节点数:50,变量数:8655,约束数:16950)。我在问这是否是一个正常的结果,是否有参数可以帮助解算器指导搜索,比如在不停止解算器的情况下更改搜索空间? (附件,您可以看到日志输出)[1]:https://www.mediafire.com/file/s9sofxhze8em31y/log_output_2.pdf/file


Tags: https模型附件参数节点www空间情况
3条回答

sascha是正确的:存在一些众所周知很难解决的小MIP问题。 本文是一篇很好的参考文献。 其他建议:将read datacheck参数设置为2,以排除潜在的数值问题 尝试非标准的mip强调值,如果最佳界限被卡住,3可能会给出良好的结果,而4有时会给出非常好的结果。MIP emphasis 5可以帮助您设置一个时间限制,因为它试图尽早计算出好的解决方案

docplex代码:

mdl.parameters.read.datacheck =2
mdl.parameters.emphasis.mip = 3 (or 4, 5)

如果这不起作用,请发布CPLEX日志的较大摘录,从头开始

从完整日志中,我可以从建模助手中看到许多此类警告(read.datacheck=2)

CPLEX Warning  1008: Detected righthand side <= CPX_MINBOUND at constraint 'c9198'.

这意味着约束的右侧太小。CPLEX以浮点数形式进行计算,本质上是不精确的;因此,所有计算均受公差限制。 约束满足度公差为1e-6,在其他术语中为约束,例如

X+2 Y>;=三,

可通过公差范围为1e-6的CPLEX解决方案满足要求

简而言之:不要使用1e-6以下的系数或常数(绝对值)。 使用如此微小的数值只能在无用的数值问题上干扰cplex。 使用纯0或删除约束。 例如,一个约束,如:

  X + 2 Y <= 1e-12

应该写

  X + 2 Y <= 0

系数的相同规则:避免系数低于1e-7。如果您的数据包含它们,请过滤它们或缩放数据。 建议在整个模型中,系数的数量级范围不应超过1e+6,换句话说,最大值与最小值的比率应保持在1e+7以下;否则,数字上的麻烦是意料之中的

至于参数,我看到您正在使用强分支。只有当它真的有帮助的时候才使用它,因为它的CPU非常昂贵。 我还注意到您将线程限制为2,为什么不让cplex使用尽可能多的线程

总之,首先修复这些微小的系数,然后在没有强分支和完整线程的情况下尝试

从您的新日志中,我看到所有数据问题都已修复,这很好。尽管如此,mip搜索还是被卡住了,最佳界限没有移动。 你的问题主要是二进制变量,所以高度组合;这些问题可能很难解决。 尽管如此,还是有一些一般性建议:

  • 尝试不使用mip策略nodeselect 0,我真的不相信这确实有帮助
  • mip策略文件相同:请尝试将其删除
  • 由于您的最佳边界被卡住了,您是否尝试使用mip emphasis=3来处理此最佳边界

此外,您可以尝试“抛光”启发式,它有时会给出很好的结果。要在给定间隙值后切换到抛光,请使用cplex interactive中的“set mip strategy polishafter mipgap 0.40”,这将在通过40%间隙阈值时切换抛光

如果什么都不起作用,那么模型公式本身可能存在问题。一个想法是设置一个简单的目标(比如某个变量或二进制文件的总和),看看情况会有什么改善。 如果是,问题在于找到更好的解决方案,如果不是,问题在于找到可行的解决方案。在后一种情况下,可行性泵(mip策略fpheur 1或2)可能会有所帮助

相关问题 更多 >