Decision Optimization

Decision Optimization

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

 View Only

Very simple docplex : disjunctions

  • 1.  Very simple docplex : disjunctions

    Posted Mon July 01, 2019 04:56 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/

     

    but now suppose the number of  buses 40 seats should either be less than 3 or more than 7.

    You could use logicalor and write

    from docplex.mp.model import Model

    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.minimize(nbbus40*500 + nbbus30*400)

    mdl.solve()

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

    print()
    print("with nb buses 40 less than 3 or more than 7")

    option1=mdl.binary_var(name='option1')
    option2=mdl.binary_var(name='option2')

    mdl.add(option1==(nbbus40<=3))
    mdl.add(option2==(nbbus40>=7))

    mdl.add(1==mdl.logical_or(option1,option2))

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

    mdl.solve()

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

     

    that gives

     

    nbBus40  =  6.0
    nbBus30  =  2.0

    with nb buses 40 less than 3 or more than 7
    nbBus40  =  7.0
    nbBus30  =  1.0

    or simply use logical constraints:

     

    from docplex.mp.model import Model

    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.minimize(nbbus40*500 + nbbus30*400)

    mdl.solve()

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

    print()
    print("with nb buses 40 less than 3 or more than 7")

    mdl.add(1==mdl.add((nbbus40<=3)+(nbbus40>=7)>=1))
    mdl.minimize(nbbus40*500 + nbbus30*400)

    mdl.solve()

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

     

    that will give the same result of course.

     

     

    regards



     

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


    #CPLEXOptimizers
    #DecisionOptimization