Browse per problem type
Interface with solvers like Gurobi and HiGHS, or write your own branch-and-bound algorithm.
Solve bilevel problems by KKT reformulations or with bilevel solvers like MibS.
Handle uncertain problems using dualization or column-and-constraint generation algorithms.
Solve large-scale problems efficiently with column generation and branch-and-price techniques.
idol and idol_cl are not a MIP solvers in themselves. In fact, they typically need to call external solvers as a subroutines in more complex algorithms like, e.g., branch-and-cut-and-price algorithms, column-and-constraint generation or various reformulations.
The idea is to work hand in hand with existing and well-engineered optimization software to enhance their possibilities. Not to replace them!
Another advantage of using idol is that you can easily switch between different solvers. Write your model once and try different solvers.
The following MIP solvers are currently supported through idol and idol_cl:
idol is the library underlying the command-line interface idol_cl.
It is a C++ framework for mathematical optimization designed to help you build new algorithms for solving complex problems. The main philosophy behind idol is interoperability and ease of use. Any algorithm can be seamlessly combined with any other algorithm to create a new one.
For instance, you can combine a branch-and-bound algorithm with a column-generation algorithm to create a branch-and-price algorithm. The following code is an actual compiling code using idol.
Next is an example to show you how natural it is to use idol.
Example
Idol has a user-friendly interface which looks natural to people working in optimization. For instance, here is how you solve a knapsack problem instance with Gurobi.
using namespace idol;const unsigned int n_items = 5;const std::vector<double> profit { 40., 50., 100., 95., 30., };const std::vector<double> weight { 2., 3.14, 1.98, 5., 3., };const double capacity = 10.;Env env;Model model(env);model.add_ctr(idol_Sum(j, Range(n_items), weight[j] * x[j]) <= capacity);model.set_obj_expr(idol_Sum(j, Range(n_items), -profit[j] * x[j]));model.use(Gurobi());model.optimize();std::cout << "Status: " << model.get_status() << std::endl;std::cout << "Reason: " << model.get_reason() << std::endl;std::cout << "Time: " << model.optimizer().time().count() << std::endl;std::cout << "Objective value: " << model.get_best_obj() << std::endl;Definition Vector.h:18Definition Gurobi.h:20Definition Model.h:43Definition operators_utils.h:14