{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "*This notebook contains material from [CBE40455-2020](https://jckantor.github.io/CBE40455-2020);\n", "content is available [on Github](https://github.com/jckantor/CBE40455-2020.git).*\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "< [3.7 Simulating Queuing Systems](https://jckantor.github.io/CBE40455-2020/03.07-Simulating-Queuing-Systems.html) | [Contents](toc.html) | [3.9 Refinements of a Grocery Store Checkout Operation](https://jckantor.github.io/CBE40455-2020/03.09-Refinements-to-the-Grocery-Store-Checkout-Operation.html) >
"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 1,
"link": "[3.8 Modeling and Simulation of a Grocery Store Checkout Operation](https://jckantor.github.io/CBE40455-2020/03.08-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation.html#3.8-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation)",
"section": "3.8 Modeling and Simulation of a Grocery Store Checkout Operation"
}
},
"source": [
"# 3.8 Modeling and Simulation of a Grocery Store Checkout Operation"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 1,
"link": "[3.8 Modeling and Simulation of a Grocery Store Checkout Operation](https://jckantor.github.io/CBE40455-2020/03.08-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation.html#3.8-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation)",
"section": "3.8 Modeling and Simulation of a Grocery Store Checkout Operation"
}
},
"source": [
"Consider a grocery store with muliple checkout lines. Each checkout line is managed by a server, each server with a unique rate at checking items. Let's develop a simulation.\n",
"\n",
"1. What would be the key performance indicators to monitor?\n",
"2. What assumptions should we make about customer behavior?\n",
"3. What data is needed to describe the objects in each queue?\n",
"4. Are all checkout lanes the same?\n",
"5. How can we set up this simulation?"
]
},
{
"cell_type": "code",
"execution_count": 58,
"metadata": {
"nbpages": {
"level": 1,
"link": "[3.8 Modeling and Simulation of a Grocery Store Checkout Operation](https://jckantor.github.io/CBE40455-2020/03.08-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation.html#3.8-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation)",
"section": "3.8 Modeling and Simulation of a Grocery Store Checkout Operation"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: simpy in /Users/jeff/opt/anaconda3/lib/python3.7/site-packages (4.0.1)\n"
]
}
],
"source": [
"!pip install simpy"
]
},
{
"cell_type": "code",
"execution_count": 63,
"metadata": {
"nbpages": {
"level": 1,
"link": "[3.8 Modeling and Simulation of a Grocery Store Checkout Operation](https://jckantor.github.io/CBE40455-2020/03.08-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation.html#3.8-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation)",
"section": "3.8 Modeling and Simulation of a Grocery Store Checkout Operation"
}
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import random\n",
"import simpy\n",
"import pandas as pd"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 2,
"link": "[3.8.1 Basic Model](https://jckantor.github.io/CBE40455-2020/03.08-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation.html#3.8.1-Basic-Model)",
"section": "3.8.1 Basic Model"
}
},
"source": [
"## 3.8.1 Basic Model\n",
"\n",
"The following sections build this grocery store model a piece at a time. We begin with checkout lanes, then add customers, then logging functions to gather and report results, and finally complete the model by adding a server for each checkout lane. \n",
"\n",
"The basic model incorporates a number of assumptions about customer behavior. At the end of this section are exercises asking to you extend the model by refining these assumptions. Take your bes shot at these, and be ready to discuss during the next class session."
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 3,
"link": "[3.8.1.1 Model checkout lanes as SimPy.Store() resources](https://jckantor.github.io/CBE40455-2020/03.08-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation.html#3.8.1.1-Model-checkout-lanes-as-SimPy.Store()-resources)",
"section": "3.8.1.1 Model checkout lanes as SimPy.Store() resources"
}
},
"source": [
"### 3.8.1.1 Model checkout lanes as SimPy.Store() resources\n",
"\n",
"We can start the model development with a definition of check out lanes. For now assume the checkout lanes can be modeled as SimPy.Store shared resources. These are stored in a list called `lanes` which are indexed as 0, 1, ..., N-1 where $N$ is the number of lanes."
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {
"nbpages": {
"level": 3,
"link": "[3.8.1.1 Model checkout lanes as SimPy.Store() resources](https://jckantor.github.io/CBE40455-2020/03.08-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation.html#3.8.1.1-Model-checkout-lanes-as-SimPy.Store()-resources)",
"section": "3.8.1.1 Model checkout lanes as SimPy.Store() resources"
}
},
"outputs": [],
"source": [
"# time units = minutes\n",
"\n",
"# number of checkout lanes\n",
"N = 4\n",
"\n",
"# create simulation\n",
"env = simpy.Environment()\n",
"\n",
"# checkout lanes modeled as SimPy Stores\n",
"lanes = [simpy.Store(env) for n in range(N)]\n",
"\n",
"# run simulation\n",
"env.run(until = 60)"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 3,
"link": "[3.8.1.2 Modeling customer behavior](https://jckantor.github.io/CBE40455-2020/03.08-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation.html#3.8.1.2-Modeling-customer-behavior)",
"section": "3.8.1.2 Modeling customer behavior"
}
},
"source": [
"### 3.8.1.2 Modeling customer behavior\n",
"\n",
"The next step is to create customers. For the purpose, we write a Python generator that accepts a rate argument specifying the rate at which customers approach the checkout lanes. Each customer carries a cart with a number of items. The number of items is random integer."
]
},
{
"cell_type": "code",
"execution_count": 65,
"metadata": {
"nbpages": {
"level": 3,
"link": "[3.8.1.2 Modeling customer behavior](https://jckantor.github.io/CBE40455-2020/03.08-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation.html#3.8.1.2-Modeling-customer-behavior)",
"section": "3.8.1.2 Modeling customer behavior"
}
},
"outputs": [],
"source": [
"# time units = minutes\n",
"\n",
"# number of checkout lanes\n",
"N = 4\n",
"\n",
"# customer generator, assign to random checkout lane\n",
"def customer_generator(rate=1.0):\n",
" customer_id = 1\n",
" while True:\n",
" yield env.timeout(random.expovariate(rate))\n",
" n_cart_items = random.randint(1, 25)\n",
" lane_number = random.randint(0, N-1)\n",
" yield lanes[lane_number].put([customer_id, n_cart_items, env.now])\n",
" customer_id += 1\n",
"\n",
"# create simulation\n",
"env = simpy.Environment()\n",
"\n",
"# checkout lanes modeled as SimPy Stores\n",
"lanes = [simpy.Store(env) for n in range(N)]\n",
"\n",
"# create processes\n",
"env.process(customer_generator())\n",
"\n",
"# run simulation\n",
"env.run(until=60)"
]
},
{
"cell_type": "markdown",
"metadata": {
"nbpages": {
"level": 3,
"link": "[3.8.1.3 Monitoring of checkout lanes](https://jckantor.github.io/CBE40455-2020/03.08-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation.html#3.8.1.3-Monitoring-of-checkout-lanes)",
"section": "3.8.1.3 Monitoring of checkout lanes"
}
},
"source": [
"### 3.8.1.3 Monitoring of checkout lanes\n",
"\n",
"At this point we have a working simulation, but no way to see the results. The next cell adds a monitoring process that records the length of all checkout lanes. The collected data is plotted when the simulation is complete."
]
},
{
"cell_type": "code",
"execution_count": 66,
"metadata": {
"nbpages": {
"level": 3,
"link": "[3.8.1.3 Monitoring of checkout lanes](https://jckantor.github.io/CBE40455-2020/03.08-Modeling-and-Simulation-of-a-Grocery-Store-Checkout-Operation.html#3.8.1.3-Monitoring-of-checkout-lanes)",
"section": "3.8.1.3 Monitoring of checkout lanes"
}
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 4
}