Dear GLPK users,
I developed a model using GLPK v64 dll from VBA in Excel. This model is mapping
several initial conditions and thus launches the solver in many successive
"nodes" of initial conditions.
For some of them, even if seldom, we have a stalling problem within the dll
itself. We first tried removing the scaling option as it removes most these
occurrence but this is also not 100% OK.
Are there some ways to know why the simplex is stalling? Or any way to
facilitate solutions with some options?
At the moment, the only options I use are similar to the VBA example given in
V64 package (see below)
Many thanks for any hints or advice!
Regards
Jean-Christophe Huber
' ************************************
' link with dll calculation
' ************************************
'-- Management of solver errors
On Error GoTo error0
' Register error hook function
glp_error_hook AddressOf error_hook
' Register terminal hook function
glp_term_hook AddressOf term_hook
'-- Creation of the calculation object
lp = glp_create_prob()
Name = str2bytes("glpVBA")
glp_set_prob_name lp, Name(0)
glp_term_out GLP_OFF
'-- Variables names and bounds, objective cost and integer option
' Set the number of variables
glp_add_cols lp, NbVariables
' Define each variable
For variable_index = 1 To NbVariables
' set variable name
Name = str2bytes(Variable_name(variable_index))
glp_set_col_name lp, variable_index, Name(0)
' set variable kind
' kind of structural variable:
' GLP_CV = 1 continuous variable
' GLP_IV = 2 long variable
' GLP_BV = 3 binary variable
' glp_set_col_kind lp, #col, #kind
' set variable type of bound and bounds values
' Bounds Management
'GLPK_FR free variable: -inf < x[k] < +inf
'GLPK_LO lower bound: l[k] <= x[k] < +inf >> ">="
'GLPK_UP upper bound: -inf < x[k] <= u[k] >> "<="
'GLPK_DB double bound: l[k] <= x[k] <= u[k]
'GLPK_FX fixed variable: l[k] = x[k] = u[k] >> "="
Select Case Variable_BoundType(variable_index)
Case "FX"
glp_set_col_bnds lp, variable_index, GLP_FX,
Variable_LoBound(variable_index), Variable_UpBound(variable_index)
Case "UP"
glp_set_col_bnds lp, variable_index, GLP_UP, 0,
Variable_UpBound(variable_index)
Case "LO"
glp_set_col_bnds lp, variable_index, GLP_LO,
Variable_LoBound(variable_index), 0
Case "FR"
glp_set_col_bnds lp, variable_index, GLP_FR, 0, 0
Case "DB"
If Abs(Variable_LoBound(variable_index) -
Variable_UpBound(variable_index)) <= epsilon Then
glp_set_col_bnds lp, variable_index, GLP_FX,
Variable_LoBound(variable_index), Variable_UpBound(variable_index)
Else
glp_set_col_bnds lp, variable_index, GLP_DB,
Variable_LoBound(variable_index), Variable_UpBound(variable_index)
End If
End Select
' set objective cost for each variable
glp_set_obj_coef lp, variable_index,
Variable_ObjectiveCost(variable_index)
Next
'-- Constraints names and bounds
' Set the number of constraints
glp_add_rows lp, NbConstraints
' Define each constraint
For constraint_index = 1 To NbConstraints
' set constraint name
Name = str2bytes(Constraint_name(constraint_index))
glp_set_row_name lp, constraint_index, Name(0)
' set constraint type of bound and bounds values
' Bounds Management
'GLPK_FR free variable: -inf < x[k] < +inf
'GLPK_LO lower bound: l[k] <= x[k] < +inf >> ">="
'GLPK_UP upper bound: -inf < x[k] <= u[k] >> "<="
'GLPK_DB double bound: l[k] <= x[k] <= u[k]
'GLPK_FX fixed variable: l[k] = x[k] = u[k] >> "="
Select Case Constraint_BoundType(constraint_index)
Case "FX"
glp_set_row_bnds lp, constraint_index, GLP_FX,
Constraint_LoBound(constraint_index), Constraint_UpBound(constraint_index)
Case "UP"
glp_set_row_bnds lp, constraint_index, GLP_UP, 0,
Constraint_UpBound(constraint_index)
Case "LO"
glp_set_row_bnds lp, constraint_index, GLP_LO,
Constraint_LoBound(constraint_index), 0
Case "FR"
glp_set_row_bnds lp, constraint_index, GLP_FR, 0, 0
Case "DB"
glp_set_row_bnds lp, constraint_index, GLP_DB,
Constraint_LoBound(constraint_index), Constraint_UpBound(constraint_index)
End Select
Next
'-- Matrix A coefficients values
matrix_index = 0
For constraint_index = 1 To NbConstraints
For variable_index = 1 To NbVariables
matrix_index = matrix_index + 1
ia(matrix_index) = constraint_index
ja(matrix_index) = variable_index
Ar(matrix_index) = Matrix_val(constraint_index, variable_index)
Next
Next
' set coefficients of the A matrix
glp_load_matrix lp, NbConstraints * NbVariables, ia(0), ja(0), Ar(0)
' Setting objectives
Name = str2bytes("Cost")
glp_set_obj_name lp, Name(0)
If MinBool Then
glp_set_obj_dir lp, GLP_MIN
Else
glp_set_obj_dir lp, GLP_MAX
End If
' Scaling options
' GLP_SF_GM = &H1 ' perform geometric mean scaling
' GLP_SF_EQ = &H10 ' perform equilibration scaling
' GLP_SF_2N = &H20 ' round scale factors to power of two
' GLP_SF_SKIP = &H40 ' skip if problem is well scaled
' GLP_SF_AUTO = &H80 ' choose scaling options automatically
' Note >> not yet linked to dll, to be tested with glp_scale_prob lp,
GLP_SF_AUTO
'glp_scale_prob lp, GLP_SF_AUTO
' Solve model
ret = glp_init_smcp(smcp)
ret = glp_simplex(lp, smcp)
'-- Getting results and linking to subroutine outputs
' Objective cost
optim_ObjCost = glp_get_obj_val(lp)
' Variable values
For variable_index = 1 To NbVariables
optim_VarVal(variable_index) = glp_get_col_prim(lp, variable_index)
Next
' Solver status
SolverStatus = glp_get_status(lp)
Select Case SolverStatus
Case GLP_OPT
StatusText = "Optimal"
Case GLP_FEAS
StatusText = "Feasible"
Case GLP_INFEAS
StatusText = "Infeasible"
Case GLP_NOFEAS
StatusText = "No feasible"
Case GLP_UNBND
StatusText = "Unbounded"
Case GLP_UNDEF
StatusText = "Undefined"
End Select
'-- Close solver
' Free memory
glp_delete_prob lp
' Deregister error hook function
glp_error_hook 0, 0
_______________________________________________
Help-glpk mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-glpk