Decision Optimization

Decision Optimization

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

 View Only

Very simple docplex : relaxations and conflicts

  • 1.  Very simple docplex : relaxations and conflicts

    Posted Wed March 13, 2019 11:53 AM

    Hi,

    let's go on with the example from https://www.linkedin.com/pulse/what-optimization-how-can-help-you-do-more-less-zoo-buses-fleischer/

     

    Not all models are feasible so let's see how we can display relaxation and conflicts with the docplex python API.

    from docplex.mp.model import Model
    from docplex.mp.relaxer import Relaxer
    from docplex.mp.conflict_refiner import ConflictRefiner
    from docplex.mp.conflict_refiner import ConflictRefiner, VarUbConstraintWrapper, VarLbConstraintWrapper

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

    mdl.add_constraint(nbbus40*40 + nbbus30*30 >= 300, 'kids')
    mdl.add_constraint(nbbus40 + nbbus30 <= 7, 'maxTotalBuses')

    mdl.minimize(nbbus40*500 + nbbus30*400)

    mdl.solve()

    print(mdl.report())
    print("solve status =",mdl.get_solve_status()) #infeasible model

    print()
    print("relaxation")
    print()

    rx = Relaxer()
    rx.relax(mdl)

    print ("number_of_relaxations= " + str(rx.number_of_relaxations))
    print(rx.relaxations())

    print(mdl.report())
    print(mdl.get_solve_status())
    print(mdl.solution)

    print()
    print("conflict")
    print()

    cr=ConflictRefiner()
    conflicts=cr.refine_conflict(mdl)
    print(mdl.get_solve_status())

    for conflict in conflicts:
        st = conflict.status
        ct = conflict.element
        label = conflict.name
        label_type = type(conflict.element)
        if isinstance(conflict.element, VarLbConstraintWrapper) \
                or isinstance(conflict.element, VarUbConstraintWrapper):
            ct = conflict.element.get_constraint()

        # Print conflict information in console
        print("Conflict involving constraint: %s" % label)
        print(" \tfor: %s" % ct)

     

    gives

     

    None
    solve status = JobSolveStatus.INFEASIBLE_SOLUTION

    relaxation

    number_of_relaxations= 1
    {docplex.mp.LinearConstraint[maxTotalBuses](nbBus40+nbBus30,LE,7): 1.0}
    * model buses solved with objective = 3800
    None
    JobSolveStatus.INFEASIBLE_SOLUTION
    solution for: buses
    objective: 3800
    nbBus40=6
    nbBus30=2


    conflict

    JobSolveStatus.INFEASIBLE_SOLUTION
    Conflict involving constraint: None
         for: nbBus30 >= 0
    Conflict involving constraint: kids
         for: kids: 40nbBus40+30nbBus30 >= 300
    Conflict involving constraint: maxTotalBuses
         for: maxTotalBuses: nbBus40+nbBus30 <= 7

    regards

     

    Many other very simple examples at https://www.linkedin.com/pulse/making-optimization-simple-python-alex-fleischer/


    #CPLEXOptimizers
    #DecisionOptimization