Decision Optimization

Decision Optimization

Delivers prescriptive analytics capabilities and decision intelligence to improve decision-making.

 View Only
  • 1.  Branching priority for variables

    Posted Thu August 29, 2019 07:50 AM

    Originally posted by: walterOR


    I just noticed that in the Python API for Gurobi there is a method that can be used to set the branching priority for each variable. Not completely sure to me how it work in detail, but it seems to be a useful feature for certain problems.

     

    Is there anything comparable in Cplex (docplex for Python, preferably)?


    #CPLEXOptimizers
    #DecisionOptimization


  • 2.  Re: Branching priority for variables

    Posted Thu August 29, 2019 09:23 AM

    Hi,

    in python you could have a look at the example mipex3.py which illustrates SOS sets and priority orders.

     

    in OPL if I use the example from https://www.linkedin.com/pulse/what-optimization-how-can-help-you-do-more-less-zoo-buses-fleischer/

    I can write

    int nbKids=300;
    float costBus40=500;
    float costBus30=400;
     
    dvar int+ nbBus40;
    dvar int+ nbBus30;

    execute
     {
     nbBus40.priority=10;
     nbBus30.priority=1;
     }
     
    minimize
     costBus40*nbBus40  +nbBus30*costBus30;
     
    subject to
    {
     40*nbBus40+nbBus30*30>=nbKids;

    }

    which changes some decision variables priorities

     

    regards


    #CPLEXOptimizers
    #DecisionOptimization


  • 3.  Re: Branching priority for variables

    Posted Thu August 29, 2019 09:28 AM

    Adding to what Alex wrote, for the CPLEX Python API, you can use the order interface.

    Underneath the hood, this uses CPXXcopyorder from the C Callable Library.

     


    #CPLEXOptimizers
    #DecisionOptimization


  • 4.  Re: Branching priority for variables

    Posted Thu August 29, 2019 10:12 AM

    So with docplex , if I follow

    https://www.linkedin.com/pulse/making-optimization-simple-python-alex-fleischer/

    I could write

    from docplex.mp.model import Model

    def set_ordering(dvars, weights, brdirs):
        # set priority ordering on a collection of variables,
        # given a list of weights, and a list of -1,0,1 directions
        ldvars = list(dvars)
        lweights = list(weights)
        ldirs = list(brdirs)
        if ldvars:
            m = ldvars[0].model
            # check all lists have same length
            # weights are numbers
            # directions are -1, 0, 1

            cpx = m.get_cplex()
            cpx.order.set([(dv.index, w, brd) for dv, w, brd in zip(ldvars, lweights, ldirs)])
            cpx.order.write('%s_prio.ord' % m.name)

    mdl = Model(name='buses')
    nbbus40 = mdl.integer_var(name='nbBus40')
    nbbus30 = mdl.integer_var(name='nbBus30')

    set_ordering(dvars=[nbbus40, nbbus30], weights=[10, 1], brdirs=[0, 0])
                            
    mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
    mdl.minimize(nbbus40*500 + nbbus30*400)

    mdl.solve()

    for v in mdl.iter_integer_vars():
       print(v," = ",v.solution_value)


    #CPLEXOptimizers
    #DecisionOptimization


  • 5.  Re: Branching priority for variables

    Posted Fri August 30, 2019 12:12 AM

    Originally posted by: walterOR


    Thank you for these suggestions. This is exactly what I was looking for.


    #CPLEXOptimizers
    #DecisionOptimization