CPLEX解池应该怎么设置,解池里面的结果个数不够的时候又要怎么排查,这类问题,在做整数规划、排产、路径、选址和资源分配那些模型时,是经常会碰到的。解池,也就是Solution Pool,它主要用在MIP模型中,用来生成和保存很多个能行得通的解,这样比较不同的方案就方便很多,而不是只拿出一个最优解来。IBM的文档里也说过,solution pool可以为混合整数规划模型生成和存储多个解,并且populate会把当前模型的解给填到解池里面去。所以,在设解池的时候,要一起去看模型是不是有多个能行得通的方案,解池的容量够不够,populate的限制够不够,还有那些筛选条件是不是卡得太紧了。
一、CPLEX解池怎么设置
在设CPLEX的解池以前,先要弄明白,现在这个模型到底适不适合去用解池。解池主要是用在MIP问题上的,如果是普通的、连续的那种线性规划,一般不会像整数规划那样,给出一堆离散的备选方案。要是模型本身就只有一种能行得通的结构,那也别指望光调调参数,就能凭空变出很多不一样的结果来。
1、先把populate流程给用起来
在【populate】这个流程当中,让CPLEX去主动地搜出很多个能行的解,而不是只调用一次solve就算完事了。solve一般更在意找到那个最优的解,或者是找到满足停止条件的解,而populate的目标是要把solution pool给填满。IBM文档里面写了,populate会把当前Cplex对象里已经提取出来的模型的solution pool给填上,而且这个方法在找到解的时候会返回一个true,只是这个解并不一定就是最优的那个。要是光在solve以后再去看解池,解的个数常常是会偏少的。
2、设好解池的容量和搜索的数量
需要去关心【SolnPoolCapacity】和【PopulateLim】这类参数。前一个影响着解池最多能存下多少个解,后一个影响着每次populate最多能生成多少个解。IBM对PopulateLim的说明是,它给populate过程中为solution pool生成的MIP解设了一个最大的数量,这个数量一到,populate就会停住。如果光把容量设得很大,但PopulateLim又很小,那搜索过程本身是生不出足够多解的;反过来,要是PopulateLim很大,可解池容量又太小,有些解就可能留不下来。
3、设好解池的搜索强度
如果想更起劲地找备选解,可以去调整【SolnPoolIntensity】。IBM文档里提到过,要是想枚举所有的解,可以把solution pool intensity设成4,再把PopulateLim给到足够大,然后去调用populate。不过这个强度一高,算起来花的时间一般也会变多,尤其是那些变量多、约束紧、整数结构又复杂的模型。
二、CPLEX解池结果数量不足怎么排查
当解池里面结果的个数不够时,不要光想着是参数没给调大。很多时候是模型本身能行的解就少,或者是筛选条件太严了,目标差距的限制太小了,又或者是搜索被提前给停掉了。排查的时候,要先去看日志和参数,再去看模型的那个结构。
1、先看看模型是不是真的还有更多的能行得通的解
如果那些约束特别紧,或者整数变量的组合被限制得很死,那模型可能本来就只有很少几个能行得通的解。到了这个地步,不管把PopulateLim设得多大,结果的数量也不大会往上涨。可以临时去把一些不是最核心的约束给放宽松一点,再看看解池的个数有没有跟着多起来,用这个来断一下,问题是出在模型的结构上,还是出在参数的限制上。
2、查一查解池的差距限制
解池有可能只留下了那些够得着目标差距要求的解。比如在设了相对差距,或者绝对差距以后,那些离最优目标太远的方案,就给排除掉了。IBM文档在讲怎么枚举全部解的时候也说过,得把solution pool absolute gap设成0,再配上比较高的搜索强度,还有足够大的PopulateLim,才能把解都给找出来。要是你只是想多看到几个备选的方案,那去把解池的gap要求,适当地放宽一些就行了。
3、查一查是不是被时间和节点的限制给截住了
要是设了TimeLimit、NodeLimit,或者是MIPGap这些停止的条件,那populate可能还没找够解,就已经停下来了。得去看求解的那个日志,是正常地走到了解个数的上限,还是因为时间、节点、内存、gap,或者是别的什么停止条件,才提前结束的。前面那种,说明是数量的限制在起作用;后面那种,就说明是分给搜索的那些资源,还不太够。
三、CPLEX解池结果怎么判断是否可用
解池里面装着很多个解,也不代表每一个解都值得去采用。在工程的场景里面,更要紧的是看这些解,是不是够不一样,是不是真的能满足业务上的那些约束,还有它们目标值上的差,是不是在一个能被接受的范围里面。
1、去看一看解的差异性
要是解池里面解的个数倒是挺多的,可它们就只在少数几个不要紧的变量上有点不一样,那对业务上的决定,帮忙是不大的。CPLEX的解池,也是能通过替换的策略去追一追多样性的,有相关的资料里面说过,可以用SolnPoolReplace去给solution pool设一下替换的策略,好去收一些个更不一样的解。对于排产、路径和选址这些问题来说,多样性常常要比那个单纯的数量,来得更紧要一些。
2、把那些重复的,还有差不多一样的方案给排除掉
有些模型里面,是带着对称结构的,就比如两台完全一样的设备、两个差不多的仓库,还有很多个同质的资源,这些东西,就可能会搞出一大堆看着不同,可骨子里其实等价的方案。到了这个时候,就得在业务那一层,先把那些关键的变量给定出来,然后再去比一下,这些关键的变量是不是真的变了。
3、要结合着业务上的约束,去把结果再过上一遍
从解池里面拿出来的方案,还是得经过业务上的校验才行。排产的方案,得去瞧换线的次数、交期那头的风险,还有人员的班次;路径的方案,得去瞧车辆的那些限制,还有实际的路况;选址的方案,就得去瞧合同、区域的政策,还有落地的成本。不要光按着那个目标函数去排个序,就直接把方案给定下来。
总结
CPLEX解池要怎么设,解池结果的个数不够了又该怎么排查,这里头的关键,是先要用populate去生成很多个能行得通的解,再把SolnPoolCapacity、PopulateLim、SolnPoolIntensity,还有解池的gap,都给设得合理。在结果的个数觉着不够的时候,要去断一下,是模型它本来能行的解就少,还是说被容量、搜索的个数、差距的限制、时间的限制这些个东西,把结果给截在了那里。等解池的结果出来了以后,还要再去看一看方案的差异性,还有在业务上到底能不能用。得是数量、质量,还有业务上的解释,这几样东西全都能对得上,CPLEX的解池,才算能真真正正地用在备选方案的那个分析上。
