On 12/07/2017 07:11 AM, Liujianxin (Jason) wrote:
> 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.
> 

Please, find appended an example showing how to initialize the iocp
structure.

Regars

Heinrich
#!/usr/bin/python

from ctypes import *

# Constants
GLP_MAX = 2
GLP_ON = 1
GLP_IV = 2
GLP_LO = 2
GLP_UP = 3

# Structure glp_iocp
class IOCP(Structure) :
	_fields_ = [
		('msg_lev', c_int),
		('br_tech', c_int),
		('bt_tech', c_int),
		('tol_int', c_double),
		('tol_obj', c_double),
		('tm_lim', c_int),
		('out_frq', c_int),
		('out_dly', c_int),
		('cb_func', c_void_p),
		('cb_info', c_void_p),
		('cb_size', c_int),
		('pp_tech', c_int),
		('mip_gap', c_double),
		('mir_cuts', c_int),
		('gmi_cuts', c_int),
		('cov_cuts', c_int),
		('clq_cuts', c_int),
		('presolve', c_int),
		('fp_heur', c_int),
		('ps_heur', c_int),
		('ps_tm_lim', c_int),
		('sr_heur', c_int),
		('use_sol', c_int),
		('save_sol', c_char_p),
		('alien', c_int),
		('flip', c_int),
		('foo_bar', c_double * 23)]

solver = cdll.LoadLibrary('libglpk.so')

# Adjust function prototypes
solver.glp_create_prob.restype = c_void_p
solver.glp_init_iocp.argtypes = [ POINTER(IOCP) ]
solver.glp_intopt.argtypes = [ c_void_p, POINTER(IOCP) ]
solver.glp_mip_obj_val.restype = c_double
solver.glp_mip_col_val.restype = c_double
solver.glp_set_row_bnds.argtypes = [ c_void_p, c_int, c_int, c_double, c_double ]
solver.glp_set_col_bnds.argtypes = [ c_void_p, c_int, c_int, c_double, c_double ]
solver.glp_set_obj_coef.argtypes = [ c_void_p, c_int, c_double]

# Create problem
lp = c_void_p(solver.glp_create_prob())
solver.glp_set_prob_name(lp, 'Problem')

# Define rows and columns
solver.glp_add_rows(lp, 2)
solver.glp_set_row_name(lp, 1, 'p')
solver.glp_set_row_bnds(lp, 1, GLP_UP, 0.0, 10.5)
solver.glp_set_row_name(lp, 2, 'q')
solver.glp_set_row_bnds(lp, 2, GLP_UP, 0.0, 19.7)
solver.glp_add_cols(lp, 2)
solver.glp_set_col_name(lp, 1, 'x1')
solver.glp_set_col_bnds(lp, 1, GLP_LO, 0.0, 0.0)
solver.glp_set_col_name(lp, 2, 'x2')
solver.glp_set_col_bnds(lp, 2, GLP_LO, 0.0, 0.0)
solver.glp_set_col_kind(lp, 2, GLP_IV)

# Define objective
solver.glp_set_obj_dir(lp, GLP_MAX)
solver.glp_set_obj_name(lp, 'obj')
solver.glp_set_obj_coef(lp, 1, 0.61)
solver.glp_set_obj_coef(lp, 2, 0.49)

# Define matrix
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, 4, ia, ja, ar);

# Solve
iocp = IOCP()
solver.glp_init_iocp(iocp)
iocp.presolve = GLP_ON
ret = solver.glp_intopt(lp, iocp)
if ret:
	print('Failure\n')
	solver.glp_delete_prob(lp)
	solver.glp_free_env()
	quit()

# Get results
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('obj = %g; x1 = %g; x2 = %g\n'%(z, x1, x2))

# Cleanup
solver.glp_delete_prob(lp)
solver.glp_free_env()
_______________________________________________
Help-glpk mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-glpk

Reply via email to