diff --git a/README.md b/README.md index 38a9ccd..0d6d4ad 100644 --- a/README.md +++ b/README.md @@ -38,11 +38,36 @@ This tutorial has been set up to run on your browser without the need to install ### 2.2 Running notebooks locally on your machine -You can also run the notebooks in `content/` locally on your machine. You'll need to install the provided conda environment `environment.yml`. +#### 2.2.1 Downloading the code + +Either clone the repository using git or click on the green "code" button and select "Download Zip". + +```bash +git clone https://github.com/pythonhealthdatascience/intro-open-sim.git +``` + +#### 2.2.2 Installing dependencies and running JupyterLab + +All dependencies can be found in [`binder/environment.yml`]() and are pulled from conda-forge. To run the code locally, we recommend installing [miniforge](https://github.com/conda-forge/miniforge); + +> miniforge is FOSS alternative to Anaconda and miniconda that uses conda-forge as the default channel for packages. It installs both conda and mamba (a drop in replacement for conda) package managers. We recommend mamba for faster resolving of dependencies and installation of packages. + +navigating your terminal (or cmd prompt) to the directory containing the repo and issuing the following command: + +``` +mamba env create -f binder/environment.yml +``` + +Activate the mamba environment using the following command: + +``` +mamba activate simpy_tutorial +``` + +You can then run the notebooks in `content/` locally on your machine using JupyterLab. Issue the following command and JupyterLab will open in your browser. Notebooks are in the `content/` directory. ``` -conda env create --name xeus-python-kernel --file environment.yml -conda activate xeus-python-kernel +jupyter-lab ``` ## 📝 3. Citation diff --git a/binder/environment.yml b/binder/environment.yml index 3f0dbdd..3d4e7f7 100644 --- a/binder/environment.yml +++ b/binder/environment.yml @@ -2,8 +2,9 @@ name: simpy_tutorial channels: - conda-forge dependencies: - - python=3.11 - - simpy=4.1.1 + - jupyterlab=4.2.4 + - matplotlib=3.8.4 - numpy<2 - pandas=1.5.3 - - matplotlib=3.8.4 + - python=3.11 + - simpy=4.1.1 \ No newline at end of file diff --git a/content/01_sampling.ipynb b/content/01_sampling.ipynb index 00f1c9b..5b78ef5 100644 --- a/content/01_sampling.ipynb +++ b/content/01_sampling.ipynb @@ -470,7 +470,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.1.-1" + "version": "3.11.10" } }, "nbformat": 4, diff --git a/content/02_basic_simpy.ipynb b/content/02_basic_simpy.ipynb index 6a02da7..9c728be 100644 --- a/content/02_basic_simpy.ipynb +++ b/content/02_basic_simpy.ipynb @@ -49,11 +49,9 @@ "id": "968d7a3d-763d-48a0-9915-421631d1f650", "metadata": {}, "source": [ - "## 3. An example: a hospital pharmacy\n", + "# 3. An example: a urgent care call sample\n", "\n", - "In this first example, let's assume (unrealistically) that prescriptions arrive **exactly** 5 minutes apart.\n", - "\n", - "![Pharmacy with prescriptions every 5 minutes](./img/pharmacy.png)\n", + "This case study uses a simple model of an urgent care telephone call centre, similar to the NHS 111 service in the UK. To learn `simpy` we will first build a very simple model. In our first iteration of this model, calls to the centre arrive **deterministically**. For now we will ignore resources and activities in the model and just model a deterministic arrival process. The simulation time units are in minutes. Let's assume there are 60 new callers per hour (an fixed inter-arrival time of 1.0 per minute).\n", "\n", "## 4. The model building blocks\n", "\n", @@ -72,19 +70,19 @@ "We can introduce **delays** or **activities** into a process. For example these might be the duration of a stay on a ward, or the duration of a operation - or, in this case, a **delay between arrivals (inter-arrival time)**. In `simpy` you control this with the following method:\n", "\n", "```python\n", - "env.timeout(5.0)\n", + "env.timeout(1.0)\n", "```\n", "\n", "### 4.3 Generators\n", "\n", "The events in the DES are modelled and scheduled in `simpy` using python **generators** (i.e. they are the \"event-processing mechanism\"). A generator is a function that behaves like an iterator, meaning it can yield a **sequence of values** when iterated over.\n", "\n", - "For example, below is a basic generator function that yields a new arrival every 5 minutes. It takes the **environment** as a parameter. It then internally calls the `env.timeout()` method in an infinite loop.\n", + "For example, below is a basic generator function that yields a new arrival every 1 minute. It takes the **environment** as a parameter. It then internally calls the `env.timeout()` method in an infinite loop.\n", "\n", "```python\n", - "def prescription_arrival_generator(env):\n", + "def arrivals_generator(env):\n", " while True:\n", - " yield env.timeout(5.0)\n", + " yield env.timeout(1.0)\n", "```\n", "\n", "### 4.4 SimPy process and run\n", @@ -94,7 +92,7 @@ "1. Set the generator up as a **SimPy process** using `env.process()`\n", "\n", "```python\n", - "env.process(prescription_arrival_generator(env))\n", + "env.process(arrivals_generator(env))\n", "```\n", "\n", "2. Run the environment for a user specified **run length** using `env.run()`\n", @@ -103,23 +101,23 @@ "env.run(until=25)\n", "```\n", "\n", - "The run method handle the infinite loop we set up in `prescription_arrival_generator`. The simulation model has an internal concept of time. It will end execution when its internal clock reaches 25 time units.\n", + "The run method handle the infinite loop we set up in `arrivals_generator`. The simulation model has an internal concept of time. It will end execution when its internal clock reaches 25 time units.\n", "\n", "## 5. Create the model\n", "\n", - "**Now that we have covered the basic building blocks, let's code the actual model.** It makes sense to create our model logic first. The code below will generate arrivals every 5 minutes. Note that the function takes an environment object as a parameter." + "**Now that we have covered the basic building blocks, let's code the actual model.** It makes sense to create our model logic first. The code below will generate arrivals every 60.0 / 100.0 minutes. Note that the function takes an environment object as a parameter." ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 22, "id": "a6fd524c-7dc4-41c0-876d-3507ce480dfb", "metadata": {}, "outputs": [], "source": [ - "def prescription_arrival_generator(env):\n", + "def arrivals_generator(env):\n", " '''\n", - " Prescriptions arrive with a fixed duration of 5 minutes.\n", + " Callers arrive with a fixed inter-arrival time of 1.0 minutes.\n", "\n", " Parameters:\n", " ------\n", @@ -131,13 +129,13 @@ " while True:\n", " \n", " # sample an inter-arrival time.\n", - " inter_arrival_time = 5.0\n", + " inter_arrival_time = 1.0\n", " \n", " # we use the yield keyword instead of return\n", " yield env.timeout(inter_arrival_time)\n", " \n", " # print out the time of the arrival\n", - " print(f'Prescription arrives at: {env.now}')" + " print(f'Call arrives at: {env.now}')" ] }, { @@ -152,7 +150,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 23, "id": "f6f74ff5-4c95-400e-8494-42e438b18b90", "metadata": {}, "outputs": [ @@ -160,10 +158,30 @@ "name": "stdout", "output_type": "stream", "text": [ - "Prescription arrives at: 5.0\n", - "Prescription arrives at: 10.0\n", - "Prescription arrives at: 15.0\n", - "Prescription arrives at: 20.0\n", + "Call arrives at: 1.0\n", + "Call arrives at: 2.0\n", + "Call arrives at: 3.0\n", + "Call arrives at: 4.0\n", + "Call arrives at: 5.0\n", + "Call arrives at: 6.0\n", + "Call arrives at: 7.0\n", + "Call arrives at: 8.0\n", + "Call arrives at: 9.0\n", + "Call arrives at: 10.0\n", + "Call arrives at: 11.0\n", + "Call arrives at: 12.0\n", + "Call arrives at: 13.0\n", + "Call arrives at: 14.0\n", + "Call arrives at: 15.0\n", + "Call arrives at: 16.0\n", + "Call arrives at: 17.0\n", + "Call arrives at: 18.0\n", + "Call arrives at: 19.0\n", + "Call arrives at: 20.0\n", + "Call arrives at: 21.0\n", + "Call arrives at: 22.0\n", + "Call arrives at: 23.0\n", + "Call arrives at: 24.0\n", "end of run. simulation clock time = 25\n" ] } @@ -175,8 +193,8 @@ "# create the simpy environment object\n", "env = simpy.Environment()\n", "\n", - "# tell simpy that the `prescription_arrival_generator` is a process\n", - "env.process(prescription_arrival_generator(env))\n", + "# tell simpy that the `arrivals_generator` is a process\n", + "env.process(arrivals_generator(env))\n", "\n", "# run the simulation model\n", "env.run(until=RUN_LENGTH)\n", @@ -192,7 +210,7 @@ "\n", "Before we learn anything more about `simpy`, have a go at the [generators exercise](./03a_exercise1.ipynb).\n", "\n", - "In the exercise you will need to modify the `prescription_arrival_generator` so that it has random arrivals. This exercise tests that you have understood the basics of `simpy` and random sampling in `numpy`\n" + "In the exercise you will need to modify the `arrivals_generator` so that it has random arrivals. This exercise tests that you have understood the basics of `simpy` and random sampling in `numpy`\n" ] } ], @@ -212,7 +230,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.6" + "version": "3.11.10" } }, "nbformat": 4, diff --git a/content/03a_exercise1.ipynb b/content/03a_exercise1.ipynb index e62a0d3..1511736 100644 --- a/content/03a_exercise1.ipynb +++ b/content/03a_exercise1.ipynb @@ -5,9 +5,9 @@ "id": "f2147e34-ce39-4d8c-a7db-e8acec2b63e0", "metadata": {}, "source": [ - "# Generator exercise\n", + "# Solutions for the generator exercise\n", "\n", - "🧐 For the solutions, please see the [generator exercise solutions notebook](./03b_exercise1_solutions.ipynb)\n" + "🧐 For the solutions, please see the [generator exercise solutions notebook](./03b_exercise1_solutions.ipynb)" ] }, { @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "85fd4a85-bb77-498c-96ee-c14de89994a2", "metadata": {}, "outputs": [], @@ -34,22 +34,21 @@ "id": "bfab7f97-9cad-419a-8d75-a2ba190edee8", "metadata": {}, "source": [ - "## 2. Example code\n", + "## Example code\n", "\n", - "The code below is taken from the simple pharmacy example. In this code arrivals occur with an inter-arrival time (IAT) of exactly 5 minutes." + "The code below is taken from the simple call centre example. In this code arrivals occur with an inter-arrival time (IAT) of exactly 1 minute." ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "ee2439f2-0d35-41fd-a5e2-4b95954dd5c5", "metadata": {}, "outputs": [], "source": [ - "def prescription_arrival_generator(env):\n", + "def arrivals_generator(env):\n", " '''\n", - " Prescriptions arrive with a fixed duration of\n", - " 5 minutes.\n", + " Prescriptions arrive with a fixed duration of 1 minute.\n", "\n", " Parameters:\n", " ------\n", @@ -61,33 +60,21 @@ " while True:\n", " \n", " # sample an inter-arrival time.\n", - " inter_arrival_time = 5.0\n", + " inter_arrival_time = 1.0\n", " \n", " # we use the yield keyword instead of return\n", " yield env.timeout(inter_arrival_time)\n", " \n", " # print out the time of the arrival\n", - " print(f'Prescription arrives at: {env.now}')" + " print(f'Call arrives at: {env.now}')" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "40c495d5-6f55-4c93-99e3-5bfa6cdff36d", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Prescription arrives at: 5.0\n", - "Prescription arrives at: 10.0\n", - "Prescription arrives at: 15.0\n", - "Prescription arrives at: 20.0\n", - "end of run. simulation clock time = 25\n" - ] - } - ], + "outputs": [], "source": [ "# model parameters\n", "RUN_LENGTH = 25\n", @@ -95,8 +82,8 @@ "# create the simpy environment object\n", "env = simpy.Environment()\n", "\n", - "# tell simpy that the `prescription_arrival_generator` is a process\n", - "env.process(prescription_arrival_generator(env))\n", + "# tell simpy that the `arrivals_generator` is a process\n", + "env.process(arrivals_generator(env))\n", "\n", "# run the simulation model\n", "env.run(until=RUN_LENGTH)\n", @@ -112,7 +99,7 @@ "\n", "**Task:**\n", "\n", - "Update `prescription_arrival_generator()` so that inter-arrival times follow an **exponential distribution** with a mean of 5.0 minutes between arrivals. Use a run length of 25 minutes.\n", + "Update `arrivals_generator()` so that inter-arrival times follow an **exponential distribution** with a mean inter-arrival time of 60.0 / 100 minutes between arrivals (i.e. 100 arrivals per hour). Use a run length of 25 minutes.\n", "\n", "**Bonus challenge:**\n", "\n", @@ -130,12 +117,12 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "65823eff-8d0f-4eaf-a531-173c8ab6290c", + "execution_count": null, + "id": "49dcec06-cf80-47d0-befd-66bc842f2e6e", "metadata": {}, "outputs": [], "source": [ - "# your code here." + "# your code here..." ] } ], diff --git a/content/03b_exercise1_solutions.ipynb b/content/03b_exercise1_solutions.ipynb index 366abc8..dec9ed4 100644 --- a/content/03b_exercise1_solutions.ipynb +++ b/content/03b_exercise1_solutions.ipynb @@ -7,7 +7,7 @@ "source": [ "# Solutions for the generator exercise\n", "\n", - "⚠️ **SOLUTIONS:** This notebook contains example solutions for the[generator exercise](./03a_exercise1.ipynb)" + "⚠️ **SOLUTIONS:** This notebook contains example solutions for the [generator exercise](./03a_exercise1.ipynb)" ] }, { @@ -36,7 +36,7 @@ "source": [ "## Example code\n", "\n", - "The code below is taken from the simple pharmacy example. In this code arrivals occur with an inter-arrival time (IAT) of exactly 5 minutes." + "The code below is taken from the simple call centre example. In this code arrivals occur with an inter-arrival time (IAT) of exactly 1 minute." ] }, { @@ -46,10 +46,9 @@ "metadata": {}, "outputs": [], "source": [ - "def prescription_arrival_generator(env):\n", + "def arrivals_generator(env):\n", " '''\n", - " Prescriptions arrive with a fixed duration of\n", - " 5 minutes.\n", + " Prescriptions arrive with a fixed duration of 1 minute.\n", "\n", " Parameters:\n", " ------\n", @@ -61,13 +60,13 @@ " while True:\n", " \n", " # sample an inter-arrival time.\n", - " inter_arrival_time = 5.0\n", + " inter_arrival_time = 1.0\n", " \n", " # we use the yield keyword instead of return\n", " yield env.timeout(inter_arrival_time)\n", " \n", " # print out the time of the arrival\n", - " print(f'Prescription arrives at: {env.now}')" + " print(f'Call arrives at: {env.now}')" ] }, { @@ -80,10 +79,30 @@ "name": "stdout", "output_type": "stream", "text": [ - "Prescription arrives at: 5.0\n", - "Prescription arrives at: 10.0\n", - "Prescription arrives at: 15.0\n", - "Prescription arrives at: 20.0\n", + "Call arrives at: 1.0\n", + "Call arrives at: 2.0\n", + "Call arrives at: 3.0\n", + "Call arrives at: 4.0\n", + "Call arrives at: 5.0\n", + "Call arrives at: 6.0\n", + "Call arrives at: 7.0\n", + "Call arrives at: 8.0\n", + "Call arrives at: 9.0\n", + "Call arrives at: 10.0\n", + "Call arrives at: 11.0\n", + "Call arrives at: 12.0\n", + "Call arrives at: 13.0\n", + "Call arrives at: 14.0\n", + "Call arrives at: 15.0\n", + "Call arrives at: 16.0\n", + "Call arrives at: 17.0\n", + "Call arrives at: 18.0\n", + "Call arrives at: 19.0\n", + "Call arrives at: 20.0\n", + "Call arrives at: 21.0\n", + "Call arrives at: 22.0\n", + "Call arrives at: 23.0\n", + "Call arrives at: 24.0\n", "end of run. simulation clock time = 25\n" ] } @@ -95,8 +114,8 @@ "# create the simpy environment object\n", "env = simpy.Environment()\n", "\n", - "# tell simpy that the `prescription_arrival_generator` is a process\n", - "env.process(prescription_arrival_generator(env))\n", + "# tell simpy that the `arrivals_generator` is a process\n", + "env.process(arrivals_generator(env))\n", "\n", "# run the simulation model\n", "env.run(until=RUN_LENGTH)\n", @@ -112,7 +131,7 @@ "\n", "**Task:**\n", "\n", - "Update `prescription_arrival_generator()` so that inter-arrival times follow an **exponential distribution** with a mean of 5.0 minutes between arrivals. Use a run length of 25 minutes.\n", + "Update `arrivals_generator()` so that inter-arrival times follow an **exponential distribution** with a mean inter-arrival time of 60.0 / 100 minutes between arrivals (i.e. 100 arrivals per hour). Use a run length of 25 minutes.\n", "\n", "**Bonus challenge:**\n", "\n", @@ -144,10 +163,10 @@ "outputs": [], "source": [ "# example answer\n", - "def prescription_arrival_generator(env, random_seed=None):\n", + "def arrivals_generator(env, random_seed=None):\n", " '''\n", - " Prescriptions arrive with a fixed duration of\n", - " 5 minutes.\n", + " Time between caller arrivals follows an Expoential distribution with mean\n", + " inter-arrival time of 60.0/100.0 minutes\n", " \n", " Parameters:\n", " ------\n", @@ -159,9 +178,9 @@ " rs_arrivals = np.random.default_rng(random_seed)\n", " \n", " while True:\n", - " inter_arrival_time = rs_arrivals.exponential(5.0)\n", + " inter_arrival_time = rs_arrivals.exponential(60.0/100.0)\n", " yield env.timeout(inter_arrival_time)\n", - " print(f'Prescription arrives at: {env.now}')" + " print(f'Call arrives at: {env.now}')" ] }, { @@ -174,13 +193,44 @@ "name": "stdout", "output_type": "stream", "text": [ - "Prescription arrives at: 6.560835382912934\n", - "Prescription arrives at: 13.76671258369678\n", - "Prescription arrives at: 13.835164735720078\n", - "Prescription arrives at: 18.405801165765617\n", - "Prescription arrives at: 19.82317231493007\n", - "Prescription arrives at: 20.67371800270213\n", - "Prescription arrives at: 22.40238071777428\n", + "Call arrives at: 1.2047204928588542\n", + "Call arrives at: 1.665546474948937\n", + "Call arrives at: 2.373859767681621\n", + "Call arrives at: 2.8557180455305122\n", + "Call arrives at: 3.292413414302393\n", + "Call arrives at: 3.948584404430685\n", + "Call arrives at: 4.635827332239991\n", + "Call arrives at: 4.713197604859726\n", + "Call arrives at: 6.2100100085567185\n", + "Call arrives at: 6.774734821423559\n", + "Call arrives at: 6.793089740386549\n", + "Call arrives at: 7.723100804981457\n", + "Call arrives at: 9.071806936287263\n", + "Call arrives at: 9.883018879630491\n", + "Call arrives at: 10.292246335013177\n", + "Call arrives at: 11.206429085014648\n", + "Call arrives at: 12.861416213324771\n", + "Call arrives at: 13.710937641648242\n", + "Call arrives at: 14.510705172538367\n", + "Call arrives at: 14.625813856487689\n", + "Call arrives at: 15.61718210481707\n", + "Call arrives at: 16.296921355929992\n", + "Call arrives at: 17.41307760431281\n", + "Call arrives at: 19.228422092191522\n", + "Call arrives at: 19.440896829258076\n", + "Call arrives at: 19.64343927716942\n", + "Call arrives at: 20.588121606767952\n", + "Call arrives at: 20.985618515608884\n", + "Call arrives at: 21.34731310770153\n", + "Call arrives at: 21.823781238529477\n", + "Call arrives at: 21.919997467156954\n", + "Call arrives at: 21.923132569559417\n", + "Call arrives at: 22.40881937290717\n", + "Call arrives at: 22.55518745372537\n", + "Call arrives at: 22.973348752907274\n", + "Call arrives at: 24.41742617539971\n", + "Call arrives at: 24.608483963960868\n", + "Call arrives at: 24.695937459592837\n", "end of run. simulation clock time = 25\n" ] } @@ -192,8 +242,8 @@ "# create the simpy environment object\n", "env = simpy.Environment()\n", "\n", - "# tell simpy that the `prescription_arrival_generator` is a process\n", - "env.process(prescription_arrival_generator(env))\n", + "# tell simpy that the `arrivals_generator` is a process\n", + "env.process(arrivals_generator(env))\n", "\n", "# run the simulation model\n", "env.run(until=RUN_LENGTH)\n", @@ -259,10 +309,9 @@ "outputs": [], "source": [ "# example answer\n", - "def prescription_arrival_generator(env, iat_dist):\n", + "def arrivals_generator(env, iat_dist):\n", " '''\n", - " Prescriptions arrive with a fixed duration of\n", - " 5 minutes.\n", + " Call arrival process. Calls follow a user specified distribution\n", " \n", " Parameters:\n", " ------\n", @@ -271,11 +320,7 @@ " iat_dist: object\n", " A python class that implements a .sample() method\n", " and generates the IATs\n", - " \n", - " random_state: int, optional (default=None)\n", - " if set then used as random seed to control sampling.\n", - " '''\n", - " \n", + " ''' \n", " while True:\n", " inter_arrival_time = iat_dist.sample()\n", " yield env.timeout(inter_arrival_time)\n", @@ -292,8 +337,55 @@ "name": "stdout", "output_type": "stream", "text": [ - "Prescription arrives at: 12.021043019829973\n", - "Prescription arrives at: 23.70199129895224\n", + "Prescription arrives at: 1.4425251623795967\n", + "Prescription arrives at: 2.8442389558742684\n", + "Prescription arrives at: 4.2750955557988215\n", + "Prescription arrives at: 4.442972129709771\n", + "Prescription arrives at: 4.4948345695287975\n", + "Prescription arrives at: 5.366430878952488\n", + "Prescription arrives at: 6.212407295507032\n", + "Prescription arrives at: 8.08698486943673\n", + "Prescription arrives at: 8.134561387746835\n", + "Prescription arrives at: 8.762497895672734\n", + "Prescription arrives at: 8.804759679751418\n", + "Prescription arrives at: 9.458173856565795\n", + "Prescription arrives at: 10.49697026829608\n", + "Prescription arrives at: 10.729107163050026\n", + "Prescription arrives at: 11.46805856064697\n", + "Prescription arrives at: 11.560322512942706\n", + "Prescription arrives at: 11.615268873376822\n", + "Prescription arrives at: 11.804376394656257\n", + "Prescription arrives at: 12.345095959878352\n", + "Prescription arrives at: 12.592887157721446\n", + "Prescription arrives at: 13.34131872760962\n", + "Prescription arrives at: 13.475464550937012\n", + "Prescription arrives at: 14.57824670942369\n", + "Prescription arrives at: 15.314498227352246\n", + "Prescription arrives at: 15.707975919730046\n", + "Prescription arrives at: 15.958227943517135\n", + "Prescription arrives at: 16.230219757096094\n", + "Prescription arrives at: 16.27646604532949\n", + "Prescription arrives at: 16.38424539795422\n", + "Prescription arrives at: 16.795437668916772\n", + "Prescription arrives at: 17.028645810612666\n", + "Prescription arrives at: 17.78716992515173\n", + "Prescription arrives at: 18.212264301601405\n", + "Prescription arrives at: 18.355022274180214\n", + "Prescription arrives at: 18.631675275934697\n", + "Prescription arrives at: 19.016609318249007\n", + "Prescription arrives at: 19.222909335111684\n", + "Prescription arrives at: 19.41605606765547\n", + "Prescription arrives at: 19.943404876970998\n", + "Prescription arrives at: 20.12157320232828\n", + "Prescription arrives at: 20.92179465734741\n", + "Prescription arrives at: 21.756313049094953\n", + "Prescription arrives at: 22.406762805874067\n", + "Prescription arrives at: 22.45057981466233\n", + "Prescription arrives at: 23.131020315695984\n", + "Prescription arrives at: 23.94362310841509\n", + "Prescription arrives at: 24.616846899289545\n", + "Prescription arrives at: 24.784876371431398\n", + "Prescription arrives at: 24.977438086053017\n", "end of run. simulation clock time = 25\n" ] } @@ -305,10 +397,10 @@ "# create the simpy environment object\n", "env = simpy.Environment()\n", "\n", - "iat = Exponential(mean=5.0, random_seed=42)\n", + "iat = Exponential(mean=60.0 / 100.0, random_seed=42)\n", "\n", - "# tell simpy that the `prescription_arrival_generator` is a process\n", - "env.process(prescription_arrival_generator(env, iat))\n", + "# tell simpy that the `arrivals_generator` is a process\n", + "env.process(arrivals_generator(env, iat))\n", "\n", "# run the simulation model\n", "env.run(until=RUN_LENGTH)\n", @@ -345,12 +437,45 @@ "name": "stdout", "output_type": "stream", "text": [ - "Prescription arrives at: 6.0105215099149865\n", - "Prescription arrives at: 11.85099564947612\n", - "Prescription arrives at: 17.812898149161757\n", - "Prescription arrives at: 18.512383873790714\n", - "Prescription arrives at: 18.728477373036657\n", - "Prescription arrives at: 22.360128662302035\n", + "Prescription arrives at: 1.8031564529744961\n", + "Prescription arrives at: 3.5552986948428362\n", + "Prescription arrives at: 5.3438694447485275\n", + "Prescription arrives at: 5.553715162137215\n", + "Prescription arrives at: 5.618543211910998\n", + "Prescription arrives at: 6.708038598690611\n", + "Prescription arrives at: 7.7655091193837915\n", + "Prescription arrives at: 10.108731086795915\n", + "Prescription arrives at: 10.168201734683548\n", + "Prescription arrives at: 10.95312236959092\n", + "Prescription arrives at: 11.005949599689277\n", + "Prescription arrives at: 11.822717320707246\n", + "Prescription arrives at: 13.121212835370102\n", + "Prescription arrives at: 13.411383953812535\n", + "Prescription arrives at: 14.335073200808715\n", + "Prescription arrives at: 14.450403141178384\n", + "Prescription arrives at: 14.519086091721029\n", + "Prescription arrives at: 14.755470493320324\n", + "Prescription arrives at: 15.431369949847943\n", + "Prescription arrives at: 15.74110894715181\n", + "Prescription arrives at: 16.67664840951203\n", + "Prescription arrives at: 16.84433068867127\n", + "Prescription arrives at: 18.22280838677962\n", + "Prescription arrives at: 19.143122784190314\n", + "Prescription arrives at: 19.634969899662565\n", + "Prescription arrives at: 19.947784929396427\n", + "Prescription arrives at: 20.287774696370125\n", + "Prescription arrives at: 20.345582556661867\n", + "Prescription arrives at: 20.480306747442782\n", + "Prescription arrives at: 20.99429708614597\n", + "Prescription arrives at: 21.285807263265834\n", + "Prescription arrives at: 22.233962406439662\n", + "Prescription arrives at: 22.765330377001757\n", + "Prescription arrives at: 22.943777842725268\n", + "Prescription arrives at: 23.28959409491837\n", + "Prescription arrives at: 23.770761647811256\n", + "Prescription arrives at: 24.0286366688896\n", + "Prescription arrives at: 24.270070084569333\n", + "Prescription arrives at: 24.92925609621374\n", "end of run. simulation clock time = 25\n" ] } @@ -363,11 +488,12 @@ "env = simpy.Environment()\n", "\n", "# ****** MODIFICATION: reduce IAT. ******\n", - "# Note: with this method we could use a different distribution should as Erlang\n", - "iat = Exponential(mean=2.5, random_seed=42)\n", + "# Note: with this method we could use a different Exponetial parameters or\n", + "# even a different distribution such as Erlang\n", + "iat = Exponential(mean=60.0 / 80.0, random_seed=42)\n", "\n", - "# tell simpy that the `prescription_arrival_generator` is a process\n", - "env.process(prescription_arrival_generator(env, iat))\n", + "# tell simpy that the `arrivals_generator` is a process\n", + "env.process(arrivals_generator(env, iat))\n", "\n", "# run the simulation model\n", "env.run(until=RUN_LENGTH)\n", @@ -391,7 +517,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.1.-1" + "version": "3.11.10" } }, "nbformat": 4, diff --git a/content/04_111_model.ipynb b/content/04_111_model.ipynb index 66044fd..4b4852f 100644 --- a/content/04_111_model.ipynb +++ b/content/04_111_model.ipynb @@ -167,6 +167,7 @@ "source": [ "def arrivals_generator(env, operators):\n", " '''\n", + " Simulates the call arrival process and spawns \n", " Inter-arrival time (IAT) is exponentially distributed\n", "\n", " Parameters:\n", @@ -216,496 +217,490 @@ "name": "stdout", "output_type": "stream", "text": [ - "call arrives at: 0.161\n", - "operator answered call 1 at 0.161\n", - "call arrives at: 0.287\n", - "operator answered call 2 at 0.287\n", - "call arrives at: 0.833\n", - "operator answered call 3 at 0.833\n", - "call arrives at: 2.477\n", - "operator answered call 4 at 2.477\n", - "call arrives at: 2.594\n", - "operator answered call 5 at 2.594\n", - "call arrives at: 3.822\n", - "operator answered call 6 at 3.822\n", - "call arrives at: 4.542\n", - "operator answered call 7 at 4.542\n", - "call arrives at: 5.705\n", - "operator answered call 8 at 5.705\n", - "call arrives at: 6.766\n", - "operator answered call 9 at 6.766\n", - "call arrives at: 7.104\n", - "operator answered call 10 at 7.104\n", - "call arrives at: 7.191\n", - "operator answered call 11 at 7.191\n", - "call arrives at: 7.409\n", - "operator answered call 12 at 7.409\n", - "call 3 ended 7.600; waiting time was 0.000\n", - "call 4 ended 7.937; waiting time was 0.000\n", - "call arrives at: 7.942\n", - "operator answered call 13 at 7.942\n", - "call 1 ended 8.287; waiting time was 0.000\n", - "call arrives at: 8.714\n", - "operator answered call 14 at 8.714\n", - "call arrives at: 9.063\n", - "operator answered call 15 at 9.063\n", - "call arrives at: 9.412\n", - "operator answered call 16 at 9.412\n", - "call 2 ended 9.476; waiting time was 0.000\n", - "call arrives at: 10.519\n", - "operator answered call 17 at 10.519\n", - "call 6 ended 10.944; waiting time was 0.000\n", - "call arrives at: 11.053\n", - "operator answered call 18 at 11.053\n", - "call 7 ended 11.159; waiting time was 0.000\n", - "call arrives at: 11.452\n", - "operator answered call 19 at 11.452\n", - "call 5 ended 11.629; waiting time was 0.000\n", - "call arrives at: 12.366\n", - "operator answered call 20 at 12.366\n", - "call 8 ended 12.964; waiting time was 0.000\n", - "call 9 ended 13.164; waiting time was 0.000\n", - "call arrives at: 13.213\n", - "operator answered call 21 at 13.213\n", - "call arrives at: 13.694\n", - "operator answered call 22 at 13.694\n", - "call 11 ended 13.991; waiting time was 0.000\n", - "call 13 ended 14.180; waiting time was 0.000\n", - "call arrives at: 14.391\n", - "operator answered call 23 at 14.391\n", - "call arrives at: 14.880\n", - "operator answered call 24 at 14.880\n", - "call arrives at: 15.053\n", - "call arrives at: 15.378\n", - "call arrives at: 15.407\n", - "call 12 ended 15.575; waiting time was 0.000\n", - "operator answered call 25 at 15.575\n", - "call 15 ended 15.685; waiting time was 0.000\n", - "operator answered call 26 at 15.685\n", - "call 10 ended 15.738; waiting time was 0.000\n", - "operator answered call 27 at 15.738\n", - "call arrives at: 16.116\n", - "call 17 ended 16.415; waiting time was 0.000\n", - "operator answered call 28 at 16.415\n", - "call arrives at: 16.815\n", - "call arrives at: 17.281\n", - "call arrives at: 17.412\n", - "call arrives at: 17.702\n", - "call 16 ended 17.924; waiting time was 0.000\n", - "operator answered call 29 at 17.924\n", - "call 14 ended 18.103; waiting time was 0.000\n", - "operator answered call 30 at 18.103\n", - "call arrives at: 18.506\n", - "call arrives at: 18.588\n", - "call 20 ended 18.778; waiting time was 0.000\n", - "operator answered call 31 at 18.778\n", - "call 19 ended 19.114; waiting time was 0.000\n", - "operator answered call 32 at 19.114\n", - "call 21 ended 19.232; waiting time was 0.000\n", - "operator answered call 33 at 19.232\n", - "call arrives at: 19.550\n", - "call 22 ended 19.859; waiting time was 0.000\n", - "operator answered call 34 at 19.859\n", - "call arrives at: 20.532\n", - "call 18 ended 20.648; waiting time was 0.000\n", - "operator answered call 35 at 20.648\n", - "call arrives at: 21.069\n", - "call arrives at: 21.088\n", - "call 23 ended 21.304; waiting time was 0.000\n", - "operator answered call 36 at 21.304\n", - "call arrives at: 21.515\n", - "call arrives at: 21.563\n", - "call 27 ended 21.908; waiting time was 0.331\n", - "operator answered call 37 at 21.908\n", - "call 25 ended 22.174; waiting time was 0.522\n", - "operator answered call 38 at 22.174\n", - "call 24 ended 22.430; waiting time was 0.000\n", - "operator answered call 39 at 22.430\n", - "call 26 ended 22.505; waiting time was 0.307\n", - "operator answered call 40 at 22.505\n", - "call arrives at: 23.352\n", - "call 28 ended 23.568; waiting time was 0.300\n", - "operator answered call 41 at 23.568\n", - "call 29 ended 24.712; waiting time was 1.109\n", - "call 30 ended 24.861; waiting time was 0.822\n", - "call arrives at: 25.072\n", - "operator answered call 42 at 25.072\n", - "call 31 ended 25.625; waiting time was 1.366\n", - "call arrives at: 25.776\n", - "operator answered call 43 at 25.776\n", - "call arrives at: 26.085\n", - "operator answered call 44 at 26.085\n", - "call 32 ended 26.201; waiting time was 1.412\n", - "call arrives at: 26.602\n", - "operator answered call 45 at 26.602\n", - "call 33 ended 26.763; waiting time was 0.726\n", - "call arrives at: 26.804\n", - "operator answered call 46 at 26.804\n", - "call 35 ended 27.145; waiting time was 1.098\n", - "call arrives at: 27.746\n", - "operator answered call 47 at 27.746\n", - "call 36 ended 27.966; waiting time was 0.773\n", - "call 34 ended 28.271; waiting time was 1.271\n", - "call arrives at: 28.505\n", - "operator answered call 48 at 28.505\n", - "call 38 ended 28.612; waiting time was 1.086\n", - "call 39 ended 28.785; waiting time was 0.916\n", - "call arrives at: 29.000\n", - "operator answered call 49 at 29.000\n", - "call arrives at: 29.271\n", - "operator answered call 50 at 29.271\n", - "call arrives at: 29.851\n", - "operator answered call 51 at 29.851\n", - "call 41 ended 29.909; waiting time was 0.216\n", - "call arrives at: 30.035\n", - "operator answered call 52 at 30.035\n", - "call 37 ended 30.203; waiting time was 0.839\n", - "call arrives at: 30.377\n", - "operator answered call 53 at 30.377\n", - "call 40 ended 30.486; waiting time was 0.942\n", - "call 42 ended 31.225; waiting time was 0.000\n", - "call arrives at: 31.497\n", - "operator answered call 54 at 31.497\n", - "call arrives at: 31.736\n", - "operator answered call 55 at 31.736\n", - "call arrives at: 31.894\n", - "call arrives at: 32.993\n", - "call arrives at: 33.020\n", - "call 46 ended 33.050; waiting time was 0.000\n", - "operator answered call 56 at 33.050\n", - "call 44 ended 33.168; waiting time was 0.000\n", - "operator answered call 57 at 33.168\n", - "call 45 ended 33.240; waiting time was 0.000\n", - "operator answered call 58 at 33.240\n", - "call arrives at: 33.370\n", - "call 43 ended 33.676; waiting time was 0.000\n", - "operator answered call 59 at 33.676\n", - "call arrives at: 35.110\n", - "call arrives at: 35.151\n", - "call arrives at: 35.722\n", - "call 51 ended 35.783; waiting time was 0.000\n", - "operator answered call 60 at 35.783\n", - "call 48 ended 35.815; waiting time was 0.000\n", - "operator answered call 61 at 35.815\n", - "call arrives at: 35.849\n", - "call arrives at: 36.338\n", - "call arrives at: 36.570\n", - "call 52 ended 36.672; waiting time was 0.000\n", - "operator answered call 62 at 36.672\n", - "call 50 ended 36.686; waiting time was 0.000\n", - "operator answered call 63 at 36.686\n", - "call arrives at: 36.861\n", - "call 49 ended 36.864; waiting time was 0.000\n", - "operator answered call 64 at 36.864\n", - "call 47 ended 37.151; waiting time was 0.000\n", - "operator answered call 65 at 37.151\n", - "call arrives at: 37.397\n", - "call arrives at: 37.452\n", - "call arrives at: 38.032\n", - "call 53 ended 38.798; waiting time was 0.000\n", - "operator answered call 66 at 38.798\n", - "call 57 ended 39.327; waiting time was 0.175\n", - "operator answered call 67 at 39.327\n", - "call 54 ended 39.378; waiting time was 0.000\n", - "operator answered call 68 at 39.378\n", - "call 55 ended 39.762; waiting time was 0.000\n", - "operator answered call 69 at 39.762\n", - "call 56 ended 39.977; waiting time was 1.156\n", - "call 58 ended 40.545; waiting time was 0.220\n", - "call 61 ended 41.776; waiting time was 0.664\n", - "call 59 ended 41.880; waiting time was 0.306\n", - "call 63 ended 42.802; waiting time was 0.837\n", - "call arrives at: 43.059\n", - "operator answered call 70 at 43.059\n", - "call 64 ended 43.225; waiting time was 0.526\n", - "call 65 ended 43.256; waiting time was 0.581\n", - "call 60 ended 43.544; waiting time was 0.673\n", - "call 62 ended 44.787; waiting time was 0.951\n", - "call arrives at: 45.269\n", - "operator answered call 71 at 45.269\n", - "call arrives at: 45.375\n", - "operator answered call 72 at 45.375\n", - "call arrives at: 45.639\n", - "operator answered call 73 at 45.639\n", - "call arrives at: 45.879\n", - "operator answered call 74 at 45.879\n", - "call 69 ended 46.022; waiting time was 1.730\n", - "call arrives at: 46.298\n", - "operator answered call 75 at 46.298\n", - "call 67 ended 46.543; waiting time was 1.930\n", - "call arrives at: 46.941\n", - "operator answered call 76 at 46.941\n", - "call 66 ended 47.220; waiting time was 1.937\n", - "call 68 ended 47.321; waiting time was 1.925\n", - "call arrives at: 48.745\n", - "operator answered call 77 at 48.745\n", - "call arrives at: 48.858\n", - "operator answered call 78 at 48.858\n", - "call arrives at: 49.048\n", - "operator answered call 79 at 49.048\n", - "call arrives at: 49.575\n", - "operator answered call 80 at 49.575\n", - "call arrives at: 49.704\n", - "operator answered call 81 at 49.704\n", - "call 70 ended 50.170; waiting time was 0.000\n", - "call arrives at: 51.354\n", - "operator answered call 82 at 51.354\n", - "call arrives at: 51.714\n", - "operator answered call 83 at 51.714\n", - "call arrives at: 52.099\n", - "call arrives at: 52.384\n", - "call 73 ended 52.494; waiting time was 0.000\n", - "operator answered call 84 at 52.494\n", - "call arrives at: 52.555\n", - "call 71 ended 53.003; waiting time was 0.000\n", - "operator answered call 85 at 53.003\n", - "call 72 ended 53.055; waiting time was 0.000\n", - "operator answered call 86 at 53.055\n", - "call 75 ended 53.090; waiting time was 0.000\n", - "call arrives at: 53.407\n", - "operator answered call 87 at 53.407\n", - "call arrives at: 53.616\n", - "call 74 ended 53.774; waiting time was 0.000\n", - "operator answered call 88 at 53.774\n", - "call arrives at: 53.813\n", - "call 76 ended 53.864; waiting time was 0.000\n", - "operator answered call 89 at 53.864\n", - "call arrives at: 54.082\n", - "call arrives at: 54.273\n", - "call 78 ended 54.580; waiting time was 0.000\n", - "operator answered call 90 at 54.580\n", - "call 79 ended 54.764; waiting time was 0.000\n", - "operator answered call 91 at 54.764\n", - "call arrives at: 54.823\n", - "call 77 ended 55.132; waiting time was 0.000\n", - "operator answered call 92 at 55.132\n", - "call arrives at: 55.251\n", - "call 80 ended 55.595; waiting time was 0.000\n", - "operator answered call 93 at 55.595\n", - "call 81 ended 57.123; waiting time was 0.000\n", - "call arrives at: 57.127\n", - "operator answered call 94 at 57.127\n", - "call 83 ended 58.207; waiting time was 0.000\n", - "call 82 ended 58.473; waiting time was 0.000\n", - "call arrives at: 58.556\n", - "operator answered call 95 at 58.556\n", - "call 86 ended 59.024; waiting time was 0.499\n", - "call arrives at: 59.128\n", - "operator answered call 96 at 59.128\n", - "call 85 ended 59.482; waiting time was 0.620\n", - "call arrives at: 59.625\n", - "operator answered call 97 at 59.625\n", - "call 84 ended 59.696; waiting time was 0.394\n", - "call 89 ended 60.185; waiting time was 0.051\n", - "call arrives at: 60.423\n", - "operator answered call 98 at 60.423\n", - "call arrives at: 60.620\n", - "operator answered call 99 at 60.620\n", - "call arrives at: 60.847\n", - "operator answered call 100 at 60.847\n", - "call 88 ended 61.089; waiting time was 0.158\n", - "call 93 ended 61.603; waiting time was 0.344\n", - "call arrives at: 61.845\n", - "operator answered call 101 at 61.845\n", - "call 87 ended 62.168; waiting time was 0.000\n", - "call arrives at: 62.747\n", - "operator answered call 102 at 62.747\n", - "call 91 ended 62.858; waiting time was 0.491\n", - "call arrives at: 62.920\n", - "operator answered call 103 at 62.920\n", - "call 94 ended 63.226; waiting time was 0.000\n", - "call 90 ended 63.580; waiting time was 0.497\n", - "call 92 ended 63.593; waiting time was 0.309\n", - "call arrives at: 64.007\n", - "operator answered call 104 at 64.007\n", - "call arrives at: 65.355\n", - "operator answered call 105 at 65.355\n", - "call arrives at: 65.900\n", - "operator answered call 106 at 65.900\n", - "call 96 ended 66.377; waiting time was 0.000\n", - "call 95 ended 66.500; waiting time was 0.000\n", - "call arrives at: 66.636\n", - "operator answered call 107 at 66.636\n", - "call 97 ended 66.838; waiting time was 0.000\n", - "call arrives at: 66.848\n", - "operator answered call 108 at 66.848\n", - "call 101 ended 67.354; waiting time was 0.000\n", - "call 99 ended 67.490; waiting time was 0.000\n", - "call arrives at: 67.734\n", - "operator answered call 109 at 67.734\n", - "call arrives at: 67.827\n", - "operator answered call 110 at 67.827\n", - "call 100 ended 67.866; waiting time was 0.000\n", - "call 98 ended 68.106; waiting time was 0.000\n", - "call arrives at: 69.074\n", - "operator answered call 111 at 69.074\n", - "call arrives at: 69.164\n", - "operator answered call 112 at 69.164\n", - "call arrives at: 69.475\n", - "operator answered call 113 at 69.475\n", - "call arrives at: 70.342\n", - "operator answered call 114 at 70.342\n", - "call arrives at: 70.556\n", - "call arrives at: 70.590\n", - "call 102 ended 70.632; waiting time was 0.000\n", - "operator answered call 115 at 70.632\n", - "call 103 ended 70.798; waiting time was 0.000\n", - "operator answered call 116 at 70.798\n", - "call arrives at: 70.817\n", - "call arrives at: 71.070\n", - "call 104 ended 71.420; waiting time was 0.000\n", - "operator answered call 117 at 71.420\n", - "call arrives at: 71.984\n", - "call arrives at: 72.655\n", - "call arrives at: 73.376\n", - "call arrives at: 73.416\n", - "call 105 ended 73.470; waiting time was 0.000\n", - "operator answered call 118 at 73.470\n", - "call arrives at: 73.801\n", - "call 108 ended 74.084; waiting time was 0.000\n", - "operator answered call 119 at 74.084\n", - "call 106 ended 74.745; waiting time was 0.000\n", - "operator answered call 120 at 74.745\n", - "call 110 ended 74.841; waiting time was 0.000\n", - "operator answered call 121 at 74.841\n", - "call 111 ended 75.468; waiting time was 0.000\n", - "operator answered call 122 at 75.468\n", - "call arrives at: 75.636\n", - "call arrives at: 75.940\n", - "call arrives at: 76.034\n", - "call 113 ended 76.168; waiting time was 0.000\n", - "operator answered call 123 at 76.168\n", - "call arrives at: 76.549\n", - "call 107 ended 76.572; waiting time was 0.000\n", - "operator answered call 124 at 76.572\n", - "call 115 ended 76.731; waiting time was 0.076\n", - "operator answered call 125 at 76.731\n", - "call 114 ended 76.767; waiting time was 0.000\n", - "operator answered call 126 at 76.767\n", - "call 109 ended 76.828; waiting time was 0.000\n", - "operator answered call 127 at 76.828\n", - "call 116 ended 77.463; waiting time was 0.209\n", - "call 112 ended 77.463; waiting time was 0.000\n", - "call arrives at: 79.358\n", - "operator answered call 128 at 79.358\n", - "call 117 ended 79.402; waiting time was 0.603\n", - "call arrives at: 79.411\n", - "operator answered call 129 at 79.411\n", - "call arrives at: 79.454\n", - "operator answered call 130 at 79.454\n", - "call arrives at: 79.811\n", - "call 119 ended 80.589; waiting time was 2.100\n", - "operator answered call 131 at 80.589\n", - "call arrives at: 81.321\n", - "call 118 ended 81.559; waiting time was 2.400\n", - "operator answered call 132 at 81.559\n", - "call arrives at: 81.825\n", - "call 121 ended 81.830; waiting time was 1.465\n", - "operator answered call 133 at 81.830\n", - "call 120 ended 81.964; waiting time was 2.090\n", - "call 123 ended 81.999; waiting time was 2.367\n", - "call arrives at: 82.003\n", - "operator answered call 134 at 82.003\n", - "call arrives at: 82.116\n", - "operator answered call 135 at 82.116\n", - "call arrives at: 82.523\n", - "call arrives at: 82.630\n", - "call 122 ended 82.865; waiting time was 2.052\n", - "operator answered call 136 at 82.865\n", - "call arrives at: 82.907\n", - "call arrives at: 83.197\n", - "call arrives at: 83.256\n", - "call 125 ended 83.567; waiting time was 0.791\n", - "operator answered call 137 at 83.567\n", - "call arrives at: 83.967\n", - "call arrives at: 84.118\n", - "call arrives at: 84.364\n", - "call 124 ended 84.923; waiting time was 0.936\n", - "operator answered call 138 at 84.923\n", - "call 130 ended 85.218; waiting time was 0.000\n", - "operator answered call 139 at 85.218\n", - "call arrives at: 85.266\n", - "call arrives at: 85.442\n", - "call arrives at: 85.507\n", - "call 127 ended 85.547; waiting time was 0.279\n", - "operator answered call 140 at 85.547\n", - "call arrives at: 85.788\n", - "call 126 ended 86.016; waiting time was 0.733\n", - "operator answered call 141 at 86.016\n", - "call 129 ended 86.177; waiting time was 0.000\n", - "operator answered call 142 at 86.177\n", - "call 131 ended 86.360; waiting time was 0.778\n", - "operator answered call 143 at 86.360\n", - "call arrives at: 86.581\n", - "call arrives at: 86.696\n", - "call 133 ended 87.932; waiting time was 0.005\n", - "operator answered call 144 at 87.932\n", - "call 128 ended 87.986; waiting time was 0.000\n", - "operator answered call 145 at 87.986\n", - "call arrives at: 88.040\n", - "call arrives at: 88.058\n", - "call arrives at: 88.084\n", - "call arrives at: 88.211\n", - "call 135 ended 89.026; waiting time was 0.000\n", - "operator answered call 146 at 89.026\n", - "call 136 ended 89.520; waiting time was 0.342\n", - "operator answered call 147 at 89.520\n", - "call 137 ended 89.638; waiting time was 0.937\n", - "operator answered call 148 at 89.638\n", - "call 134 ended 90.154; waiting time was 0.000\n", - "operator answered call 149 at 90.154\n", - "call 132 ended 90.851; waiting time was 0.239\n", - "operator answered call 150 at 90.851\n", - "call arrives at: 91.257\n", - "call 141 ended 91.852; waiting time was 2.049\n", - "operator answered call 151 at 91.852\n", - "call arrives at: 91.945\n", - "call arrives at: 92.388\n", - "call 140 ended 92.393; waiting time was 2.291\n", - "operator answered call 152 at 92.393\n", - "call arrives at: 92.569\n", - "call arrives at: 92.710\n", - "call arrives at: 93.035\n", - "call arrives at: 93.133\n", - "call arrives at: 93.255\n", - "call 139 ended 93.277; waiting time was 2.021\n", - "operator answered call 153 at 93.277\n", - "call 138 ended 93.568; waiting time was 2.016\n", - "operator answered call 154 at 93.568\n", - "call arrives at: 93.950\n", - "call 144 ended 94.525; waiting time was 2.667\n", - "operator answered call 155 at 94.525\n", - "call arrives at: 94.727\n", - "call arrives at: 95.074\n", - "call 143 ended 95.306; waiting time was 1.996\n", - "operator answered call 156 at 95.306\n", - "call arrives at: 95.388\n", - "call 145 ended 95.561; waiting time was 2.545\n", - "operator answered call 157 at 95.561\n", - "call arrives at: 95.613\n", - "call 142 ended 95.641; waiting time was 2.059\n", - "operator answered call 158 at 95.641\n", - "call 148 ended 95.658; waiting time was 3.057\n", - "operator answered call 159 at 95.658\n", - "call arrives at: 95.720\n", - "call 146 ended 96.400; waiting time was 3.518\n", - "operator answered call 160 at 96.400\n", - "call 149 ended 96.820; waiting time was 3.458\n", - "operator answered call 161 at 96.820\n", - "call arrives at: 97.002\n", - "call arrives at: 97.390\n", - "call 150 ended 97.678; waiting time was 2.811\n", - "operator answered call 162 at 97.678\n", - "call arrives at: 97.921\n", - "call 152 ended 98.333; waiting time was 4.310\n", - "operator answered call 163 at 98.333\n", - "call arrives at: 98.416\n", - "call 147 ended 99.069; waiting time was 3.732\n", - "operator answered call 164 at 99.069\n", - "call arrives at: 99.130\n", - "call arrives at: 99.659\n", - "call 151 ended 99.777; waiting time was 3.794\n", - "operator answered call 165 at 99.777\n", + "call arrives at: 0.031\n", + "operator answered call 1 at 0.031\n", + "call arrives at: 1.651\n", + "operator answered call 2 at 1.651\n", + "call arrives at: 2.135\n", + "operator answered call 3 at 2.135\n", + "call arrives at: 2.161\n", + "operator answered call 4 at 2.161\n", + "call arrives at: 2.693\n", + "operator answered call 5 at 2.693\n", + "call arrives at: 4.102\n", + "operator answered call 6 at 4.102\n", + "call arrives at: 4.718\n", + "operator answered call 7 at 4.718\n", + "call arrives at: 5.552\n", + "operator answered call 8 at 5.552\n", + "call arrives at: 5.685\n", + "operator answered call 9 at 5.685\n", + "call arrives at: 5.784\n", + "operator answered call 10 at 5.784\n", + "call arrives at: 5.846\n", + "operator answered call 11 at 5.846\n", + "call arrives at: 5.993\n", + "operator answered call 12 at 5.993\n", + "call arrives at: 6.241\n", + "operator answered call 13 at 6.241\n", + "call 1 ended 6.273; waiting time was 0.000\n", + "call arrives at: 6.628\n", + "operator answered call 14 at 6.628\n", + "call arrives at: 6.954\n", + "call arrives at: 7.788\n", + "call arrives at: 7.992\n", + "call arrives at: 8.269\n", + "call 2 ended 8.492; waiting time was 0.000\n", + "operator answered call 15 at 8.492\n", + "call 4 ended 8.561; waiting time was 0.000\n", + "operator answered call 16 at 8.561\n", + "call arrives at: 8.721\n", + "call 5 ended 9.352; waiting time was 0.000\n", + "operator answered call 17 at 9.352\n", + "call arrives at: 10.711\n", + "call 6 ended 10.813; waiting time was 0.000\n", + "operator answered call 18 at 10.813\n", + "call arrives at: 11.327\n", + "call 3 ended 11.728; waiting time was 0.000\n", + "operator answered call 19 at 11.728\n", + "call arrives at: 11.862\n", + "call arrives at: 11.948\n", + "call 8 ended 12.087; waiting time was 0.000\n", + "operator answered call 20 at 12.087\n", + "call 14 ended 12.582; waiting time was 0.000\n", + "operator answered call 21 at 12.582\n", + "call arrives at: 12.684\n", + "call arrives at: 12.963\n", + "call arrives at: 13.264\n", + "call arrives at: 13.291\n", + "call 7 ended 13.321; waiting time was 0.000\n", + "operator answered call 22 at 13.321\n", + "call arrives at: 13.347\n", + "call arrives at: 13.540\n", + "call arrives at: 13.647\n", + "call 9 ended 13.964; waiting time was 0.000\n", + "operator answered call 23 at 13.964\n", + "call 10 ended 14.080; waiting time was 0.000\n", + "operator answered call 24 at 14.080\n", + "call arrives at: 14.119\n", + "call 13 ended 14.146; waiting time was 0.000\n", + "operator answered call 25 at 14.146\n", + "call 15 ended 14.272; waiting time was 1.538\n", + "operator answered call 26 at 14.272\n", + "call 12 ended 14.380; waiting time was 0.000\n", + "operator answered call 27 at 14.380\n", + "call arrives at: 14.477\n", + "call 11 ended 14.744; waiting time was 0.000\n", + "operator answered call 28 at 14.744\n", + "call arrives at: 15.692\n", + "call arrives at: 15.784\n", + "call arrives at: 15.990\n", + "call arrives at: 16.988\n", + "call 16 ended 17.123; waiting time was 0.773\n", + "operator answered call 29 at 17.123\n", + "call 18 ended 17.316; waiting time was 2.544\n", + "operator answered call 30 at 17.316\n", + "call arrives at: 17.460\n", + "call arrives at: 17.713\n", + "call arrives at: 17.780\n", + "call 17 ended 18.248; waiting time was 1.360\n", + "operator answered call 31 at 18.248\n", + "call 20 ended 18.353; waiting time was 1.376\n", + "operator answered call 32 at 18.353\n", + "call 19 ended 18.361; waiting time was 3.008\n", + "operator answered call 33 at 18.361\n", + "call arrives at: 18.984\n", + "call 22 ended 19.364; waiting time was 1.459\n", + "operator answered call 34 at 19.364\n", + "call 21 ended 19.532; waiting time was 1.254\n", + "operator answered call 35 at 19.532\n", + "call arrives at: 19.714\n", + "call 25 ended 19.867; waiting time was 1.184\n", + "operator answered call 36 at 19.867\n", + "call arrives at: 20.438\n", + "call 27 ended 20.818; waiting time was 1.089\n", + "operator answered call 37 at 20.818\n", + "call 23 ended 20.852; waiting time was 2.016\n", + "operator answered call 38 at 20.852\n", + "call 26 ended 21.500; waiting time was 1.008\n", + "operator answered call 39 at 21.500\n", + "call arrives at: 21.613\n", + "call arrives at: 22.568\n", + "call 28 ended 22.637; waiting time was 1.397\n", + "operator answered call 40 at 22.637\n", + "call arrives at: 22.676\n", + "call arrives at: 23.358\n", + "call 24 ended 23.428; waiting time was 1.396\n", + "operator answered call 41 at 23.428\n", + "call arrives at: 23.644\n", + "call arrives at: 23.662\n", + "call 31 ended 24.168; waiting time was 4.129\n", + "operator answered call 42 at 24.168\n", + "call arrives at: 24.519\n", + "call 30 ended 24.529; waiting time was 3.669\n", + "operator answered call 43 at 24.529\n", + "call arrives at: 24.705\n", + "call 29 ended 25.823; waiting time was 3.583\n", + "operator answered call 44 at 25.823\n", + "call arrives at: 26.130\n", + "call arrives at: 26.427\n", + "call arrives at: 26.487\n", + "call 33 ended 26.490; waiting time was 2.668\n", + "operator answered call 45 at 26.490\n", + "call 36 ended 26.770; waiting time was 2.879\n", + "operator answered call 46 at 26.770\n", + "call 35 ended 26.793; waiting time was 3.541\n", + "operator answered call 47 at 26.793\n", + "call 34 ended 26.943; waiting time was 3.580\n", + "operator answered call 48 at 26.943\n", + "call 32 ended 27.043; waiting time was 3.876\n", + "operator answered call 49 at 27.043\n", + "call arrives at: 27.090\n", + "call arrives at: 27.104\n", + "call arrives at: 27.379\n", + "call arrives at: 27.536\n", + "call arrives at: 27.705\n", + "call 39 ended 27.980; waiting time was 3.720\n", + "operator answered call 50 at 27.980\n", + "call arrives at: 28.294\n", + "call 38 ended 28.578; waiting time was 3.139\n", + "operator answered call 51 at 28.578\n", + "call arrives at: 28.656\n", + "call arrives at: 28.769\n", + "call 37 ended 29.102; waiting time was 3.358\n", + "operator answered call 52 at 29.102\n", + "call arrives at: 29.310\n", + "call 40 ended 29.445; waiting time was 3.653\n", + "operator answered call 53 at 29.445\n", + "call 43 ended 30.524; waiting time was 2.916\n", + "operator answered call 54 at 30.524\n", + "call arrives at: 30.683\n", + "call arrives at: 30.970\n", + "call 41 ended 31.260; waiting time was 3.714\n", + "operator answered call 55 at 31.260\n", + "call arrives at: 31.763\n", + "call arrives at: 31.985\n", + "call arrives at: 32.126\n", + "call arrives at: 32.314\n", + "call arrives at: 32.606\n", + "call arrives at: 32.683\n", + "call 48 ended 32.856; waiting time was 3.281\n", + "operator answered call 56 at 32.856\n", + "call arrives at: 32.858\n", + "call 46 ended 32.917; waiting time was 3.412\n", + "operator answered call 57 at 32.917\n", + "call 42 ended 32.953; waiting time was 3.729\n", + "operator answered call 58 at 32.953\n", + "call 47 ended 33.367; waiting time was 3.149\n", + "operator answered call 59 at 33.367\n", + "call 49 ended 34.024; waiting time was 2.524\n", + "operator answered call 60 at 34.024\n", + "call 44 ended 34.574; waiting time was 3.255\n", + "operator answered call 61 at 34.574\n", + "call 45 ended 34.903; waiting time was 3.814\n", + "operator answered call 62 at 34.903\n", + "call 51 ended 35.230; waiting time was 2.448\n", + "operator answered call 63 at 35.230\n", + "call arrives at: 35.321\n", + "call 50 ended 35.503; waiting time was 3.275\n", + "operator answered call 64 at 35.503\n", + "call 53 ended 36.306; waiting time was 2.958\n", + "operator answered call 65 at 36.306\n", + "call arrives at: 36.856\n", + "call arrives at: 36.966\n", + "call arrives at: 36.988\n", + "call 54 ended 37.041; waiting time was 3.434\n", + "operator answered call 66 at 37.041\n", + "call 52 ended 37.060; waiting time was 2.675\n", + "operator answered call 67 at 37.060\n", + "call arrives at: 37.402\n", + "call 55 ended 37.916; waiting time was 4.156\n", + "operator answered call 68 at 37.916\n", + "call arrives at: 39.440\n", + "call 56 ended 39.802; waiting time was 5.477\n", + "operator answered call 69 at 39.802\n", + "call 58 ended 39.848; waiting time was 5.248\n", + "operator answered call 70 at 39.848\n", + "call 59 ended 39.913; waiting time was 5.073\n", + "operator answered call 71 at 39.913\n", + "call arrives at: 40.394\n", + "call 57 ended 40.696; waiting time was 5.381\n", + "operator answered call 72 at 40.696\n", + "call arrives at: 40.771\n", + "call arrives at: 40.869\n", + "call 62 ended 41.052; waiting time was 5.593\n", + "operator answered call 73 at 41.052\n", + "call arrives at: 41.171\n", + "call arrives at: 41.359\n", + "call 60 ended 41.575; waiting time was 5.368\n", + "operator answered call 74 at 41.575\n", + "call 61 ended 42.206; waiting time was 5.805\n", + "operator answered call 75 at 42.206\n", + "call 65 ended 42.914; waiting time was 4.543\n", + "operator answered call 76 at 42.914\n", + "call 64 ended 43.146; waiting time was 4.533\n", + "operator answered call 77 at 43.146\n", + "call 66 ended 43.534; waiting time was 5.056\n", + "operator answered call 78 at 43.534\n", + "call arrives at: 43.682\n", + "call arrives at: 43.883\n", + "call 63 ended 44.605; waiting time was 4.548\n", + "operator answered call 79 at 44.605\n", + "call arrives at: 44.816\n", + "call arrives at: 44.968\n", + "call arrives at: 45.174\n", + "call 68 ended 45.295; waiting time was 5.602\n", + "operator answered call 80 at 45.295\n", + "call arrives at: 46.170\n", + "call 67 ended 46.809; waiting time was 4.934\n", + "operator answered call 81 at 46.809\n", + "call 73 ended 47.161; waiting time was 4.196\n", + "operator answered call 82 at 47.161\n", + "call 71 ended 47.334; waiting time was 7.055\n", + "operator answered call 83 at 47.334\n", + "call 70 ended 47.598; waiting time was 7.164\n", + "operator answered call 84 at 47.598\n", + "call arrives at: 47.713\n", + "call 69 ended 48.256; waiting time was 7.196\n", + "operator answered call 85 at 48.256\n", + "call 74 ended 48.453; waiting time was 4.609\n", + "operator answered call 86 at 48.453\n", + "call 75 ended 48.888; waiting time was 5.218\n", + "operator answered call 87 at 48.888\n", + "call 72 ended 49.146; waiting time was 5.375\n", + "operator answered call 88 at 49.146\n", + "call 78 ended 49.232; waiting time was 3.140\n", + "operator answered call 89 at 49.232\n", + "call arrives at: 49.959\n", + "call 76 ended 50.125; waiting time was 5.513\n", + "operator answered call 90 at 50.125\n", + "call 77 ended 50.297; waiting time was 3.705\n", + "call arrives at: 50.416\n", + "operator answered call 91 at 50.416\n", + "call 79 ended 51.472; waiting time was 3.834\n", + "call arrives at: 51.578\n", + "operator answered call 92 at 51.578\n", + "call arrives at: 51.849\n", + "call arrives at: 52.277\n", + "call arrives at: 52.370\n", + "call arrives at: 52.416\n", + "call 81 ended 52.632; waiting time was 5.639\n", + "operator answered call 93 at 52.632\n", + "call 80 ended 52.757; waiting time was 4.427\n", + "operator answered call 94 at 52.757\n", + "call 83 ended 53.158; waiting time was 3.652\n", + "operator answered call 95 at 53.158\n", + "call arrives at: 53.357\n", + "call arrives at: 53.864\n", + "call 82 ended 54.508; waiting time was 5.802\n", + "operator answered call 96 at 54.508\n", + "call arrives at: 54.859\n", + "call 85 ended 54.878; waiting time was 3.440\n", + "operator answered call 97 at 54.878\n", + "call 84 ended 55.159; waiting time was 3.715\n", + "operator answered call 98 at 55.159\n", + "call arrives at: 55.443\n", + "call arrives at: 55.532\n", + "call arrives at: 55.629\n", + "call 86 ended 55.838; waiting time was 3.485\n", + "operator answered call 99 at 55.838\n", + "call 88 ended 55.966; waiting time was 2.975\n", + "operator answered call 100 at 55.966\n", + "call 89 ended 56.856; waiting time was 1.519\n", + "operator answered call 101 at 56.856\n", + "call arrives at: 57.009\n", + "call 87 ended 57.054; waiting time was 3.714\n", + "operator answered call 102 at 57.054\n", + "call arrives at: 57.068\n", + "call arrives at: 57.742\n", + "call 93 ended 57.831; waiting time was 0.783\n", + "operator answered call 103 at 57.831\n", + "call arrives at: 58.076\n", + "call 90 ended 58.463; waiting time was 0.166\n", + "operator answered call 104 at 58.463\n", + "call arrives at: 59.109\n", + "call 91 ended 59.479; waiting time was 0.000\n", + "operator answered call 105 at 59.479\n", + "call 94 ended 59.821; waiting time was 0.480\n", + "operator answered call 106 at 59.821\n", + "call 92 ended 60.301; waiting time was 0.000\n", + "operator answered call 107 at 60.301\n", + "call arrives at: 60.395\n", + "call arrives at: 61.772\n", + "call 95 ended 61.859; waiting time was 0.788\n", + "operator answered call 108 at 61.859\n", + "call arrives at: 62.347\n", + "call arrives at: 63.197\n", + "call 98 ended 63.213; waiting time was 1.295\n", + "operator answered call 109 at 63.213\n", + "call 97 ended 63.219; waiting time was 1.521\n", + "operator answered call 110 at 63.219\n", + "call 96 ended 63.239; waiting time was 2.093\n", + "operator answered call 111 at 63.239\n", + "call arrives at: 63.520\n", + "call arrives at: 63.578\n", + "call 101 ended 63.599; waiting time was 1.325\n", + "operator answered call 112 at 63.599\n", + "call 102 ended 63.651; waiting time was 1.425\n", + "operator answered call 113 at 63.651\n", + "call 100 ended 63.692; waiting time was 0.523\n", + "call 103 ended 63.926; waiting time was 0.821\n", + "call 99 ended 63.930; waiting time was 0.979\n", + "call arrives at: 64.909\n", + "operator answered call 114 at 64.909\n", + "call arrives at: 65.926\n", + "operator answered call 115 at 65.926\n", + "call 106 ended 66.302; waiting time was 1.745\n", + "call arrives at: 66.414\n", + "operator answered call 116 at 66.414\n", + "call 104 ended 66.426; waiting time was 1.395\n", + "call arrives at: 66.570\n", + "operator answered call 117 at 66.570\n", + "call 107 ended 66.652; waiting time was 1.192\n", + "call arrives at: 66.898\n", + "operator answered call 118 at 66.898\n", + "call 108 ended 67.422; waiting time was 1.465\n", + "call 105 ended 67.793; waiting time was 1.737\n", + "call arrives at: 68.601\n", + "operator answered call 119 at 68.601\n", + "call 113 ended 69.411; waiting time was 0.074\n", + "call arrives at: 69.943\n", + "operator answered call 120 at 69.943\n", + "call arrives at: 70.004\n", + "operator answered call 121 at 70.004\n", + "call 111 ended 70.283; waiting time was 0.042\n", + "call arrives at: 70.333\n", + "operator answered call 122 at 70.333\n", + "call 109 ended 70.363; waiting time was 1.440\n", + "call arrives at: 70.622\n", + "operator answered call 123 at 70.622\n", + "call arrives at: 71.394\n", + "operator answered call 124 at 71.394\n", + "call 114 ended 71.783; waiting time was 0.000\n", + "call 110 ended 71.819; waiting time was 0.871\n", + "call arrives at: 71.880\n", + "operator answered call 125 at 71.880\n", + "call 112 ended 72.713; waiting time was 0.079\n", + "call 117 ended 73.082; waiting time was 0.000\n", + "call 115 ended 73.103; waiting time was 0.000\n", + "call arrives at: 73.469\n", + "operator answered call 126 at 73.469\n", + "call 116 ended 73.692; waiting time was 0.000\n", + "call arrives at: 73.697\n", + "operator answered call 127 at 73.697\n", + "call arrives at: 73.819\n", + "operator answered call 128 at 73.819\n", + "call arrives at: 74.670\n", + "operator answered call 129 at 74.670\n", + "call arrives at: 75.038\n", + "operator answered call 130 at 75.038\n", + "call 119 ended 76.040; waiting time was 0.000\n", + "call arrives at: 76.191\n", + "operator answered call 131 at 76.191\n", + "call 118 ended 76.222; waiting time was 0.000\n", + "call arrives at: 76.341\n", + "operator answered call 132 at 76.341\n", + "call arrives at: 76.510\n", + "call arrives at: 76.565\n", + "call arrives at: 76.758\n", + "call arrives at: 77.288\n", + "call 122 ended 77.429; waiting time was 0.000\n", + "operator answered call 133 at 77.429\n", + "call 121 ended 77.555; waiting time was 0.000\n", + "operator answered call 134 at 77.555\n", + "call 124 ended 77.661; waiting time was 0.000\n", + "operator answered call 135 at 77.661\n", + "call 120 ended 77.981; waiting time was 0.000\n", + "operator answered call 136 at 77.981\n", + "call arrives at: 78.469\n", + "call 125 ended 78.593; waiting time was 0.000\n", + "operator answered call 137 at 78.593\n", + "call arrives at: 78.706\n", + "call 123 ended 79.523; waiting time was 0.000\n", + "operator answered call 138 at 79.523\n", + "call arrives at: 79.707\n", + "call 126 ended 80.603; waiting time was 0.000\n", + "operator answered call 139 at 80.603\n", + "call arrives at: 81.189\n", + "call 127 ended 81.447; waiting time was 0.000\n", + "operator answered call 140 at 81.447\n", + "call arrives at: 81.465\n", + "call 128 ended 82.283; waiting time was 0.000\n", + "operator answered call 141 at 82.283\n", + "call 132 ended 82.295; waiting time was 0.000\n", + "call 130 ended 82.517; waiting time was 0.000\n", + "call 129 ended 82.931; waiting time was 0.000\n", + "call arrives at: 83.290\n", + "operator answered call 142 at 83.290\n", + "call 131 ended 83.301; waiting time was 0.000\n", + "call arrives at: 83.446\n", + "operator answered call 143 at 83.446\n", + "call 134 ended 83.553; waiting time was 0.991\n", + "call 133 ended 83.572; waiting time was 0.919\n", + "call arrives at: 83.611\n", + "operator answered call 144 at 83.611\n", + "call arrives at: 84.313\n", + "operator answered call 145 at 84.313\n", + "call arrives at: 84.509\n", + "operator answered call 146 at 84.509\n", + "call arrives at: 85.094\n", + "operator answered call 147 at 85.094\n", + "call 136 ended 85.443; waiting time was 0.693\n", + "call 137 ended 85.997; waiting time was 0.124\n", + "call 135 ended 86.004; waiting time was 0.902\n", + "call 138 ended 86.044; waiting time was 0.817\n", + "call arrives at: 86.659\n", + "operator answered call 148 at 86.659\n", + "call 139 ended 87.021; waiting time was 0.896\n", + "call arrives at: 87.771\n", + "operator answered call 149 at 87.771\n", + "call 140 ended 88.005; waiting time was 0.258\n", + "call arrives at: 88.073\n", + "operator answered call 150 at 88.073\n", + "call arrives at: 88.207\n", + "operator answered call 151 at 88.207\n", + "call 141 ended 88.496; waiting time was 0.818\n", + "call 142 ended 89.340; waiting time was 0.000\n", + "call 146 ended 90.481; waiting time was 0.000\n", + "call arrives at: 90.607\n", + "operator answered call 152 at 90.607\n", + "call 145 ended 91.119; waiting time was 0.000\n", + "call arrives at: 91.611\n", + "operator answered call 153 at 91.611\n", + "call arrives at: 91.656\n", + "operator answered call 154 at 91.656\n", + "call 147 ended 92.001; waiting time was 0.000\n", + "call 144 ended 92.333; waiting time was 0.000\n", + "call 143 ended 92.487; waiting time was 0.000\n", + "call arrives at: 93.043\n", + "operator answered call 155 at 93.043\n", + "call 148 ended 93.300; waiting time was 0.000\n", + "call arrives at: 93.608\n", + "operator answered call 156 at 93.608\n", + "call arrives at: 93.734\n", + "operator answered call 157 at 93.734\n", + "call 151 ended 94.108; waiting time was 0.000\n", + "call arrives at: 94.627\n", + "operator answered call 158 at 94.627\n", + "call arrives at: 94.738\n", + "operator answered call 159 at 94.738\n", + "call arrives at: 94.786\n", + "operator answered call 160 at 94.786\n", + "call 150 ended 95.543; waiting time was 0.000\n", + "call 149 ended 95.721; waiting time was 0.000\n", + "call arrives at: 96.442\n", + "operator answered call 161 at 96.442\n", + "call arrives at: 96.850\n", + "operator answered call 162 at 96.850\n", + "call arrives at: 97.092\n", + "operator answered call 163 at 97.092\n", + "call 152 ended 97.931; waiting time was 0.000\n", + "call arrives at: 97.995\n", + "operator answered call 164 at 97.995\n", + "call arrives at: 98.272\n", + "operator answered call 165 at 98.272\n", + "call 154 ended 98.699; waiting time was 0.000\n", + "call 153 ended 99.719; waiting time was 0.000\n", "end of run. simulation clock time = 100\n" ] } @@ -741,7 +736,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.6" + "version": "3.11.10" } }, "nbformat": 4, diff --git a/paper/introductory_foss_sim_tutorial_paper.zip b/paper/introductory_foss_sim_tutorial_paper.zip new file mode 100644 index 0000000..b7cf426 Binary files /dev/null and b/paper/introductory_foss_sim_tutorial_paper.zip differ