Mixed Integer Linear Programming (MILP) solver.


It was developed at the Eindhoven University of Technology.


What is it?

Linear interger programming library, based on the revised simplex method and branch-and-bound methed for the integers.

How cool is it?



GlPK, Clp, Cgl, Coin-or

When to use it?

When you want to embed your linear programming solver in a program.

Is it dead?

Nope, but there is not much development either.

Where is it?


How to use it

The documentation is extensive but hard to read.


file: 1_download.sh


mkdir -p tmp
cd ./tmp
wget -q -O lp_solve_5.5.2.5_source.tar.gz https://downloads.sourceforge.net/project/lpsolve/lpsolve/
tar -xaf lp_solve_5.5.2.5_source.tar.gz
cd lp_solve_5.5/lpsolve55
chmod +x ccc


file: main.c

#include <stdio.h>

#include "lp_lib.h"

void simple_report(const lprec *lp, const int d) {
    if (d == 0 ) {
        printf("optimal solution found.\n");
        print_solution(lp, 1);
        print_constraints(lp, 1);

int main(void) {
    lprec *lp;
    int d;
    int majorversion, minorversion, release, build;

    lp_solve_version(&majorversion, &minorversion, &release, &build);
    printf("lp_solve %d.%d.%d.%d demo\n\n", majorversion, minorversion, release, build);

    //new problem with 4 variables and 0 constraints
    if ((lp = make_lp(0, 4)) != NULL) {
        //add some constraints
        double row[] = {0, 3, 2, 2, 1};
        if (add_constraint(lp, row, LE, 4)) {
            //add_constraintex is now used to add a row.
            //only the npn-zero values must be specfied with this call
            int colno[] = {2, 3, 4};
            double row1[] = {4, 3, 1};
            if (add_constraintex(lp, sizeof(colno) / sizeof(*colno), row1, colno, GE, 3)) {
                //set the objective function
                double row2[] = {0, 2, 3, -2, 3};
                if (set_obj_fn(lp, row2)) {
                    //name variable and constraints
                    if (set_row_name(lp, 1, "speed")) {
                        if (set_col_name(lp, 2, "money")) {
                            //solve the problem
                            d = solve(lp);
                            simple_report(lp, d);
                            //change a single element in the matrix, maximise the objective and solve
                            if (set_mat(lp,2,1,0.5)) {
                                d = solve(lp);
                                simple_report(lp, d);
                            //change the value of a rhs element with set_rh(lp,1,7.45)\n");
                            if ( set_rh(lp, 1, 7.45) ) {
                                d = solve(lp);
                                simple_report(lp, d);
                            //change the integer type, set bounds remove a constraint
                            set_int(lp, 4, TRUE);
                            set_lowbo(lp, 2, 2);
                            set_upbo(lp, 4, 5.3);
                            del_constraint(lp, 1);
                            d = solve(lp);
                            simple_report(lp, d);
                            //Add an equality constraint and add one column
                            double row3[] = {0, 1, 2, 1, 4};
                            double col[] = {3, 2, 2};
                            if (add_constraint(lp, row3, EQ, 8)) {
                                if(add_column(lp, col)) {
                            //remove one column, set scaling
                            set_scaling(lp, SCALE_MEAN);
                            //get one matrix element
                            printf("%f %f\n", (double)get_mat(lp,2,3), (double)get_mat(lp,1,1));
                            d = solve(lp);
                            simple_report(lp, d);
                            //unscale and reset the problem to the initial basis


file: 2_compile_and_run.sh


gcc -o ./tmp/main main.c -I./tmp/lp_solve_5.5 ./tmp/lp_solve_5.5/lpsolve55/bin/ux64/liblpsolve55.a -lm -ldl

Further reading:

We only tipped the top of the iceberg here. There is much more: