首页>软件资讯>常见问题

常见问题

Gurobi求解日志解读

发布时间:2026-03-24 10:10:59人气:8

Gurobi求解日志解读

Gurobi中参数设置:在Python中使用Gurobi,有以下内置的参数可以控制日志的输出(注意要模型求解,即model.optimize() 前设置模型参数):(1)OutputFlag: 控制是否在屏幕打印求解log(=1(默认):是,=0:否)使用:Model.Params.OutputFlag = 0.0或 model.setParam(GRB.Param.OutputFlag,0.0)或 model.setParam(‘OutputFlag’,0.0)

(2)LogFile:控制将log输出到指定的log_save_path文件中使用:Model.Params.LogFile = ‘log_save_path’或 model.setParam(GRB.Param.LogFile,’log_save_path’)

需要注意:将OutputFlag设置为0.0的话就关闭了日志的输出,此时再设置LogFile参数也得不到想要的求解记录。因此,要想把日志输出到特定文件,需要将OutputFlag参数设置为1(默认的),再利用LogFile参数设定日志保存的文件路径。

下面对CVRP模型的求解log进行解析:

Gurobi Optimizer version 9.1.1 build v9.1.1rc0 (linux64):所使用的Gurobi版本号和计算机环境

Thread count: 1 physical cores, 2 logical processors, using up to 2 threads:计算机的物理内核和逻辑处理器的数量,通常后者会大于前者。最后说明了求解器在运算过程中最多可以使用的线程数。这个可以通过参数“Threads”进行设置,默认为0,即由求解器自动选择机器中的内核数进行运算(通常会使用全部,不过也有可能使用部分)。

Optimize a model with 60 rows, 256 columns and 480 nonzerosModel fingerprint: 0xb7746e11Model has 210 general constraintsVariable types: 16 continuous, 240 integer (240 binary)Coefficient statistics:  Matrix range     [1e+00, 1e+00]  Objective range  [3e+00, 1e+02]  Bounds range     [1e+00, 2e+01]  RHS range        [1e+00, 2e+01]:原始模型的一些基本情况第1行:约束的系数矩阵:60条约束,256列第2行:模型的标识(根据模型所有组件属性值得到的一个哈希值)第3行:模型使用的广义约束情况(非必须),这里报告了模型中有210条广义约束即:

GC0: x[7,3] = 1 -> - u[3] + u[7] = -8GC1: x[6,9] = 1 -> u[6] - u[9] = -5GC2: x[12,1] = 1 -> - u[1] + u[12] = -7                          ……第4行:16个连续变量和240个二值型整数变量第5-9行:关于约束矩阵的统计信息,可以用来粗略的估计该模型在求解时是否会产生数值稳定性问题。Matrix range –》约束矩阵的系数范围Objective range –》目标函数的系数范围Bounds range –》变量取值界限的范围RHS range –》约束矩阵右端项的系数范围

补充:数值稳定性问题详情链接:https://www.gurobi.com/documentation/9.1/refman/guidelines_for_numerical_i.html#sec:Numerics数值不稳定性的表现:如果更改模型求解参数(例如求解方法或随机数种子)导致不同的优化状态(Infeasible instead of optimal),或者问题最优值发生变化。原因:大多可以分为4类:构建模型时对系数四舍五入;浮点运算的局限性;无法实现的期望精度;病态或几何诱导的问题(原文:Ill conditioning, or geometry-induced issues)

下面log部分展示的内容取决于模型求解的具体方式(包括simplex,barrier, sifting,Branch-and-cut, or IIS )。其中以MIP模型求解为例进行说明如下(以Branch-and-cut为求解算法),MIP 日志可分为三个部分:预处理部分、求解过程部分和总结部分。

