Decision Optimization

Decision Optimization

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

 View Only

Very simple docplex : data in a pandas dataframe

  • 1.  Very simple docplex : data in a pandas dataframe

    Posted Fri February 08, 2019 11:09 AM

    Hi

     

    again

     

     

    At https://www.ibm.com/developerworks/community/forums/html/topic?id=a8580237-639a-411b-b1df-f390a24da06c&ps=25

     

    we saw small examples where data is in tuple but what about pandas data frame ?

     

    Here we are:

     

    https://www.linkedin.com/pulse/what-optimization-how-can-help-you-do-more-less-zoo-buses-fleischer/

    The Python docplex version is

    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()

    mdl.export("c:\\buses.lp")

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

    Now let s try to be more generic and get the data from pandas dataframe.

    We may rely on:

    • a dictionnary integer_var_dict

    from docplex.mp.model import Model
    from pandas import *

    # Data

    dfBuses = pandas.DataFrame({'size': [40,30], 'cost': [500,400]},
                          index = ['bus1', 'bus2'], columns=['size','cost'])

    print(dfBuses)

    nbKids=300

    for b in dfBuses.itertuples():
        print("buses with ",b.size," seats cost ",b.cost)

    mdl = Model(name='buses')

    #decision variables
    mdl.nbBus=mdl.integer_var_dict(dfBuses.itertuples(),name="nbBus")

    # Constraint
    mdl.add_constraint(sum(mdl.nbBus[b]*b.size for b in dfBuses.itertuples()) >= nbKids, 'kids')

    # Objective
    mdl.minimize(sum(mdl.nbBus[b]*b.cost for b in dfBuses.itertuples()))

    mdl.solve()

    # Dislay solution
    for b in dfBuses.itertuples():
        print(mdl.nbBus[b].solution_value," buses with ",b.size," seats");

     

    • variables integer_var

    from docplex.mp.model import Model
    from pandas import *

    # Data

    dfBuses = pandas.DataFrame({'size': [40,30], 'cost': [500,400]},
                          index = ['bus1', 'bus2'], columns=['size','cost'])

    print(dfBuses)

    nbKids=300

    for b in dfBuses.itertuples():
        print("buses with ",b.size," seats cost ",b.cost)

    mdl = Model(name='buses')


    #decision variables
    mdl.nbBus = {b: mdl.integer_var(name="nbBus"+str(b.size)) for b in dfBuses.itertuples()}


    # Constraint
    mdl.add_constraint(sum(mdl.nbBus[b]*b.size for b in dfBuses.itertuples()) >= nbKids, 'kids')

    # Objective
    mdl.minimize(sum(mdl.nbBus[b]*b.cost for b in dfBuses.itertuples()))

    mdl.solve()

    # Dislay solution
    for b in dfBuses.itertuples():
        print(mdl.nbBus[b].solution_value," buses with ",b.size," seats");

    • list integer_var_list

    from docplex.mp.model import Model
    from pandas import *


    # Data

    dfBuses = pandas.DataFrame({'size': [40,30], 'cost': [500,400]},
                          index = ['bus1', 'bus2'], columns=['size','cost'])

    print(dfBuses)
    print(dfBuses.shape[0])

    nbKids=300

    for b in dfBuses.itertuples():
        print("buses with ",b.size," seats cost ",b.cost)

    mdl = Model(name='buses')

    nbBusesTypes=dfBuses.shape[0]


    #decision variables

    mdl.nbBus = mdl.integer_var_list(nbBusesTypes,0,1000,name="nbBus")


    # Constraint
    mdl.add(sum(mdl.nbBus[b]*dfBuses.iloc[b][0] for b in range(0,nbBusesTypes)) >= nbKids)

    # Objective
    mdl.minimize(sum(mdl.nbBus[b]*dfBuses.iloc[b][1] for b in range(0,nbBusesTypes)))

    msol=mdl.solve()

    # Dislay solution
    for b  in range(0,nbBusesTypes):
        print(msol[mdl.nbBus[b]]," buses with ",dfBuses.iloc[b][0]," seats");

    regards

     


    #CPLEXOptimizers
    #DecisionOptimization