My favorites | Sign in
Project Home Downloads Wiki Issues Source
Project Information
Members
Featured
Downloads
Links

ctypes-glpk is a Python module which encapsulates the functionality of the GNU Linear Programming Kit (GLPK). The GLPK allows one to specify linear programs (LPs) and mixed integer programs (MIPs), and to solve them with either simplex, interior-point, or branch-and-cut algorithms. The goal of ctypes-glpk is to give one Python access to all documented functionality of GLPK.

Advantages

  • Complete access to all documented functionality of GLPK, up to version 4.33
  • No installation or compiler required, just import a single module named 'glpk' and run
  • Cross platform, running on Windows, Linux, and virtually any other platform supporting GLPK

Example

C code

#include <stdio.h>
#include <stdlib.h>
#include "glpk.h"

int main(void)
{ 
    glp_prob *lp;
    int ia[1+1000], ja[1+1000];
    double ar[1+1000], Z, x1, x2, x3;
    lp = glp_create_prob();
    glp_set_prob_name(lp, "sample");
    glp_set_obj_dir(lp, GLP_MAX);
    glp_add_rows(lp, 3);
    glp_set_row_name(lp, 1, "p");
    glp_set_row_bnds(lp, 1, GLP_UP, 0.0, 100.0);
    glp_set_row_name(lp, 2, "q");
    glp_set_row_bnds(lp, 2, GLP_UP, 0.0, 600.0);
    glp_set_row_name(lp, 3, "r");
    glp_set_row_bnds(lp, 3, GLP_UP, 0.0, 300.0);
    glp_add_cols(lp, 3);
    glp_set_col_name(lp, 1, "x1");
    glp_set_col_bnds(lp, 1, GLP_LO, 0.0, 0.0);
    glp_set_obj_coef(lp, 1, 10.0);
    glp_set_col_name(lp, 2, "x2");
    glp_set_col_bnds(lp, 2, GLP_LO, 0.0, 0.0);
    glp_set_obj_coef(lp, 2, 6.0);
    glp_set_col_name(lp, 3, "x3");
    glp_set_col_bnds(lp, 3, GLP_LO, 0.0, 0.0);
    glp_set_obj_coef(lp, 3, 4.0);
    ia[1] = 1; ja[1] = 1; ar[1] = 1.0; /* a[1,1] = 1 */
    ia[2] = 1; ja[2] = 2; ar[2] = 1.0; /* a[1,2] = 1 */
    ia[3] = 1; ja[3] = 3; ar[3] = 1.0; /* a[1,3] = 1 */
    ia[4] = 2; ja[4] = 1; ar[4] = 10.0; /* a[2,1] = 10 */
    ia[5] = 3; ja[5] = 1; ar[5] = 2.0; /* a[3,1] = 2 */
    ia[6] = 2; ja[6] = 2; ar[6] = 4.0; /* a[2,2] = 4 */
    ia[7] = 3; ja[7] = 2; ar[7] = 2.0; /* a[3,2] = 2 */
    ia[8] = 2; ja[8] = 3; ar[8] = 5.0; /* a[2,3] = 5 */
    ia[9] = 3; ja[9] = 3; ar[9] = 6.0; /* a[3,3] = 6 */
    glp_load_matrix(lp, 9, ia, ja, ar);
    glp_simplex(lp, NULL);
    Z = glp_get_obj_val(lp);
    x1 = glp_get_col_prim(lp, 1);
    x2 = glp_get_col_prim(lp, 2);
    x3 = glp_get_col_prim(lp, 3);
    printf("\nZ = %g; x1 = %g; x2 = %g; x3 = %g\n", Z, x1, x2, x3);
    glp_delete_prob(lp);
    return 0;
}

Python code

# Importing stuff
from ctypes import *
from glpk import *

if __name__ == '__main__':

    # allocating some variables
    ia = (c_int*(1+1000))(); ja = (c_int*(1+1000))();
    ar = (c_double*(1+1000))();
    lp = glp_create_prob();
    glp_set_prob_name(lp, "sample");
    glp_set_obj_dir(lp, GLP_MAX);
    glp_add_rows(lp, 3);
    glp_set_row_name(lp, 1, "p");
    glp_set_row_bnds(lp, 1, GLP_UP, 0.0, 100.0);
    glp_set_row_name(lp, 2, "q");
    glp_set_row_bnds(lp, 2, GLP_UP, 0.0, 600.0);
    glp_set_row_name(lp, 3, "r");
    glp_set_row_bnds(lp, 3, GLP_UP, 0.0, 300.0);
    glp_add_cols(lp, 3);
    glp_set_col_name(lp, 1, "x1");
    glp_set_col_bnds(lp, 1, GLP_LO, 0.0, 0.0);
    glp_set_obj_coef(lp, 1, 10.0);
    glp_set_col_name(lp, 2, "x2");
    glp_set_col_bnds(lp, 2, GLP_LO, 0.0, 0.0);
    glp_set_obj_coef(lp, 2, 6.0);
    glp_set_col_name(lp, 3, "x3");
    glp_set_col_bnds(lp, 3, GLP_LO, 0.0, 0.0);
    glp_set_obj_coef(lp, 3, 4.0);
    ia[1] = 1; ja[1] = 1; ar[1] = 1.0; # a[1,1] = 1
    ia[2] = 1; ja[2] = 2; ar[2] = 1.0; # a[1,2] = 1
    ia[3] = 1; ja[3] = 3; ar[3] = 1.0; # a[1,3] = 1
    ia[4] = 2; ja[4] = 1; ar[4] = 10.0; # a[2,1] = 10
    ia[5] = 3; ja[5] = 1; ar[5] = 2.0; # a[3,1] = 2
    ia[6] = 2; ja[6] = 2; ar[6] = 4.0; # a[2,2] = 4
    ia[7] = 3; ja[7] = 2; ar[7] = 2.0; # a[3,2] = 2
    ia[8] = 2; ja[8] = 3; ar[8] = 5.0; # a[2,3] = 5
    ia[9] = 3; ja[9] = 3; ar[9] = 6.0; # a[3,3] = 6
    glp_load_matrix(lp, 9, ia, ja, ar);
    glp_simplex(lp, None);
    Z = glp_get_obj_val(lp);
    x1 = glp_get_col_prim(lp, 1);
    x2 = glp_get_col_prim(lp, 2);
    x3 = glp_get_col_prim(lp, 3);
    print "\nZ = %g; x1 = %g; x2 = %g; x3 = %g\n" % (Z, x1, x2, x3);
    glp_delete_prob(lp);

Bugs and Commentary

Please send information on issues of usage to Minh-Tri Pham <pmtri80@gmail.com>, or create an issue in the Issues pannel.
Powered by Google Project Hosting