(1)预处理部分:Presolve added 344 rows and 33 columnsPresolve time: 0.03sPresolved: 404 rows, 289 columns, 2748 nonzerosVariable types: 61 continuous, 228 integer (228 binary):求解器对模型预处理的结果:添加了344条约束和33列,最后两行报告了预处理后的模型规格(实际交给分支定界算法进行求解的模型)。对一般的模型,预处理操作是能够减少问题的约束和变量的数量的,这里反而增加了约束和变量可能是由于求解器处理广义约束引起的。

(2)求解过程部分Found heuristic solution: objective 2987.3862478:Gurobi使用启发式策略找到的整数可行解,可以用来提供一个较好的迭代初始解

Root relaxation: objective 5.524647e+02, 116 iterations, 0.00 seconds:预处理后的模型的松弛问题的最优解----(LP问题)使用单纯形法进行求解。注意,如果根节点松弛问题求解时间超过” DisplayInterval”设定的默认值(5秒),log还会显示详细的过程信息。

以下是分支定界算法的求解迭代信息:需要注意的是,报告的记录并不是实时的,在默认情况下,一般每隔5秒进行一次输出。输出的时间间隔可以通过参数”DisplayInterval”进行设置。

Nodes部分(前两列)提供了算法搜索进度的一般定量信息。第一列Expl表示到当前节点算法已经探索过的节点数量,这个数量随着时间推移逐渐增大;第二列Unexpl表示迭代到当前节点时,还未探索的叶子节点总数,这个数量不一定是递增的。对于探索中找到的可行解还会用H或者*进行标记(H-使用启发式策略找到的,*-使用分支定界算法找到的)

Current Node部分提供了当前探索的节点的详细信息,包括了当前节点松弛问题的最优值、该节点深度和该节点松弛解中整数变量不取整数解的个数(即违反整数取值的整数变量的个数)

Objective Bound部分提供了迭代到当前为止找到的最优的界。对于极小化问题,Incumbent为最优上界,BestBd为最优下界,问题的最优值会出现在这两个Bound之间,Gap反映了两个Bound的差距,其计算公式为:

注意:可以通过设置”MIPGap”参数来控制求解器停止迭代,即当算法迭代中得到的gap小于预先设置的”MIPGap”时,迭代终止。使用:model.Params.MIPGap=0.01

Work部分报告了迭代到当前位置所进行的运算工作量。第一列It/Node表示在分支定界树中每个节点平均的单纯形迭代次数;第二列Time表示开始求解到当前位置的运行时间,注意:可以通过设置模型的”TimeLimit”参数来控制求解器在指定时间(默认单位为秒)内终止迭代。使用:model.Params.TimeLimit = 3600

值得注意的是:求解开始后,我们可以看到在最前面的记录中探索节点数一直为0,这表示Gurobi正在处理根节点。Gurobi一般会在根节点上进行多种尝试工作来产生割平面、寻找启发式解等来减小随后要探索的 分支-切割树 的大小!!!

(3)总结部分:分支定界算法迭代中使用的各种切割平面的次数;

Explored 12659 nodes (390546 simplex iterations) in 31.61 secondsThread count was 2 (of 2 available processors):探索的节点个数、单纯形总共迭代次数、求解器求解时间、使用的线程数量;

Solution count 8: 1540.48 1540.48 1567.62 ... 2987.39:找到的可行解的最优目标值,对于最小化问题是按照升序排列;

Optimal solution found (tolerance 1.00e-04):求解器完成求解后的状态:Optimal (找到了最优值);补充:常见的其他状态-LOADED(模型被加载了但无解的信息)、INFEASIBLE(模型不可行)、UNBOUNDED(模型无界)、TIME_LIMIT(因超过运行时间’TimeLimit’而停止)

Warning: max constraint violation (1.0000e-05) exceeds toleranceWarning: max general constraint violation (1.0000e-05) exceeds tolerance:一部分警告信息(非必要):用来提示可能存在数值稳定性问题;

Best objective 1.540476751548e+03, best bound 1.540456784263e+03, gap 0.0013%:找到的最优上界、最优下界和最小的gap;



上一条:Gurobi版本9介绍

下一条:没有了!