help-glpk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Help-glpk] Problem using Rglpk with Ruby


From: Lukas Meyer
Subject: Re: [Help-glpk] Problem using Rglpk with Ruby
Date: Thu, 12 Jun 2014 07:59:52 +0200

Dear Eric,

Many thanks for pointing me into the right direction and providing this solution. Indeed I was using the IP instead of MIP solver.
The solution works like a charm.

Thank you and all the best,

Lukas


On 11 June 2014 19:13, Eric Winter <address@hidden> wrote:
Lukas,

Your issue probably stems from a lack of good examples. rglpk (as
opposed to Rglpk) comes with a single example. That example is an LP
problem, not a MIP problem hence the confusion.

If you look at rglpk/test/test_problem_kind.rb inside the rglpk gem
you will find some useful info.

Bottom line the methods called for MIP differ from those called for a
regular LP. There was also an issue with bounding (your problem is
GLP_DB - bounded above and below) So here is my modified version of
your initial Ruby file. I also added a couple of lines to print the results.

Thanks,

Eric


#
# linear programming capital budgeting problem:
# Maximize NPV of projects (x1..x5) by taking into account Budget and
# Resource constraints (c1, c2). Solution can only be 0 or 1
# Maximize: 928 x1 + 908 x2 + 801 x3 + 543 x4 + 944 x5
# Constraints:
# c1: 398 x1 + 151 x2 + 129 x3 + 275 x4 + 291 x5 <= 800
# c2: 111 x1 + 139 x2 + 56 x3 + 54 x4 + 123 x5 <= 200
# Expected optimal mip result: X = [0,0,1,0,1]
require 'rglpk'

p = Rglpk::Problem.new
p.name = "Project selection"
p.obj.dir = Rglpk::GLP_MAX

rows = p.add_rows(2)
rows[0].name = "Budget"
rows[0].set_bounds(Rglpk::GLP_DB, 0, 800)
rows[1].name = "Resources"
rows[1].set_bounds(Rglpk::GLP_DB, 0, 200)

cols = p.add_cols(5)
cols[0].name = "x1"
cols[0].kind = Rglpk::GLP_BV
cols[0].set_bounds(Rglpk::GLP_DB, 0, 1)
cols[1].name = "x2"
cols[1].kind = Rglpk::GLP_BV
cols[1].set_bounds(Rglpk::GLP_DB, 0, 1)
cols[2].name = "x3"
cols[2].kind = Rglpk::GLP_BV
cols[2].set_bounds(Rglpk::GLP_DB, 0, 1)
cols[3].name = "x4"
cols[3].kind = Rglpk::GLP_BV
cols[3].set_bounds(Rglpk::GLP_DB, 0, 1)
cols[4].name = "x5"
cols[4].kind = Rglpk::GLP_BV
cols[4].set_bounds(Rglpk::GLP_DB, 0, 1)

p.obj.coefs = [928, 908, 801, 543, 944]

p.set_matrix([398, 151, 129, 275, 291,111, 139, 56, 54, 123])

# p.simplex  not this, it is an intger programming.
p.mip(presolve: Rglpk::GLP_ON)  # ruby 1.9+
# z = p.obj.get
z = p.obj.mip   # aka glp_mip_obj_val
x1 = cols[0].mip_val 
x2 = cols[1].mip_val
x3 = cols[2].mip_val
x4 = cols[3].mip_val
x5 = cols[4].mip_val

printf("z = %g; x1 = %g; x2 = %g; x3 = %g; x4 = %g; x5 = %g\n", z, x1, x2, x3, x4, x5)

Glpk_wrapper.glp_print_mip(p.lp, "print_mip.txt")
#Glpk_wrapper.glp_print_sol(p.lp, "print_sol.txt")
p.write_lp("write_lp.txt")



reply via email to

[Prev in Thread] Current Thread [Next in Thread]