求解器的可行解存在一个允许的误差范围

发布时间:2023年12月21日

在模型计算中,由于浮点计算的存在,包括数学建模当中常用的大M法等,都可能会使得结果存在轻微偏离预期的情况。然而,对于一些一定范围内的轻微偏移,我们常常是能够接受的,因为这些轻微的偏移能通过简单的调整变成合理的结果,且这些允许的轻微偏移,往往能够使得求解器的效率更高。

在求解器中,对可行解最优解等,都会有一个容忍误差,这个误差使得结果的轻微偏移并不改变相应的性质,这种对精度的放松也是求解器提高效率的一个技巧,以下对求解器的几种容忍误差进行解释:

  1. 整数值的容忍误差:倘若一个变量 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 时,视变量为整数值;
  2. 可行解的容忍误差:满足所有约束的解为可行解,但仅轻微地违背部分约束的解有时也可以被视为可行解,这取决于对约束违背量的容忍度,例如对于约束 a x ≤ b ax\leq b axb,则只要 a x ? b ≤ F e a s i b i l i t y T o l ax-b\leq FeasibilityTol ax?bFeasibilityTol,则视为约束是成立的,在这个范围内的解也被视为是可行的,如下例子所示,用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.?0x0x10?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
  1. 最优值的容忍误差:根据强对偶定理,线性问题取到最优解时原问题的最优值 c c c 和对偶问题的最优值 a y ay ay 是重合的,对于最小化的优化问题, a y ≤ c ay\leq c ayc,当两个值的差距达到容忍误差范围内时,认为达到了最优,即 a y ? c ≤ O p t i m a l i t y T o l ay-c\leq OptimalityTol ay?cOptimalityTol

这些容忍误差使得在搜索空间中,存在一个模糊的区域,这些区域的值基于一定的误差被我们接受,甚至于稍微不可行的解也可以被视为是可行的,因此对于不同的求解器而言,可能存在不同的容忍水平,使得问题的求解结果出现一定的差异。

文章来源:https://blog.csdn.net/Linshaodan520/article/details/135118225
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。