求解器的可行解存在一个允许的误差范围
在模型计算中,由于浮点计算的存在,包括数学建模当中常用的大M法等,都可能会使得结果存在轻微偏离预期的情况。然而,对于一些一定范围内的轻微偏移,我们常常是能够接受的,因为这些轻微的偏移能通过简单的调整变成合理的结果,且这些允许的轻微偏移,往往能够使得求解器的效率更高。
在求解器中,对可行解最优解等,都会有一个容忍误差,这个误差使得结果的轻微偏移并不改变相应的性质,这种对精度的放松也是求解器提高效率的一个技巧,以下对求解器的几种容忍误差进行解释:
- 整数值的容忍误差:倘若一个变量
x
x
x 被要求是整数类型,则容忍该变量值在取整数值的一定小的范围内视为是整数。公式为满足:
a b s ( x ? f l o o r ( x + 0.5 ) ) ≤ I n t e a s T o l abs(x-floor(x+0.5))\leq InteasTol abs(x?floor(x+0.5))≤InteasTol 时,视变量为整数值; - 可行解的容忍误差:满足所有约束的解为可行解,但仅轻微地违背部分约束的解有时也可以被视为可行解,这取决于对约束违背量的容忍度,例如对于约束 a x ≤ b ax\leq b ax≤b,则只要 a x ? b ≤ F e a s i b i l i t y T o l ax-b\leq FeasibilityTol ax?b≤FeasibilityTol,则视为约束是成立的,在这个范围内的解也被视为是可行的,如下例子所示,用Gurobi求解一个明显无可行解的问题,但求解器最终还是给出了一个“可行解”:
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
- 最优值的容忍误差:根据强对偶定理,线性问题取到最优解时原问题的最优值 c c c 和对偶问题的最优值 a y ay ay 是重合的,对于最小化的优化问题, a y ≤ c ay\leq c ay≤c,当两个值的差距达到容忍误差范围内时,认为达到了最优,即 a y ? c ≤ O p t i m a l i t y T o l ay-c\leq OptimalityTol ay?c≤OptimalityTol。
这些容忍误差使得在搜索空间中,存在一个模糊的区域,这些区域的值基于一定的误差被我们接受,甚至于稍微不可行的解也可以被视为是可行的,因此对于不同的求解器而言,可能存在不同的容忍水平,使得问题的求解结果出现一定的差异。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!