Sourcing Models and Custom Demand
In idinn, we use SingleSourcingModel and DualSourcingModel to simulate demands, manage orders and inventory, and train controllers.
The code below shows how you can implement a single-sourcing model with a (discrete) uniform demand distribution, ranging from 0 to 4. The methods get_past_inventories() and get_past_orders() can be used to inspect the inventory and order history, respectively.
>>> from idinn.sourcing_model import SingleSourcingModel
>>> single_sourcing_model = SingleSourcingModel(
... lead_time=0,
... holding_cost=5,
... shortage_cost=495,
... batch_size=32,
... init_inventory=10,
... demand_generator=UniformDemand(low=0, high=4),
... )
>>> # Inspect inventory history
>>> single_sourcing_model.get_past_inventories()
>>> # Inspect order history
>>> single_sourcing_model.get_past_orders()
The demand_generator can be used to specify demand distributions. Most examples in the documentation feature a uniform demand distribution, where demands are uniformly distributed across the interval defined by the user. Alternatively, custom demand distributions can be specified by using the CustomDemand class with the demand_generator. CustomDemand accepts a dictionary that defines the possible demand values and their respective probabilities. We show a corresponding example below.
>>> from idinn.sourcing_model import DualSourcingModel
>>> from idinn.demand import CustomDemand
>>> sourcing_model = DualSourcingModel(
... regular_lead_time=3,
... expedited_lead_time=0,
... regular_order_cost=0,
... expedited_order_cost=20,
... holding_cost=5,
... shortage_cost=495,
... init_inventory=0,
... demand_generator=CustomDemand({5: 0.02, 6: 0.9, 7: 0.02, 8: 0.02, 9: 0.02, 10: 0.02})
... )
In this sourcing model, there is a 90% probability that the demand will be 6, and a 2% probability that the demand will be either 5, 7, 8, 9, or 10, respectively. The CustomDemand generator allows users to input demands customized to their specific requirements.