{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Common Queuing Disciplines" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparing FIFO, LIFO, and SIRO" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# for random distributions, random number generators, statistics\n", "import random\n", "import numpy as np\n", "import scipy.stats as stats\n", "\n", "# for simulation\n", "import simulus\n", "\n", "# for data visualization\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "\n", "# for animation inside the notebook\n", "import ipywidgets as widgets\n", "from ipywidgets import interact" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def exp_generator(mean, seed):\n", " rv = stats.expon(scale=mean)\n", " rv.random_state = np.random.RandomState(seed)\n", " while True:\n", " # 100 random numbers as a batch\n", " for x in rv.rvs(100):\n", " yield x\n", "\n", "def truncnorm_generator(a, b, seed):\n", " rv = stats.truncnorm(a, b)\n", " rv.random_state = np.random.RandomState(seed)\n", " while True:\n", " # 100 random numbers as a batch\n", " for x in rv.rvs(100):\n", " yield x" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def gen_arrivals():\n", " while True:\n", " sim.sleep(next(inter_arrival_time))\n", " sim.process(customer)\n", "\n", "def customer():\n", " server.acquire()\n", " sim.sleep(next(service_time))\n", " server.release()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def sim_run(qdis):\n", " global sim, inter_arrival_time, service_time, server\n", " sim = simulus.simulator()\n", " inter_arrival_time = exp_generator(1.2, sim.rng().randrange(2**32))\n", " service_time = truncnorm_generator(0.8, 1.6, sim.rng().randrange(2**32))\n", " dc = simulus.DataCollector(system_times='dataseries(all)')\n", " server = sim.resource(collect=dc, qdis=qdis)\n", " sim.process(gen_arrivals)\n", " sim.run(50000)\n", " return np.array(dc.system_times.data())" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "mean wait time:\n", " FIFO: mean=10.1907, stdev=8.73543\n", " LIFO: mean=10.346, stdev=49.0148\n", " SIRO: mean=11.2126, stdev=16.5914\n" ] } ], "source": [ "random.seed(13579) # global random seed\n", "\n", "print('mean wait time:')\n", "w1 = sim_run(simulus.QDIS.FIFO)\n", "print(' FIFO: mean=%g, stdev=%g' % (w1.mean(), w1.std()))\n", "w2 = sim_run(simulus.QDIS.LIFO)\n", "print(' LIFO: mean=%g, stdev=%g' % (w2.mean(), w2.std()))\n", "w3 = sim_run(simulus.QDIS.SIRO)\n", "print(' SIRO: mean=%g, stdev=%g' % (w3.mean(), w3.std()))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "y1, binEdges = np.histogram(w1, bins='auto', density=True)\n", "y2, _ = np.histogram(w2, bins=binEdges, density=True)\n", "y3, _ = np.histogram(w3, bins=binEdges, density=True)\n", "bincenters = 0.5*(binEdges[1:]+binEdges[:-1])\n", "binsize = binEdges[1]-binEdges[0]\n", "plt.plot(bincenters, np.cumsum(y1)*binsize, label='FIFO')\n", "plt.plot(bincenters, np.cumsum(y2)*binsize, label='LIFO')\n", "plt.plot(bincenters, np.cumsum(y3)*binsize, label='SIRO')\n", "plt.xlim(0,bincenters[-1])\n", "plt.ylim(0,1)\n", "plt.xlabel('customer wait time')\n", "plt.ylabel('cumulative probability')\n", "plt.legend(loc='lower right')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Static Priority without Preemption" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def gen_arrivals():\n", " while True:\n", " sim.sleep(next(inter_arrival_time))\n", " priority = sim.rng().randrange(2)\n", " sim.process(customer, priority, prio=priority)\n", "\n", "def customer(priority):\n", " t = sim.now\n", " server.acquire()\n", " sim.sleep(next(service_time))\n", " server.release()\n", " if priority>0: \n", " low_waits.append(sim.now-t)\n", " else:\n", " high_waits.append(sim.now-t)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "def sim_run():\n", " global sim, inter_arrival_time, service_time, server, low_waits, high_waits\n", " sim = simulus.simulator()\n", " inter_arrival_time = exp_generator(1.2, sim.rng().randrange(2**32))\n", " service_time = truncnorm_generator(0, 1.6, sim.rng().randrange(2**32))\n", " dc = simulus.DataCollector(system_times='dataseries(all)')\n", " server = sim.resource(collect=dc, qdis=simulus.QDIS.PRIORITY)\n", " sim.process(gen_arrivals)\n", " low_waits, high_waits = [], []\n", " sim.run(50000)\n", " return np.array(dc.system_times.data()), np.array(low_waits), np.array(high_waits)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "all customers: 41679, wait time: mean=1.19974, stdev=1.27554\n", "low priority customers=20894, wait time: mean=1.41001, stdev=1.64626\n", "high priority customers=20785, wait time: mean=0.988364, stdev=0.670082\n" ] } ], "source": [ "a, b, c = sim_run()\n", "print('all customers: %d, wait time: mean=%g, stdev=%g' % (len(a), a.mean(), a.std()))\n", "print('low priority customers=%d, wait time: mean=%g, stdev=%g' % (len(b), b.mean(), b.std()))\n", "print('high priority customers=%d, wait time: mean=%g, stdev=%g' % (len(c), c.mean(), c.std()))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "y1, binEdges = np.histogram(a, bins='auto', density=True)\n", "y2, _ = np.histogram(b, bins=binEdges, density=True)\n", "y3, _ = np.histogram(c, bins=binEdges, density=True)\n", "bincenters = 0.5*(binEdges[1:]+binEdges[:-1])\n", "binsize = binEdges[1]-binEdges[0]\n", "plt.plot(bincenters, np.cumsum(y1)*binsize, label='all')\n", "plt.plot(bincenters, np.cumsum(y2)*binsize, label='low priority')\n", "plt.plot(bincenters, np.cumsum(y3)*binsize, label='high priority')\n", "plt.xlim(0,10)\n", "plt.ylim(0,1)\n", "plt.legend()\n", "plt.xlabel('customer wait time')\n", "plt.ylabel('cumulative probability')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Dynamic Priority without Preemption" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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": 2 }