Skip to content
Ruby wrapper for the GNU linear programming kit (GLPK). The GLPK (GNU Linear Programming Kit) package is intended for solving large-scale linear programming (LP), mixed integer programming (MIP), and other related problems.
C Ruby
Find file
Pull request Compare This branch is 48 commits ahead of bmabey:master.
Latest commit e0a36e7 @wtaysom Merge pull request #10 from njwhite/master
Expose glp_mip_row_val
Failed to load latest commit information.
ext Rename rglpk.c as glpk_wrapper.c.
swig Rename rglpk.c as glpk_wrapper.c.
test Expose glp_mip_row_val
.gitignore Add Gemfile and use latest Minitest
.travis.yml Add Travis CI configuration Update change log.
Gemfile Add Gemfile and use latest Minitest
Gemfile.lock Fix Gemfile.lock
License.txt Initial import. Update GLPK installation instructions
Rakefile Add default rake task
VERSION Version bump to 0.4.0
rglpk.gemspec Regenerate gemspec for version 0.4.0

Build Status


Rglpk is a package providing a Ruby wrapper to the GNU GLPK library. The GLPK (GNU Linear Programming Kit) package is intended for solving large-scale linear programming (LP), mixed integer programming (MIP), and other related problems.

Rglpk (pronounced as "wriggle-pick") is currently in alpha status and the API should be considered subject to change. Rglpk uses Swig to initially wrap the C GLPK library (using a Swig wrapper originally developed by Nigel Galloway) and then a pure Ruby library to wrap the Swig code in a more friendly OO-style.

See github for installation instructions. All bug reports, feature requests and patches are welcome. Enjoy!


A working GLPK library installation is required. Currently, Rglpk is tested with GLPK v4.44 (direct download). To install GLPK, follow standard procedure:

> gzip -d glpk-X.Y.tar.gz
> tar -x < glpk-X.Y.tar
> cd glpk-X.Y
> ./configure
> make
> make check
> make install
> ldconfig # creates the necessary links and cache to the most recent shared libraries

Rglpk is only available as a gem:

> gem install rglpk

The underlying C library is wrapped using Swig. We keep an up-to-date copy of the generated glpk_wrapper.c file with the distribution, so you don't need to install Swig if you don't want to.


Rglpk provides two primary files: ext/glpk_wrapper.c which is a Swig generated wrapper and lib/rglpk.rb which provide a nicer OO-orientated interface. You should only ever need to call methods of the Rglpk class defined lib/rglpk.rb.

An example:

# The same Brief Example as found in section 1.3 of 
# glpk-4.44/doc/glpk.pdf.
# maximize
#   z = 10 * x1 + 6 * x2 + 4 * x3
# subject to
#   p:      x1 +     x2 +     x3 <= 100
#   q: 10 * x1 + 4 * x2 + 5 * x3 <= 600
#   r:  2 * x1 + 2 * x2 + 6 * x3 <= 300
# where all variables are non-negative
#   x1 >= 0, x2 >= 0, x3 >= 0
p = = "sample"
p.obj.dir = Rglpk::GLP_MAX

rows = p.add_rows(3)
rows[0].name = "p"
rows[0].set_bounds(Rglpk::GLP_UP, 0, 100)
rows[1].name = "q"
rows[1].set_bounds(Rglpk::GLP_UP, 0, 600)
rows[2].name = "r"
rows[2].set_bounds(Rglpk::GLP_UP, 0, 300)

cols = p.add_cols(3)
cols[0].name = "x1"
cols[0].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
cols[1].name = "x2"
cols[1].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)
cols[2].name = "x3"
cols[2].set_bounds(Rglpk::GLP_LO, 0.0, 0.0)

p.obj.coefs = [10, 6, 4]

 1, 1, 1,
10, 4, 5,
 2, 2, 6

z = p.obj.get
x1 = cols[0].get_prim
x2 = cols[1].get_prim
x3 = cols[2].get_prim

printf("z = %g; x1 = %g; x2 = %g; x3 = %g\n", z, x1, x2, x3)
#=> z = 733.333; x1 = 33.3333; x2 = 66.6667; x3 = 0


Test everything with:

> rake test

Test a specific test with:

> ruby test/test_brief_example.rb # or what have you.


Copyright (C) 2007 Alex Gutteridge

This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

Something went wrong with that request. Please try again.