【问题标题】:CPLEX binary_var_matrix gives values outside 0.0 and 1.0CPLEX binary_var_matrix 给出 0.0 和 1.0 之外的值
【发布时间】:2022-07-08 14:53:53
【问题描述】:

我用

from docplex.mp.model import Model
mdl = Model(name='itc_load_planning')
    Assignment = mdl.binary_var_matrix(orders, freights, name='Assignment')
...

ok = mdl.solve()
if ok:
    # mdl.print_solution()
    for index, dvar in enumerate(mdl.solution.iter_variables()):
        svar = dvar.to_string()  #Assignment_<orderid>_<freightid>
        val = dvar.solution_value #<--val is here
       

         

val 大部分时间是 1.0,在一个场合我有以下值

0.9999999999996256 (for Assignment_406_454)
3.74408837266983e-13 (for Assignment_406_467)

orderid=406 应该有 1 个结果,显然这是第一个条目,但为什么 CPLEX 给出了两个解决方案?这是一个错误吗?如何处理?

【问题讨论】:

    标签: cplex docplex


    【解决方案1】:

    不,这不是错误。对于几乎所有求解器来说,这都是完全正常和预期的行为 - 他们努力获得一个满足指定容差内所有约束的解决方案(例如 1e-6 到 1e-9)。 3.7e-13 的值非常小,因此可以四舍五入为零,而 0.999999... 非常接近 1,因此可以四舍五入为 1。这些“错误”与测量地球的直径,误差约为一根头发的直径。

    理论上,舍入值不满足所有约束的可能性很小 - 但在使用 CPLEX 的近 30 年中,我从未遇到过任何这种情况,我听说过的其他任何人也没有。

    如果这对您来说仍然不够好,您可以尝试从 CPLEX 获取解值,对这些值进行四舍五入,然后使用将变量固定为四舍五入值的额外约束重新求解您的模型,以证明四舍五入的解确实确实满足所有约束。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2020-12-29
      • 2019-08-04
      • 2018-04-03
      • 1970-01-01
      相关资源
      最近更新 更多