{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import collections\n", "import random\n", "\n", "import simpy\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "RANDOM_SEED = 42\n", "TICKETS = 50 # Number of tickets per movie\n", "SIM_TIME = 120 # Simulate until" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Movie renege\n", "Movie \"Python Unchained\" sold out 38.0 minutes after ticket counter opening.\n", " Number of people leaving queue when film sold out: 16\n", "Movie \"Kill Process\" sold out 43.0 minutes after ticket counter opening.\n", " Number of people leaving queue when film sold out: 5\n", "Movie \"Pulp Implementation\" sold out 28.0 minutes after ticket counter opening.\n", " Number of people leaving queue when film sold out: 5\n" ] } ], "source": [ "def moviegoer(env, movie, num_tickets, theater):\n", " with theater.counter.request() as my_turn:\n", " # Wait until its our turn or until the movie is sold out\n", " result = yield my_turn | theater.sold_out[movie] # or 조건\n", "\n", " # Check if it's our turn of if movie is sold out\n", " if my_turn not in result:\n", " theater.num_renegers[movie] += 1\n", " env.exit()\n", "\n", " # Check if enough tickets left.\n", " if theater.available[movie] < num_tickets:\n", " # Moviegoer leaves after some discussion\n", " yield env.timeout(0.5)\n", " env.exit()\n", "\n", " # Buy tickets\n", " theater.available[movie] -= num_tickets\n", " if theater.available[movie] < 2:\n", " # Trigger the \"sold out\" event for the movie\n", " theater.sold_out[movie].succeed()\n", " theater.when_sold_out[movie] = env.now\n", " theater.available[movie] = 0\n", " yield env.timeout(1)\n", "\n", "\n", "def customer_arrivals(env, theater):\n", " \"\"\"Create new *moviegoers* until the sim time reaches 120.\"\"\"\n", " while True:\n", " yield env.timeout(random.expovariate(1 / 0.5))\n", "\n", " movie = random.choice(theater.movies)\n", " num_tickets = random.randint(1, 6)\n", " if theater.available[movie]:\n", " env.process(moviegoer(env, movie, num_tickets, theater))\n", "\n", "\n", "Theater = collections.namedtuple('Theater', 'counter, movies, available, '\n", " 'sold_out, when_sold_out, '\n", " 'num_renegers')\n", "\n", "\n", "# Setup and start the simulation\n", "print('Movie renege')\n", "random.seed(RANDOM_SEED)\n", "env = simpy.Environment()\n", "\n", "# Create movie theater\n", "counter = simpy.Resource(env, capacity=1)\n", "movies = ['Python Unchained', 'Kill Process', 'Pulp Implementation']\n", "available = {movie: TICKETS for movie in movies}\n", "sold_out = {movie: env.event() for movie in movies}\n", "when_sold_out = {movie: None for movie in movies}\n", "num_renegers = {movie: 0 for movie in movies}\n", "theater = Theater(counter, movies, available, sold_out, when_sold_out,\n", " num_renegers)\n", "\n", "# Start process and run\n", "env.process(customer_arrivals(env, theater))\n", "env.run(until=SIM_TIME)\n", "\n", "# Analysis/results\n", "for movie in movies:\n", " if theater.sold_out[movie]:\n", " print('Movie \"%s\" sold out %.1f minutes after ticket counter '\n", " 'opening.' % (movie, theater.when_sold_out[movie]))\n", " print(' Number of people leaving queue when film sold out: %s' %\n", " theater.num_renegers[movie])" ] }, { "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.6.5" }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }