|
From: | Heinrich Schuchardt |
Subject: | Re: [Help-glpk] [Fwd: is there a dll edition of glpk mip solver?] |
Date: | Thu, 7 Dec 2017 07:46:40 +0100 |
Dear Heinrich,
Thank you very much for the help document recommended. It helped me a lot.
Right now I’m trying to use ctypes library of Python 3.5.4 to load glpk_4_64.dll to solve lp and mip problems.
Test lp problem:
I tried to call the glpk_4_64.dll to solve this problem and succeeded. The following is my code:
from ctypes import *
solver = windll.LoadLibrary('./solver/glpk/w64/glpk_4_64.dll')
lp = solver.glp_create_prob()
solver.glp_set_prob_name(lp, c_wchar_p("short"))
solver.glp_set_obj_dir(lp, c_int(2))
solver.glp_add_rows(lp, c_int(2))
solver.glp_set_row_name(lp, c_int(1), c_wchar_p("p"))
solver.glp_set_row_bnds(lp, c_int(1), c_int(3), c_double(0.0), c_double(1.0))
solver.glp_set_row_name(lp, c_int(2), c_wchar_p("q"))
solver.glp_set_row_bnds(lp, c_int(2), c_int(3), c_double(0.0), c_double(2.0))
solver.glp_add_cols(lp, c_int(2))
solver.glp_set_col_name(lp, c_int(1), c_wchar_p("x1"))
solver.glp_set_col_bnds(lp, c_int(1), c_int(2), c_double(0.0), c_double(0.0))
solver.glp_set_obj_coef(lp, c_int(1), c_double(0.6))
solver.glp_set_col_name(lp, c_int(2), c_wchar_p("x2"))
solver.glp_set_col_bnds(lp, c_int(2), c_int(2), c_double(0.0), c_double(0.0))
solver.glp_set_obj_coef(lp, c_int(2), c_double(0.5))
ia = (c_int*5)()
ja = (c_int*5)()
ar = (c_double*5)()
ia[1]=1; ia[2]=1; ia[3]=2; ia[4]=2
ja[1]=1; ja[2]=2; ja[3]=1; ja[4]=2
ar[1]=1.0; ar[2]=2.0; ar[3]=3.0; ar[4]=1.0
solver.glp_load_matrix(lp, c_int(4), ia, ja, ar)
solver.glp_simplex(lp, None);
solver.glp_get_obj_val.restype = c_double
solver.glp_get_col_prim.restype = c_double
z = solver.glp_get_obj_val(lp)
x1 = solver.glp_get_col_prim(lp, c_int(1))
x2 = solver.glp_get_col_prim(lp, c_int(2))
print("z = %g; x1 = %g; x2 = %g\n"%(z, x1, x2))
solver.glp_delete_prob(lp)
solver.glp_free_env()
the script works fine, and right answer output: z = 0.46; x1 = 0.6; x2 = 0.2.
But when I tried to constrain x2 as an integer variable, the original problem was changed into a mip problem, the following script cannot output right answer:
from ctypes import *
solver = windll.LoadLibrary('./solver/glpk/w64/glpk_4_64.dll')
lp = solver.glp_create_prob()
solver.glp_set_prob_name(lp, c_wchar_p("short"))
solver.glp_set_obj_dir(lp, c_int(2))
solver.glp_add_rows(lp, c_int(2))
solver.glp_set_row_name(lp, c_int(1), c_wchar_p("p"))
solver.glp_set_row_bnds(lp, c_int(1), c_int(3), c_double(0.0), c_double(1.0))
solver.glp_set_row_name(lp, c_int(2), c_wchar_p("q"))
solver.glp_set_row_bnds(lp, c_int(2), c_int(3), c_double(0.0), c_double(2.0))
solver.glp_add_cols(lp, c_int(2))
solver.glp_set_col_name(lp, c_int(1), c_wchar_p("x1"))
solver.glp_set_col_bnds(lp, c_int(1), c_int(2), c_double(0.0), c_double(0.0))
solver.glp_set_obj_coef(lp, c_int(1), c_double(0.6))
solver.glp_set_col_name(lp, c_int(2), c_wchar_p("x2"))
solver.glp_set_col_bnds(lp, c_int(2), c_int(2), c_double(0.0), c_double(0.0))
solver.glp_set_obj_coef(lp, c_int(2), c_double(0.5))
solver.glp_set_col_kind(lp, c_int(2), c_int(2))
ia = (c_int*5)()
ja = (c_int*5)()
ar = (c_double*5)()
ia[1]=1; ia[2]=1; ia[3]=2; ia[4]=2
ja[1]=1; ja[2]=2; ja[3]=1; ja[4]=2
ar[1]=1.0; ar[2]=2.0; ar[3]=3.0; ar[4]=1.0
solver.glp_load_matrix(lp, c_int(4), ia, ja, ar);
solver.glp_intopt(lp, None)
solver.glp_mip_obj_val.restype = c_double
solver.glp_mip_col_val.restype = c_double
z = solver.glp_mip_obj_val(lp)
x1 = solver.glp_mip_col_val(lp, c_int(1))
x2 = solver.glp_mip_col_val(lp, c_int(2))
print("z = %g; x1 = %g; x2 = %g\n"%(z, x1, x2))
solver.glp_delete_prob(lp)
solver.glp_free_env()
the script ran without exceptions but I got all zero output: z = 0; x1 = 0; x2 = 0. It seems the solver didn’t work.
I don’t know why, could you give me some clue? Thx in advance.
B.R.
Jason
[Prev in Thread] | Current Thread | [Next in Thread] |