Re: [Fwd: is there a dll edition of glpk mip solver?]

"Heinrich Schuchardt" <[email protected]>
Newsgroups gmane.comp.gnu.glpk
Message-ID <trinity-dab4d4c1-be04-4ab6-ab43-77b76246e82d-1512629200058@msvc-mesg-gmx117>
Am 07.12.17, 07:11, "Liujianxin (Jason)" <[email protected]> schrieb:

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

_______________________________________________
Help-glpk mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-glpk
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.