doCPLEX binary_var_matrix给出0.0和1.0之外的值



我用

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给出两个解决方案?这是臭虫吗?如何处理?

不,这不是bug。这对于几乎所有的求解器来说都是完全正常和预期的行为——它们的工作是得到一个解决方案,满足指定公差内的所有约束(比如1e-6到1e-9)。3.7e-13的值非常非常小,所以可以四舍五入到零,而0.999999……非常接近于1,因此可以四舍五入到1。这些"误差"与测量地球的直径大致相同,误差约为一根头发的直径。

理论上可能有一个小的机会,四舍五入的值不满足所有的约束-但我从来没有遇到过任何情况下,在近30年使用CPLEX,也没有其他人,我听说过。

如果这对你来说仍然不够好,你可以尝试从CPLEX获得解决方案值,四舍五入这些值,然后用额外的约束重新解决你的模型,将变量固定到四舍五入的值,以证明四舍五入的解决方案确实满足所有的约束。

最新更新