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");
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");
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