Closed claud10cv closed 2 years ago
Yes - this is a bug which needs to be fixed. Can you plz share the JuMP model with the Alpine's settings, instead of the lp file?
Thank you. I am attaching a minimal example to reproduce the error. The relevant files are:
The compressed file contains a brief README of how to use this code to reproduce the bug. Hope it helps bug181.zip
@claud10cv One simple fix which converges to a global optimal solution (358.0631
) is to turn off the presolve in Alpine, using the following setting:
model = JuMP.Model(optimizer_with_attributes(Alpine.Optimizer,
"nlp_solver" => get_ipopt(),
"mip_solver" => get_cplex(),
"minlp_solver" => get_juniper(),
"time_limit" => 3600,
"presolve_bt" => false))
Thank you, I will try that. Can you confirm that you can reproduce the issue with the code provided? If there is anything else on my end that I can do to help you narrow the search, please let me know
Thanks @claud10cv! I am able to reproduce the issue, using both CPLEX and Gurobi as the underlying MILP solver. From a quick look, the issue is clearly in the presolve step where the bound tightening is performed. For example, the following settings for Alpine also seems to converge to global optimality:
model = JuMP.Model(optimizer_with_attributes(Alpine.Optimizer,
"nlp_solver" => get_ipopt(),
"mip_solver" => get_cplex(),
"minlp_solver" => get_juniper(),
"time_limit" => 3600,
"presolve_bt" => true,
"presolve_bt_max_iter" => 5)
)
However, increasing the presolve_bt_max_iter
from 5 to 7 is causing the convergence issue. Some variables are incorrectly getting bounded in this function.
Though Alpine's issues are fixed here, the upper bounding incumbent found by Juniper is numerically incorrect. While the global optimum for this (min obj.) instance is 358.063127426
(which was verified in BARON), Juniper reports 358.0630085311286
as a local solution, which is numerically close but not a valid bound within Alpine's tolerance (1E-6). Hence Alpine terminates with the issue as titled here.
The attached MINLP makes Alpine behave erratically, as it computes a lower (dual) bound that exceeds the upper (primal) bound since the first iteration. The underlying solvers are: mip solver CPLEX 20.1, nlp local solver Juniper (Ipopt + CPLEX), using default settings except for the number of threads set to 1 in all cases. It raises multiple warnings during presolve (see below). Here is the output of solving this minimization problem using Alpine:
model.zip