1、 logging 的意思是记录,记录整个optimizer的求解过程,帮助我们的分析和改进。
2、说实话,懒的话,都不会去看这个,只看是不是得到了最优解。后来要写分析报告的话,不得不去研究一下。
3、看help文件的说明:optimizer produces a log that help you to track the process of the optimization , 因此一定要好好研究。
4、首先看MIP的log,这个是正在研究的。主要分成三个部分:presolve(预处理)、progress(进行中) and summary(总结)。
5、预处理之前:一开始会有参数的预处理,parameters的设置,有timelimit、solutionpools和mipgap的设置;然后统计模型的约束(constraints,rows)个数和变量(varibles,column)个数,还有 非零个数(不知道有什么用);最后是系数的统计,主要是范围 range(看不懂)。
6、预处理:统计优化后的约束、变量和非零 的个数,所花的时间。根据模型的特点,可能会去除很多个variables,这样会加快计算速度。
7、进行中:会记录整个计算过程,主要是branch and bound 算法的过程。主要包括这么几个方面:发现启发式解(可能有1个,也可能有3个,或者n个)、求得 模型松弛解(LP的解)、分支定界的详细信息。
最复杂的就是分支定界展开的部分,会每隔几分钟(默认5分钟,可以更改),显示结果。
分支定界展开的部分 分成了 4 块:nodes(节点)、current nodes(当前节点)、object bound(目标界限)和woks(工作)
nodes的理解 ,看 https://zhidao.baidu.com/question/78745530.html 节点(根节点和中间节点)和叶节点(下面没有展开的节点)。log中的nodes信息包括两个部分:在当前节点下,已经探索的节点和未探索的叶节点。那么 expl就是已经探索的节点数量,这个数量是递增的,会越来越多的。问题来了,可不可以一开始计算出有多少个这样的节点数量,好像不能。unexpl就是未探索的叶节点数量,就是那些没有展开的节点,如果是整数,就不用展开了,如果是小数,就必须展开,如果最优值大于某个整数解的上界,那么可以剪枝了,也不用展开。这个unexpl信息不知道怎么用。
current node的理解 。log的信息包含 3 个部分:求解出来的松弛解、这个节点的深度、整数变量(就是这个解当中含有)的个数。
如果是整数解,那么一般会用标记(H和*)表示,说明在这个节点上得到了整数解,不是松弛解,松弛解那里会空出来的,但是节点的深度值还是会显示出来,整数解的个数就不用显示了,因为全是整数。
如果不全是整数解,那么就是松弛解,这个时候 松弛解 会显示出来,深度会显示出来, 整数变量的个数也会显示出来,整数变量越多应该会好吧,这样就逼近 一个可行解了。当然,还会碰到一种情况,就是cutoff,这种情况表示 current node 被剪枝了,说明这个node得到的松弛解 比 incumbent solution 还要大,应该 cutoff掉。当然,还会出现 infeasible ,说明这个node 得到的lp 是不可行解。
object bound的理解。包括Incumbent、BestBd 和Gap ,个人觉的这一块的信息 最为重要。
incumbent solution : 最优解的上界,这个值会变化的,我们用最优化最小值来说明,这个值会一直减小。意思是如果发现了一个可行解比原来的incumbent solution小的话,那么就替代成 new incumbent solution,这个就是定界中的上界; 问题来了,那么下界呢?
BestBd :最优解的下界,这个值也是会变化的,我们也用最优化最小值来说明,这个值会一直增大。这个我一直没有理解到关键点,怎么增大,或者怎么替换这个值。可以参考 https://blog.csdn.net/weixin_40493805/article/details/101776207
我的理解,如果当前bestBd的这个分支没有找到好的可行解,那么这个支就没有用了,另外的支点的松弛解(比较小)就变成了bestBd了。 这个和分支定界法中的搜索路径有关系,可以参考 https://wenku.baidu.com/view/8736a8b565ce050876321354.html
Gap : 就是上面两个值的差,原理是gap小于一个值的,就表示找到了最优解。一般用的是相对gap来表示,默认值是0.01%,或者是0.0001。这个已经比较小了,10000个里面1个,所以可以改变这个值,表示已经达到了最优解。怎么理解整个数值呢,我们可以打个比方,比如说你的最优值理论上是5,目前best bound 4.8,incumbent solution是5.1 ,那么abs(5.1-4.8)/5.8 = 0.0588 ,也就是这个mipgap = 5.88% ;继续,b = 4.9,i = 5.1 ,那么gap = 3.92% ,已经很接近了。所以,可以更改这个mip值。
work:提供在那个point上同时进行了多少simplex 运算 等信息。其实,我不是很懂这方面的信息。主要包括了 2 个部分: 线程数 (It/Node)和 时间点(time) 。 我的理解:在那个node 上的统计,每一行就是一个节点的统计,回顾一下,在某个节点,统计出已经explorer了多少nodes,还有多少 leaf nodes 没有展开(explorer);算出这个node的 relaxation solution(松弛解),如果是可行解,那么不会给出value,但是会标记是heuristic得到的,或者是simple得到的,如果不是可行解,是松弛解,那么给出一个value,可能这个value会变成best bound ,并且给出这个node的深度,还有这个松弛解里面包含了多少整数变量;再总结出这个node情况下的整体情况,包括现在的上界,也就是incumbent solution ,下界 best bound ,gap等信息;最后就是这个work的信息,在这个node下,总共有多少了子节点同时在计算,然后就是画了多少时间,是时间点。
8、总结:这个部分是对目前结果的信息,比如是求得最优解,或者由于时间达到了最优解等。
统计用到的割平面,有以下 3种
GOMORY cuts:高莫雷
MIR cuts: mixed integer rounding
StrongCG cuts: Strong Chvátal-Gomory
探索了多少个nodes,最后解的形式是什么?(得到最优解、时间到了,或者gip到了等)