I have been testing the solvers of COIN-OR, namely Cbc (MILP solver) and Clp (LP solver).
I obtain for Cbc a very good performance, Cbc even outperforms some commertial solvers in numerically complex problems. But being a MILP solver it does not deliver dual variables.
For Clp the performance I get is very poor in terms of speed, it does not find a solution in times 10 - 20 times the time required by Cbc.
Is anyone able to provide a way out?
I could estimate the duals, but I doubt I could find a way to determine them in all cases
Is there a way to setup Clp so that its lp delivers the same performance as Cbc?
This is kinda strange because Cbc says Clp is their default LP solver so if you are not using any special configuration, then Cbc is just running Clp under the hood and you should be observing similar performance.
Maybe it’s a question of presolve. SCIP uses SoPlex as LP solver by default, but SCIP has much more presolving implemented, so it might still be faster to call SCIP on LP problems.
If the order was the contrary (i.e., if you called Clp before Cbc) I would question if the time difference has nothing to do with the call to Clp precompiling things Cbc will reuse after.
This is very strange, I have JuMP 0.21.2 in my machine and this method is defined.
Thanks, I managed to run exactly what you were indicating just after restarting Julia.
This code does not complete in 1 hour, it neither prints any log:
using JuMP
using Clp
model = read_from_file("test_1.mps")
set_optimizer(model,Clp.Optimizer)
set_optimizer_attribute(model, "LogLevel", 4)
@time optimize!(model)
Whereas this other code is done in less than 200 seconds
using JuMP
using Cbc
model = read_from_file("test_1.mps")
set_optimizer(model,Cbc.Optimizer)
@time optimize!(model)
Presumably these are just hard models. Try GLPK or a commercial solver. Cbc must apply helpful presolves that Clp doesn’t, or it uses non-default parameters.
Team, the issue is apparently on the wrapper side:
“but the Cbc version does not seem to have add_row or add_column so does things in a different way. The Clp version has both add_row and add_rows. If the interface is using add_row and/or add_column, then that would explain the large time spent before Clp. There is an example in Clp/examples/addRows.cpp which which is there just to explain why it is not a good idea to add one row at a time for many rows.”
I have also been evaluating performance with GLPK and with SCIP-SoPlex, but the performance is not good enough.