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