GLPK/Julia

The GLPK.jl package allows use of the GLPK in julia in different ways. In an increasing level of abstraction these are: (a) directly (by wrapping the C API); (b) as interface to MathOptInterface or (c) as the "solver engine" of the algebraic modelling language JuMP.jl.

For example to solve the problem `Maxx,y x + 2y` s.t. `x+y = 3` and `x,y >=0` you could write:

(a) Using the GLPK C API wrapper:

using Pkg; Pkg.add("GLPK") # Just once to install the packages
using GLPK

lp = GLPK.Prob()
GLPK.set_obj_dir(lp, GLPK.MAX)
GLPK.add_rows(lp, 1)
GLPK.set_row_bnds(lp, 1, GLPK.FX, 3.0, 3.0)
GLPK.add_cols(lp, 2)
GLPK.set_col_bnds(lp, 1, GLPK.LO, 0.0, +Inf)
GLPK.set_obj_coef(lp, 1, 1.0)
GLPK.set_col_bnds(lp, 2, GLPK.LO, 0.0, +Inf)
GLPK.set_obj_coef(lp, 2, 2.0)
GLPK.set_mat_row(lp, 1, [1,2], [1,1]) # coefficients given in sparse form
param = GLPK.SimplexParam()
flag  = GLPK.simplex(lp, param) # solves
GLPK.get_obj_val(lp) # 6
GLPK.get_col_prim(lp, 1) # 0 
GLPK.get_col_prim(lp, 2) # 3

(c) using the JuMP API:

using Pkg; Pkg.add(["GLPK","JuMP"]) # Just once to install the packages
using GLPK, JuMP

model = Model(GLPK.Optimizer)
set_optimizer_attribute(model, "msg_lev", GLPK.MSG_OFF)

@variables model begin
    x >= 0 # could be parts of n-dimensional arrays, like x[p in plants, m in markets]
    y >= 0
end

@constraints model begin
   bound1, x+y == 3
end

@objective model Max begin
    x +  2*y
end

print(model)

optimize!(model)
objective_value(model) # 6
value(x) # 0
value(y) # 3