在模型计算中,由于浮点计算的存在,包括数学建模当中常用的大M法等,都可能会使得结果存在轻微偏离预期的情况。然而,对于一些一定范围内的轻微偏移,我们常常是能够接受的,因为这些轻微的偏移能通过简单的调整变成合理的结果,且这些允许的轻微偏移,往往能够使得求解器的效率更高。
在求解器中,对可行解最优解等,都会有一个容忍误差,这个误差使得结果的轻微偏移并不改变相应的性质,这种对精度的放松也是求解器提高效率的一个技巧,以下对求解器的几种容忍误差进行解释:
min ? 0 s . t . x ≤ 0 x ≥ 1 0 ? 10 \begin{aligned} \min&0\\ s.t.& x\leq 0\\ & x\geq 10^{-10} \end{aligned} mins.t.?0x≤0x≥10?10?
import gurobipy as grb
model = grb.Model()
x = model.addVar(vtype=grb.GRB.INTEGER, name='x')
model.addConstr(x <= 0)
model.addConstr(x >= 10e-10)
model.setObjective(0, sense=grb.GRB.MINIMIZE)
model.optimize()
Solution count 1: 0
Optimal solution found (tolerance 1.00e-04)
Best objective 0.000000000000e+00, best bound 0.000000000000e+00, gap 0.0000%
目标函数值: 0.0
参数 x = -0.0
这些容忍误差使得在搜索空间中,存在一个模糊的区域,这些区域的值基于一定的误差被我们接受,甚至于稍微不可行的解也可以被视为是可行的,因此对于不同的求解器而言,可能存在不同的容忍水平,使得问题的求解结果出现一定的差异。