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 Help-glpk@gnu.org https://lists.gnu.org/mailman/listinfo/help-glpk