{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"*This notebook contains course material from [CBE40455](https://jckantor.github.io/CBE40455) by\n",
"Jeffrey Kantor (jeff at nd.edu); the content is available [on Github](https://github.com/jckantor/CBE40455.git).\n",
"The text is released under the [CC-BY-NC-ND-4.0 license](https://creativecommons.org/licenses/by-nc-nd/4.0/legalcode),\n",
"and code is released under the [MIT license](https://opensource.org/licenses/MIT).*"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"< [Queuing Systems](http://nbviewer.jupyter.org/github/jckantor/CBE40455/blob/master/notebooks/02.02-Queuing-Systems.ipynb) | [Contents](toc.ipynb) | [Model Development in SimPy](http://nbviewer.jupyter.org/github/jckantor/CBE40455/blob/master/notebooks/02.04-Discrete-Event-Simulation-of-a-Batch-Process.ipynb) >
"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "oCNYc5jXG13h"
},
"source": [
"# Emergency Room Simulation\n",
"\n",
"This notebook is the result of an in-class exercise in the simulation and analysis of a simple queuing model for a hospital emergency room."
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "g0ZiPiksHcGS"
},
"source": [
"## Initializations\n",
"\n",
"Install the Simpy library and import necessary libraries."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 54
},
"colab_type": "code",
"executionInfo": {
"elapsed": 3218,
"status": "ok",
"timestamp": 1567168601233,
"user": {
"displayName": "Jeffrey Kantor",
"photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mAnl92hB5egoXgR-yAmEJN-i3LA_Jwcr3-0236SZg=s64",
"userId": "09038942003589296665"
},
"user_tz": 240
},
"id": "4y6q_A4C-aok",
"outputId": "1f799ebf-9e68-4408-cc9a-c9ad812b6918"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: simpy in /usr/local/lib/python3.6/dist-packages (3.0.11)\n"
]
}
],
"source": [
"!pip install simpy"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"colab": {},
"colab_type": "code",
"id": "bHMK1SXo-jJ5"
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import matplotlib.pyplot as plt # for plotting\n",
"import numpy as np # for numerical calculations\n",
"import pandas as pd # for analysis of simulation data\n",
"import random # for generating pseudo-random numbers\n",
"import simpy # for discrete event simulation"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "udr7Z2a-HshL"
},
"source": [
"## Poisson processes\n",
"\n",
"We assume $n$, the average number of patients arriving in a period of $\\tau$ minutes, is given by $\\lambda \\tau$ where $\\lambda$ represents the average rate of arrival in units of patients per minute. If the events are statistically independent and identically distributed in time, this probability is uniformly distributed in time, then this is known as a [Poisson Process](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-262-discrete-stochastic-processes-spring-2011/course-notes/MIT6_262S11_chap02.pdf).\n",
"\n",
"One of the key properties of a Poisson process is that the period of time between arrival events, $t$, is a random number distributed according to the exponential distribution\n",
"\n",
"$$p(t|\\lambda) = \\lambda e^{-\\lambda t}$$\n",
"\n",
"The mean value of this distribution is $\\frac{1}{\\lambda}$. The variance is also $\\frac{1}{\\lambda}$ so that the standard deviation is $\\frac{1}{\\sqrt{\\lambda}}$.\n",
"\n",
"The standard Python libraries include functions for generating psuedo-random numbers from statistical distributions. In the case we use `random.expovariate(lambda)` to psuedo-random numbers drawn from an exponential distribution. The following cell shows how this is done, and creates a histogram demonstrating the results."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 300
},
"colab_type": "code",
"executionInfo": {
"elapsed": 944,
"status": "ok",
"timestamp": 1567168604939,
"user": {
"displayName": "Jeffrey Kantor",
"photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mAnl92hB5egoXgR-yAmEJN-i3LA_Jwcr3-0236SZg=s64",
"userId": "09038942003589296665"
},
"user_tz": 240
},
"id": "EevKAZvAQMIE",
"outputId": "7bb6d8b5-83a1-42a6-9123-4a0465fe0f24"
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'probability density function')"
]
},
"execution_count": 9,
"metadata": {
"tags": []
},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"# specify rate\n",
"rate = 0.5\n",
"\n",
"# compute a list of pseudo-random numbers from an exponential distribution\n",
"x = [random.expovariate(rate) for n in range(0, 10000)]\n",
"\n",
"# plot histogram\n",
"plt.hist(x, bins=int(np.sqrt(len(x))), density=True)\n",
"\n",
"# compare to theoretical distribution\n",
"t = np.linspace(0, max(x))\n",
"plt.plot(t, rate*np.exp(-rate*t), lw=3)\n",
"plt.legend(['exponential distribution', 'histogram'])\n",
"plt.xlabel('interarrival time t')\n",
"plt.ylabel('probability density function')"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "A-sEKk1stcKZ"
},
"source": [
"## Modeling patient arrivals as a Poisson process"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "R1VMODh323wj"
},
"source": [
"### Version 1. Basic simulation\n",
"\n",
"The following cell is a first attempt at a simulation of the patient arrival process. The python generator assigns a patient ID to every new arrival and reports the arrival time."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 238
},
"colab_type": "code",
"executionInfo": {
"elapsed": 473,
"status": "ok",
"timestamp": 1567168607106,
"user": {
"displayName": "Jeffrey Kantor",
"photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mAnl92hB5egoXgR-yAmEJN-i3LA_Jwcr3-0236SZg=s64",
"userId": "09038942003589296665"
},
"user_tz": 240
},
"id": "nQn8WfVktkEn",
"outputId": "73ea1a02-4c2c-441a-ddbe-a976d5eb8c0a"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Patient 1 arrived at 1.6054742413576122 minutes\n",
"Patient 2 arrived at 2.9862975304596584 minutes\n",
"Patient 3 arrived at 6.226685767685777 minutes\n",
"Patient 4 arrived at 8.886436229333643 minutes\n",
"Patient 5 arrived at 9.105078716440664 minutes\n",
"Patient 6 arrived at 10.907985660102916 minutes\n",
"Patient 7 arrived at 12.38868161237205 minutes\n",
"Patient 8 arrived at 13.583531753095926 minutes\n",
"Patient 9 arrived at 16.920435092650337 minutes\n",
"Patient 10 arrived at 18.681054931254344 minutes\n",
"Patient 11 arrived at 19.79653435459627 minutes\n",
"Patient 12 arrived at 24.339149139274646 minutes\n",
"Patient 13 arrived at 28.161555082144186 minutes\n"
]
}
],
"source": [
"env = simpy.Environment()\n",
"\n",
"# define a python generator describing the arrival of a new patient\n",
"def patient_arrival(env, rate):\n",
" n = 0\n",
" while True:\n",
" yield env.timeout(random.expovariate(rate))\n",
" n = n + 1\n",
" print('Patient', n, 'arrived at', env.now, 'minutes')\n",
"\n",
"# perform a simulation with simpy\n",
"env.process(patient_arrival(env, 0.5))\n",
"env.run(until=30)"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "aGYW5NNG3Hca"
},
"source": [
"### Version 2. Adding an event log\n",
"\n",
"A characteristic feature of event-based simulation is the logging of relevant events. Here we use a list to record events as the occur. The record for each event consists of a list of data comprising the patient ID, the time of the event, and type of event."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 323
},
"colab_type": "code",
"executionInfo": {
"elapsed": 302,
"status": "ok",
"timestamp": 1567168609063,
"user": {
"displayName": "Jeffrey Kantor",
"photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mAnl92hB5egoXgR-yAmEJN-i3LA_Jwcr3-0236SZg=s64",
"userId": "09038942003589296665"
},
"user_tz": 240
},
"id": "fNGLor4k3o9S",
"outputId": "410b0e30-9614-437c-dfd2-87d4ab9a1a7b"
},
"outputs": [
{
"data": {
"text/plain": [
"[[1, 0.08255875642546838, 'Arrival'],\n",
" [2, 2.154020951510568, 'Arrival'],\n",
" [3, 3.690213096751676, 'Arrival'],\n",
" [4, 3.7292525534379526, 'Arrival'],\n",
" [5, 5.5288177111371555, 'Arrival'],\n",
" [6, 5.964165672571363, 'Arrival'],\n",
" [7, 6.017082273205615, 'Arrival'],\n",
" [8, 11.11180870530135, 'Arrival'],\n",
" [9, 12.79936039051638, 'Arrival'],\n",
" [10, 13.92130464011105, 'Arrival'],\n",
" [11, 15.156231476563278, 'Arrival'],\n",
" [12, 17.149943407249417, 'Arrival'],\n",
" [13, 20.156346210823116, 'Arrival'],\n",
" [14, 25.13846969588947, 'Arrival'],\n",
" [15, 26.988843043672063, 'Arrival'],\n",
" [16, 28.28680275211266, 'Arrival'],\n",
" [17, 28.65926687881398, 'Arrival'],\n",
" [18, 29.299928937955222, 'Arrival']]"
]
},
"execution_count": 11,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"env = simpy.Environment()\n",
"\n",
"log = []\n",
"\n",
"# define a python generator describing the arrival of a new patient\n",
"def patient_arrival(env, rate):\n",
" n = 0\n",
" while True:\n",
" yield env.timeout(random.expovariate(rate))\n",
" n = n + 1\n",
" log.append([n, env.now, 'Arrival'])\n",
"\n",
"# perform a simulation with simpy\n",
"env.process(patient_arrival(env, 0.5))\n",
"env.run(until=30)\n",
"\n",
"log"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "wLj6V-VsA6Aq"
},
"source": [
"### Version 3. Converting the log to a Pandas DataFrame\n",
"\n",
"The next version of our simulation uses the Pandas library to create relevant analytics."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 452
},
"colab_type": "code",
"executionInfo": {
"elapsed": 373,
"status": "ok",
"timestamp": 1567168610931,
"user": {
"displayName": "Jeffrey Kantor",
"photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mAnl92hB5egoXgR-yAmEJN-i3LA_Jwcr3-0236SZg=s64",
"userId": "09038942003589296665"
},
"user_tz": 240
},
"id": "sZhLg48WBA0-",
"outputId": "0ce4489c-11b9-4b3e-d325-f893f020a2e0"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Time
\n",
"
Event
\n",
"
\n",
"
\n",
"
Patient ID
\n",
"
\n",
"
\n",
"
\n",
" \n",
" \n",
"
\n",
"
1
\n",
"
0.147039
\n",
"
Arrival
\n",
"
\n",
"
\n",
"
2
\n",
"
0.373035
\n",
"
Arrival
\n",
"
\n",
"
\n",
"
3
\n",
"
1.462077
\n",
"
Arrival
\n",
"
\n",
"
\n",
"
4
\n",
"
3.231856
\n",
"
Arrival
\n",
"
\n",
"
\n",
"
5
\n",
"
3.288754
\n",
"
Arrival
\n",
"
\n",
"
\n",
"
6
\n",
"
4.702892
\n",
"
Arrival
\n",
"
\n",
"
\n",
"
7
\n",
"
11.170035
\n",
"
Arrival
\n",
"
\n",
"
\n",
"
8
\n",
"
18.117774
\n",
"
Arrival
\n",
"
\n",
"
\n",
"
9
\n",
"
18.810539
\n",
"
Arrival
\n",
"
\n",
"
\n",
"
10
\n",
"
20.414122
\n",
"
Arrival
\n",
"
\n",
"
\n",
"
11
\n",
"
28.920332
\n",
"
Arrival
\n",
"
\n",
"
\n",
"
12
\n",
"
29.998723
\n",
"
Arrival
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Time Event\n",
"Patient ID \n",
"1 0.147039 Arrival\n",
"2 0.373035 Arrival\n",
"3 1.462077 Arrival\n",
"4 3.231856 Arrival\n",
"5 3.288754 Arrival\n",
"6 4.702892 Arrival\n",
"7 11.170035 Arrival\n",
"8 18.117774 Arrival\n",
"9 18.810539 Arrival\n",
"10 20.414122 Arrival\n",
"11 28.920332 Arrival\n",
"12 29.998723 Arrival"
]
},
"execution_count": 12,
"metadata": {
"tags": []
},
"output_type": "execute_result"
}
],
"source": [
"env = simpy.Environment()\n",
"\n",
"log = []\n",
"\n",
"# define a python generator describing the arrival of a new patient\n",
"def patient_arrival(env, rate):\n",
" n = 0\n",
" while True:\n",
" yield env.timeout(random.expovariate(rate))\n",
" n = n + 1\n",
" log.append([n, env.now, 'Arrival'])\n",
"\n",
"# perform a simulation with simpy\n",
"env.process(patient_arrival(env, 0.5))\n",
"env.run(until=30)\n",
"\n",
"# converting the log to a Pandas DataFrame\n",
"df = pd.DataFrame(log, columns=['Patient ID', 'Time', 'Event']).set_index('Patient ID')\n",
"df"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "7VnQH6rkB_FR"
},
"source": [
"### Version 4. Plotting the DataFrame\n",
"\n",
"Now that we have an analytical tool to summarize the event log, let's use the tool to perform longer simulationsn and show the result graphically."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 300
},
"colab_type": "code",
"executionInfo": {
"elapsed": 556,
"status": "ok",
"timestamp": 1567168613623,
"user": {
"displayName": "Jeffrey Kantor",
"photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mAnl92hB5egoXgR-yAmEJN-i3LA_Jwcr3-0236SZg=s64",
"userId": "09038942003589296665"
},
"user_tz": 240
},
"id": "o6ij_IGpB2LB",
"outputId": "b2bd47ed-23d2-446a-d34b-f93ee77880d0"
},
"outputs": [
{
"data": {
"text/plain": [
"Text(0, 0.5, 'Arrival Time')"
]
},
"execution_count": 13,
"metadata": {
"tags": []
},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nZSsAAAAASUVORK5CYII=\n",
"text/plain": [
"
"
]
},
"metadata": {
"tags": []
},
"output_type": "display_data"
}
],
"source": [
"env = simpy.Environment()\n",
"\n",
"log = []\n",
"\n",
"# define a python generator describing the arrival of a new patient\n",
"def patient_arrival(env, rate):\n",
" n = 0\n",
" while True:\n",
" yield env.timeout(random.expovariate(rate))\n",
" n = n + 1\n",
" log.append([n, env.now, 'Arrival'])\n",
"\n",
"# perform a simulation with simpy\n",
"env.process(patient_arrival(env, 0.5))\n",
"env.run(until=1440)\n",
"\n",
"# converting the log to a Pandas DataFrame and plotting the results\n",
"df = pd.DataFrame(log, columns=['Patient ID', 'Time', 'Event']).set_index('Patient ID')\n",
"ax = df['Time'].plot()\n",
"ax.set_ylabel('Arrival Time')"
]
},
{
"cell_type": "markdown",
"metadata": {
"colab_type": "text",
"id": "j8m-oxbdD44X"
},
"source": [
"## Version 5. Modeling the emergency room queue and service providers\n",
"\n",
"The next step in this simulation is to model the emergency room queue and hospital service providers. For the emergency room queue we use the [simpy.Stores](https://simpy.readthedocs.io/en/latest/topical_guides/resources.html#stores) object. A Stores object has a `.put()` method the adds a Python object to the queue, and `.get()` method to remove Python objects from the queue. The queue operates in FIFO mode (first-in, first-out) and, by default, with infinite capacity.\n",
"\n",
"We model the actual service as taking a fixed period."
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 518
},
"colab_type": "code",
"executionInfo": {
"elapsed": 720,
"status": "ok",
"timestamp": 1567170997070,
"user": {
"displayName": "Jeffrey Kantor",
"photoUrl": "https://lh3.googleusercontent.com/a-/AAuE7mAnl92hB5egoXgR-yAmEJN-i3LA_Jwcr3-0236SZg=s64",
"userId": "09038942003589296665"
},
"user_tz": 240
},
"id": "xYC-XT_EELiI",
"outputId": "e7a34682-ca24-4674-ef7c-e49b5be4342b"
},
"outputs": [
{
"data": {
"text/html": [
"