single-echelon-inventory-assessment
inventory simulation modules for single-echelon supply chain
view repo
Inventory decision frameworks proposed in the literature for single-echelon supply chain systems rely on assumptions to obtain closed form expressions. In particular, two such frameworks - one conventional and the other with a demand undershoot - determine optimal reorder point for a desired β or Type-II service level. In this work we assess the accuracy and applicability of these frameworks with the help of a discrete event simulation framework developed in SimPy. While in several cases the closed form literature models under-predict the service level, and thus result in a higher reorder point and safety stock, we observe some situations where model predicted service levels match the simulated results with statistical significance.
READ FULL TEXT VIEW PDF
This study focuses on simultaneous decision making for stochastic
multi-...
read it
Efficient supply chain management calls for robust analytical and optima...
read it
We revisit the classic Cournot model and extend it to a two-echelon supp...
read it
While capacities of discrete memoryless channels are well studied, it is...
read it
The low economic growth and competition among neighbouring countries has...
read it
We describe a supply chain optimization model deployed in an online fash...
read it
Gaussian distributions are plentiful in applications dealing in uncertai...
read it
inventory simulation modules for single-echelon supply chain
Various models have been proposed in the literature for single-echelon supply chain systems (which we discuss further) that help determine how much inventory should be stocked in order to meet the desired customer service level. Such models estimate the parameters for an inventory policy followed by the single-echelon system. This work primarily assesses the accuracy and applicability of these models with the help of a simulation framework developed in SimPy
[11].A supply chain facilitates transportation of goods from one point to another is a network of facilities, such as suppliers, production locations, distribution centers. This can involve procurement of material, transformation of material to intermediate and finished products, and distribution of finished products to customers. The operation of a supply chain is driven by customer orders for finished products. It may be desired to stock inventories at various locations in a supply chain in order to achieve smoother operation and customer satisfaction. However, optimal inventory levels may be imperative for a cost effective operation and reduction in working capital [3, 4, 5, 9, 10, 16].
Inventory decisions such as safety stock, replenishment size, average on-hand inventory, carrying costs or working capital, etc. that meet a certain customer service level are challenging and not intuitive. Complexity arises due to various sources of uncertainties, such as demand volume, lead time (process uncertainties, machine downtime, transportation reliability), supplier reliability (raw material availability, issues at the supplier end), etc. Several frameworks have been designed in the literature that estimate aforementioned inventory decisions while accounting for such sources of uncertainties. However, they rely on assumptions to obtain analytic closed form expressions. In this work we validate the accuracy and applicability of two such frameworks given their respective assumptions with the help of a more accurate discrete-event simulation framework. Note that this work deals with only the single-echelon systems. Its extension for multi-echelon networks will be covered in future articles.
The article is organized as follows. We first describe the single-echelon inventory management system considered in this work. Section 3 illustrates the inventory optimization models that we validate. In Section 4 we present the SimPy discrete-event simulation model, while the validation results are documented in the next section. Section 6 concludes the article.
As mentioned above, we consider a single-echelon system in this work. The term echelons for a supply chain refers to the number of interacting layers of inventory stocking locations before the product is delivered to the final customer. In a single-echelon system, there exists a single layer of locations that receive replenishment and deliver customer shipments. With two or more layers, the supply chain becomes multi-echelon. In a multi-echelon system, interaction between layers can exist in a variety of forms.
The following definitions are used to define and quantify inventory in a supply chain [7]:
Lot size or Economic Order Quantity (EOQ)
The amount requested in each replenishment order is called lot size. While it may be advantageous to place several orders with a tiny lot size to lower inventory holding costs, it may not be practical due to either a fixed cost for placing an order or ability of the supply chain to fulfill orders in specific lot sizes, such as one full truck load (FTL), one railcar, one vessel shipment, etc. The lot size that minimizes total holding and order placement cost while accounting for such system restrictions is called economic order quantity (EOQ).
Cycle Stock
The time gap between initiating a replenishment order and receiving the shipment is called lead time. Lead time can involve pre-processing time (place order on the books, other bookkeeping), order processing time (manufacturing, assembling, product wheel, scheduling, etc.), and post processing (transportation, load-unload, etc.). The inventory maintained to serve customers orders received during the lead time is called cycle stock.
Safety Stock
Safety stock is the buffer inventory required to insure against the variability in customer demand (inaccurate forecast) and lead time (order processing delays, transit delays, etc.)
Inventory policies provide a structure to manage ordering and receipt of products, timing the order placement, keeping track of what has been ordered, and deciding how much to order. In this work we evaluate a reorder point policy. In a reorder point policy, as shown in Figure 1, an order is placed when the stock reaches a predetermined number of units, called the reorder point. An order of fixed size is placed when the inventory position (on-hand plus on-order minus backordered quantities, if any) reaches the reorder point [7]. Note that the event of reaching is not “time-triggered” and may take place at any time depending on the demand. The reorder point is set to cover the cycle stock plus a safety stock determined by the desired service level. The fixed order size is generally governed by a fixed lot size or EOQ.
An inventory system’s performance is measured using service level. The event in which the inventory is completely exhausted and customer demand for the product cannot be fulfilled is called a stockout. Service level is a metric to quantify the level of stockouts that can be tolerated in order to meet the desired level of customer satisfaction [13]. If the demand is fulfilled later, it is called a backorder. In such cases, the service level measures how much demand was fulfilled on time. Inventory policies offer levers to manipulate in order to balance the trade-off between service level and the amount of inventory held.
There are two kinds of definitions of service level that are most frequently used: service level (Type I) (also called cycle service level) and service level (Type II) (also known as fill rate). The service level measures the number of inventory cycles in which stockout (or backorder) did not occur. Specifically,
It measures the probability of not stocking out during the lead time. However, it does not measure the “magnitude” of stockout (if the stockout was 1 unit or 1000 units of demand). On the other hand, the
service level measures the fraction of the amount of demand met from the inventory (see Figure 2). Specifically,For example, for the 28 replenishment cycles in Figure 2, we observe stockouts happening in 4 cycles. Thus, service level = 24/28 = 86%. In contrast, the total customer demand in the 28 cycles is 16990 units, while the total stockout volume is 520 units. Therefore, the service level is (16990-520)/16990 = 97%. In general, the service level tends to be higher than . However, high demand and lead time variability can cause the former to be lower than the latter as the volume of stockouts go up [8].
In this work, we only focus on the models that use service level as a criterion to determine required inventory.
Determining optimal inventory in a reorder point system essentially involves determining the reorder quantity ( in Figure 1), the reorder point ()( in Figure 1) and the corresponding safety stock (). The value of is obtained via minimum lot size of the system or determined from ordering cost. The models in the literature estimate only the and for a given . The choice of impacts and
. The models developed in the literature are valid only when demand follows a Normal distribution. However, no distribution assumption is required for lead time variability.
Let
: mean of the Normally distributed demand,
: standard deviation of the Normally distributed demand,
(1) |
The cycle stock (), , and are calculated as [3, 6, 8]
(2) |
Here , called the safety stock factor, varies with and service levels [3, 6]. We consider the following two models in this work for service level.
In the conventional model, as defined in [3, 7, 6, 8], the service level is estimated as
(3) |
where, the expected shortage () is the demand backordered and not fulfilled on time, and is the reorder quantity. The expected shortage is the excess demand during the lead time that could not be met from the cycle and safety stock. If is the demand distribution, the expected shortage is calculated as
(4) |
When demand is Normally distributed, Equation (4) can be simplified to
(5) |
Here is obtained from Equation (1), and and
are the standard normal density and the cumulative distribution functions, respectively, as below
To approximate the integral, the following empirical expression for can be used [2]
(6) |
Equations (3), (5), and (6) can be solved together to obtain for a desired . For the lost sales case, can be replaced with in Equation (3).
In a conventional reorder point system, an order is placed when the inventory position is exactly equal to the reorder point. The conventional model above represents such a system. However, this requires inventory to be monitored constantly. In practice, inventory levels are monitored at a pre-determined frequency, such as once a day. Consequently, a delay is observed between when is reached and when the order is placed.
Figure 3 illustrates this concept. Here inventory is monitored at a constant interval . The reorder point is reached at A. While a conventional system will place an order at A, here the order gets placed at B when the system monitors inventory after . The difference between A and B is called undershoot. Undershoot results in a higher because inventory needs to be kept not only to meet demand during the lead time but also to serve the undershoot. As a result, expected shortage can be higher in such systems, and is not adequately captured by Equations (4) and (5).
Let be the inventory monitoring frequency of the system. The is calculated as [14]:
(7) |
In order to calculate , we consider the following steps [12, 15]. First we calculate the expected value of the undershoot.
(8) |
Next we find the expected value of shortage, which is given by
(9) |
Since demand is Normally distributed, this can be simplified to
(10) |
Finally, is obtained by solving the following equation for a given and .
(11) |
We developed a discrete-event simulation model in SimPy [11] in order to assess the accuracy and validity of the aforementioned two models. Complete computer codes for the simulation are available here [1].
To simulate an inventory storage node in a single-echelon supply chain, we create a generic Process in the SimPy simulation model called stockingFacility
. The activation function of this process is called
runOperation that is run at a fixed event rate of one time unit. Each runOperation call records the random demand in that event and the shipment sent to the customer, and updates the backorder and inventory position of the node, as shown below:class stockingFacility(Process): def runOperation(self): while True: yield hold, self, 1.0 demand = float(np.random.normal(self.meanDemand, \ ΨΨΨΨself.demandStdDev, 1)) self.totalDemand += demand shipment = min(demand + self.totalBackOrder, \ ΨΨΨΨΨself.on_hand_inventory) self.on_hand_inventory -= shipment self.inventory_position -= shipment backorder = demand - shipment self.totalBackOrder += backorder self.totalLateSales += max(0.0, backorder) if self.inventory_position <= 1.01*self.ROP: order = newOrder(self.ROQ) activate(order, order.ship(self)) self.inventory_position += self.ROQ
Note that when the inventory position goes below the reorder point, a new order object is created which represents the new order placed by stockingFacility object. The order object is another SimPy Process as shown below. It’s activation function ship ensures that the replenishment is being held for a random lead time before being delivered to the stockingFacility object.
class newOrder(Process): def ship(self, stock): leadTime = int(np.random.uniform(stock.minLeadTime, \ ΨΨΨΨΨΨΨstock.maxLeadTime, 1)) yield hold, self, leadTime stock.on_hand_inventory += self.orderQty
The aforementioned Process for stockingFacility models the scenario when unfulfilled demand is backordered and is shipped at a later stage once inventory is available. For the case when unfulfilled demand is considered lost sales, we use the following definition of the stockingFacility Process. The newOrder Process remains same for both cases.
class stockingFacility(Process): def runOperation(self): while True: yield hold, self, 1.0 demand = float(np.random.normal(self.meanDemand, \ ΨΨΨΨself.demandStdDev, 1)) self.totalDemand += demand shipment = min(demand, self.on_hand_inventory) self.totalShipped += shipment self.on_hand_inventory -= shipment self.inventory_position -= shipment if self.inventory_position <= 1.01*self.ROP: order = newOrder(self.ROQ) activate(order, order.ship(self)) self.inventory_position += self.ROQ
The simulation is initiated and activated through the following module. We run the simulation for 1 year for all test cases. Once the simulation is complete, the stockingFacility object is returned with all its statistics.
def simulateNetwork(initialInv, ROP, ROQ, meanDemand,\ ΨΨΨdemandStdDev, minLeadTime, maxLeadTime): initialize() s = stockingFacility(initialInv, ROP, ROQ, meanDemand,\ Ψ ΨdemandStdDev, minLeadTime, maxLeadTime) activate(s, s.runOperation()) simulate(until=365) s.serviceLevel = 1-s.totalLateSales/s.totalDemand #for backorder s.serviceLevel = s.totalShipped/s.totalDemand #for lost sales return s
The SimPy simulation framework represents the Undershoot modeling framework more closely compared to the Conventional model. Here inventory is monitored per every one time event instead of continuous. Therefore, by construct, we expect the simulation results to more closely match the Undershoot model vs. the Conventional model.
We validate the Conventional and Undershoot models (Section 3) using the above simulation frameworks. The model parameters are listed in Table 1. We perform validation for three different values of demand standard deviation and four different values of the reorder quantity.
Lead time | |
---|---|
0 (no safety stock) | |
5000 | |
Mean demand | 500 |
Demand std. deviation | [200, 400, 600] |
[1000, 2000, 4000, 6000] |
We run 100 replications of the simulation and collect a distribution of service level obtained from all replications. The model is considered to match simulation successfully if the service level predicted by the model falls within two standard deviations of the service level distribution from the simulation. We run simulation for both backorder and lost sales scenarios.
Model | SimPy | Model | |||
---|---|---|---|---|---|
Avg. | Std. Dev. | matches SimPy | |||
200 | 1000 | 57.2% | 89.3% | 2.7% | No |
2000 | 78.6% | 89.7% | 2.9% | No | |
4000 | 89.3% | 94.8% | 1.6% | No | |
6000 | 92.9% | 95.9% | 2.1% | Yes | |
400 | 1000 | 38.8% | 79.5% | 5.5% | No |
2000 | 69.4% | 80.3% | 5.8% | Yes | |
4000 | 84.7% | 90.1% | 3.1% | Yes | |
6000 | 89.8% | 89.7% | 5.2% | Yes | |
600 | 1000 | 16.8% | 68.1% | 7.1% | No |
2000 | 58.4% | 70.3% | 8.2% | Yes | |
4000 | 79.2% | 83.7% | 5.2% | Yes | |
6000 | 86.1% | 81.9% | 7.9% | Yes |
Model | SimPy | Model | |||
---|---|---|---|---|---|
Avg. | Std. Dev. | matches SimPy | |||
200 | 1000 | 70.1% | 93.9% | 1.2% | No |
2000 | 82.4% | 93.9% | 1.2% | No | |
4000 | 90.3% | 95.9% | 1.2% | No | |
6000 | 93.3% | 96.5% | 1.2% | Yes | |
400 | 1000 | 62.1% | 89.3% | 1.9% | No |
2000 | 76.6% | 90.0% | 1.8% | No | |
4000 | 86.7% | 92.8% | 1.8% | No | |
6000 | 90.7% | 93.8% | 2.0% | Yes | |
600 | 1000 | 54.6% | 84.3% | 2.7% | No |
2000 | 70.6% | 86.1% | 2.5% | No | |
4000 | 82.8% | 89.7% | 2.4% | No | |
6000 | 87.8% | 90.1% | 2.7% | Yes |
Table 2 shows the validation results for the conventional for the backorder scenario, while Table 3 shows that for the lost sales scenario. Here we list the average and its standard deviation from the SimPy simulation over 100 replications. We also list if the model results match with simulation based on the two standard deviation rule. Although the SimPy simulation models an inventory system with an undershoot, we use its results for comparison because the conventional reorder point system with constant inventory monitoring cannot be practically simulated.
From both tables, we observe the following:
For the same set of inputs, the lost sales model exhibits a higher service level compared to the corresponding backorder model. Moreover, the simulation variance is substantially lower for lost sales compared to backorder.
For both backorder and lost sales, the model results match with simulation (within statistical limits) when is higher than . However, for such cases, the lost sales model is always at least one standard deviation lower than the average simulation . The backorder model does not demonstrate this cadence.
In the case of the backorder model, when coefficient of variation is more than 0.8, we do observe model results match with simulation when is lower than . However, in these cases, the model is generally two standard deviations lower than the average simulated .
Similarly, we present the validation results for the Undershoot model for the backorder scenario (Table 4) and the lost sales scenario (Table 5). Here the SimPy simulation accurately models the inventory system under study. Consequently, we expect the Undershoot model to match simulation in more cases compared to the Conventional. However, we do not observe that in the results. A summary of the observations is as below:
Irrespective of the coefficient of variation, the model matches simulation only when is more than .
The model is substantially inaccurate for cases then is less than . Particularly for the backorder case, the model predicts absurd negative service level.
When , for both backorder and lost sales cases, the gap between model predicted and average simulated increases as the coefficient of variation goes up.
Model | SimPy | Model | |||
---|---|---|---|---|---|
Avg. | Std. Dev. | matches SimPy | |||
200 | 1000 | 9.3% | 89.3% | 2.7% | No |
2000 | 48.9% | 89.7% | 2.9% | No | |
4000 | 72.7% | 94.8% | 1.6% | No | |
6000 | 95.7% | 95.9% | 2.1% | Yes | |
400 | 1000 | -43.5% | 79.5% | 5.5% | No |
2000 | 16.1% | 80.3% | 5.8% | No | |
4000 | 54.1% | 90.1% | 3.1% | No | |
6000 | 88.5% | 89.7% | 5.2% | Yes | |
600 | 1000 | -108% | 68.1% | 7.1% | No |
2000 | -28.5% | 70.3% | 8.2% | No | |
4000 | 27.2% | 83.7% | 5.2% | No | |
6000 | 75.7% | 81.9% | 7.9% | Yes |
Model | SimPy | Model | |||
---|---|---|---|---|---|
Avg. | Std. Dev. | matches SimPy | |||
200 | 1000 | 52.4% | 93.9% | 1.2% | No |
2000 | 66.2% | 93.9% | 1.2% | No | |
4000 | 78.6% | 95.9% | 1.2% | No | |
6000 | 95.9% | 96.5% | 1.2% | Yes | |
400 | 1000 | 41.1% | 89.3% | 1.9% | No |
2000 | 54.4% | 90.0% | 1.8% | No | |
4000 | 68.5% | 92.8% | 1.8% | No | |
6000 | 90.0% | 93.8% | 2.0% | Yes | |
600 | 1000 | 32.4% | 84.3% | 2.7% | No |
2000 | 43.8% | 86.1% | 2.5% | No | |
4000 | 57.9% | 89.7% | 2.4% | No | |
6000 | 84.8% | 90.1% | 2.7% | Yes |
We presented two models from the literature that predict the service level (or fill rate) of a single-echelon supply chain system that tracks inventory using a reorder point policy. The first model, Conventional, requires inventory to be tracked constantly, while the second model, Undershoot, represents a system where inventory is tracked periodically, which can potentially cause reordering delay thus exacerbating system backorders (called creating an undershoot). The accuracy of these models is tested using a discrete-event simulation built using SimPy. We tested accuracy for different values of reorder quantity and demand coefficient of variation. The models and simulation were compared for cases when system allows backorders (and late shipments) vs. the scenario when the unfulfilled demand is considered lost sales.
Based on our experiments, we make the following conclusions:
In most cases tested in this work the closed form literature models under-predict the service level, and thus can result in a higher reorder point and safety stock
Both Conventional and Undershoot models, for either backorder or lost sales cases, are valid predominantly when the reorder quantity is more than the reorder point (and should only be used when this is true)
If reorder quantity is less than the reorder point and if the system follows a backorder strategy, the Conventional model can be used only when the coefficient of variation for demand is greater than 0.8
In general, the systems following a lost sales approach should see higher service levels than the ones following a backorder strategy
Comments
There are no comments yet.