Full Script
import lib.monte_carlo as mc
from scipy import stats
products = [{'name':'product', 'price':100}]
dates = [str(x) for x in range(1,100)]
def context(date, contexts):
context = {"inventory":100, "backorder":0} if len(contexts)==0 else contexts[-1]
rcontext = context.copy()
if 'reorder' in rcontext: rcontext.pop('reorder')
return rcontext
'''
process takes an iteration of the simuation (that is, the results of simulating each item for each date once.)
it is called after each iteration to collect the results. IN this case, we only care about dollar losses,
so we aggregate the total dollar loss.
'''
def process(iteration, contexts):
iter = iteration[-1]
return iter['simulation']
def reorder(context):
return context['backorder'] + 50
'''
takes an item, a date, and set of contexts (which in this case, we arent using)
and returns an item representing the inputted item simulated
'''
def simulate_item(item, contexts, date):
context = contexts[-1]
if int(date)%5 == 0:
context['reorder'] = reorder(context)
context['inventory']+=context['reorder'] - context['backorder']
context['backorder'] = 0
pass
sigma = 2
mu=1
samples = stats.lognorm.rvs(s=sigma, scale=4, size=1)
demand = round(float(samples[0]))
if demand>context['inventory']:
residual = demand - context['inventory']
context['inventory'] = 0
context['backorder'] = context['backorder']+residual
pass
else:
context['inventory'] -= demand
pass
return context['inventory']
#iterations, items, dates, update, process, context=None
for sim in mc.simulate(100, products, simulate_item, dates, process, context):
pass