Is there any MIP solver you would recommend?

(Feel free to move this topic to offtopic, if desired)

I feel a bit sorry for my situation: I’d been using JuMP+Gurobi for more than 3 years. I thought it should be Gurobi10, at which time users need to set the nonconvex to 2 to support nonconvex optimization (which they don’t have to now).

As suggested by this link As a student at a university in China, how do I request a Free Academic License? – Gurobi Help Center, I’ll no longer have access to the Gurobi optimizer. It’s a bit sad but I think I shouldn’t grieve for something that wasn’t my fault—just like I’m also ineligible to use Claucle (though I’ve heard of it a lot of times), etc…

I would be glad to switch to HiGHS.jl, but I’m not sure if it will be as full-featured as Gurobi’s optimizer. (I’m actually prepared somewhat for the performance variation, if any).

For example, for a Gurobi’s MILP model, when I call optimize!(model) to let it solve for some time and then interrupt, and I call optimize!(model) for the 2nd time, I would just pick up all the information from the last solve. But when I use HiGHS, it seems that the 2nd-time optimize! would be identical to the 1st-time solve—it starts solving the MILP from scratch again. I don’t understand this behavior.

For another example, for a Gurobi’s MILP model, if I modify some objective coefficient and re-optimize, it would show “MIP starts from previous solution”, I’m not sure if HiGHS can also reuse information efficiently (in LPs, in MIPs, respectively).

Another small thing (I’m not sure if it is seen as an issue) is that ctrl+c works only with some small probability when HiGHS is solving a tough MILP.

(Finally, okay, I know there’s a well-known related solver that I could use—I just want to hear some more options. I wonder if there’s more experience that I can learn from. Thanks.)

With JuMP.jl, the best Mixed-Integer Programming (MIP) solver depends on whether you need a permissive open-source license (MIT), warm-starting across interrupted solves, or single-threaded throughput inside Threads.@threads:

  1. Best Open-Source Default (HiGHS.jl, MIT License): HiGHS is the clear open-source leader in JuMP, substantially faster and more numerically stable than Cbc or GLPK on medium-to-large MILPs. Since you parallelize across outer Julia threads (Threads.@threads), pin each HiGHS instance to threads = 1 and pass the incumbent primal solution back via set_start_value before calling optimize!(model) a second time (since HiGHS does not yet persist its internal branch-and-bound tree across interrupted optimize! calls the way Gurobi does, but does accept a MIP warm-start vector to prune the second search):
using JuMP, HiGHS

model = Model(HiGHS.Optimizer)
set_attribute(model, "presolve", "on")
set_attribute(model, "threads", 1) # 1 thread per solver when outer-looping with Threads.@threads
set_attribute(model, "time_limit", 60.0)

# After a time-limited or interrupted solve, feed the incumbent primal solution as a warm start:
if has_values(model)
    for v in all_variables(model)
        set_start_value(v, value(v))
    end
end
  1. Open-Source MINLP & Tree Resume (SCIP.jl, Apache-2.0): Unlike HiGHS, SCIP is now fully open-source under the Apache-2.0 license and does preserve its internal branch-and-bound tree, cutting planes, and conflict clauses in memory if you raise the time limit and call optimize!(model) a second time without rebuilding the problem.
  2. Academic & Commercial Alternatives (COPT.jl / CPLEX.jl): If you are at a university in China and lost Gurobi academic access, Cardinal Optimizer (COPT.jl) provides free academic licenses globally (including Chinese universities), supports full JuMP MOI warm-starts/callbacks, and sits side-by-side with Gurobi on Mittelmann MILP benchmarks.

Welcome.

Although I typically won’t use in-solver parallelism (I’d use Julia’s multithreading, with each MIP optimization procedure occupying only one logical processor).