help-glpk
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Help-glpk] stalled GLPK when launching ret = glp_simplex in VBA


From: Huber, Jean-Christophe
Subject: [Help-glpk] stalled GLPK when launching ret = glp_simplex in VBA
Date: Wed, 27 Feb 2019 16:42:37 +0000

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

 

 

 


reply via email to

[Prev in Thread] Current Thread [Next in Thread]