diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..a8680dd Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore index 574ba10..606512b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ .direnv/ __pycache__/ +.envrc diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..9b1c5e1 --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +traffic-simulation \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..e76d54e --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..3b31283 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..da36f54 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..25ff64a --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/traffic-simulation.iml b/.idea/traffic-simulation.iml new file mode 100644 index 0000000..d0876a7 --- /dev/null +++ b/.idea/traffic-simulation.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..68195de --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1434074563454 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.ipynb_checkpoints/traffic_sim-checkpoint.ipynb b/.ipynb_checkpoints/traffic_sim-checkpoint.ipynb new file mode 100644 index 0000000..6459344 --- /dev/null +++ b/.ipynb_checkpoints/traffic_sim-checkpoint.ipynb @@ -0,0 +1,205 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import random\n", + "import math\n", + "import statistics\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "%matplotlib inline\n", + "\n", + "#import traffic_sim.py" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + } + ], + "source": [ + "class Road:\n", + " def __init__(self):\n", + " self.length = 1000\n", + "\n", + " def __str__(self):\n", + " return self.length\n", + "\n", + "\n", + "class Car:\n", + " def __init__(self, location, following_who=None):\n", + " self.speed = 30\n", + " self.max_speed = 60\n", + " self.min_distance = int(self.speed + 5)\n", + " self.location = location\n", + " self.following_who = following_who\n", + "\n", + " @property\n", + " # wha? So we use this to call without passing variables right?\n", + " def __str__(self):\n", + " return \"{}\".format(self.location)\n", + "\n", + " def accelerate(self):\n", + " if self.speed < self.max_speed:\n", + " self.speed += 2\n", + " # return\n", + " else:\n", + " self.speed = self.following_who.speed\n", + " # return\n", + "\n", + " def decelerate(self):\n", + " distraction = random.randint(0, 9)\n", + " if distraction == 0:\n", + " self.speed -= 2\n", + " if self.speed < 0:\n", + " self.speed = 0\n", + "\n", + " def simulate(self):\n", + " if self.following_who.location > self.min_distance:\n", + " self.accelerate()\n", + " self.decelerate()\n", + " self.location += self.speed\n", + " if self.location >= road.length:\n", + " self.location -= road.length\n", + " else:\n", + " self.decelerate()\n", + " self.location += self.speed\n", + " if self.location >= road.length:\n", + " self.location -= road.length\n", + "\n", + "\n", + "road = Road()\n", + "car_list = []\n", + "location = 980\n", + "car_in_front = None\n", + "traffic = []\n", + "traffic_log = []\n", + "print(traffic_log)\n", + "in_range = []\n", + "itteration_log = []\n", + "speed_log = []\n", + "\n", + "for _ in range(30):\n", + " # this creates the car instances\n", + " car_to_spawn = Car(location, car_in_front)\n", + " car_list.append(car_to_spawn)\n", + " # this next line allows the first car to spawn without knowing who it is following by setting var above to none\n", + " # Each iteration allows the first car to be assigned the last car no matter how many are put on the road\n", + " car_list[0].following_who = car_list[-1]\n", + " location -= 32\n", + " car_in_front = car_to_spawn\n", + "\n", + "for _ in range(120):\n", + " for car in car_list:\n", + " car.simulate()\n", + " [speed_log.append(car.speed)]\n", + " [traffic.append(car.location)]\n", + " [in_range.append(_)]\n", + " [traffic_log.append(traffic)]\n", + " #for use with scatter plot\n", + " itteration_log.append(in_range)\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\nG/79/Nr3vCPJd1prN29rXBiRq96wCFX1hCR/nuQtrbX/Wb9vuJr6QbWszplEVf1ckm+21r6ax97l\nt4f6ZaauTPLcJO9vrT03yf9l+HjZWWqXOaqqH0ryG0mentUvk0+oqteuf4/aZUkOUa8wO7vuk125\nrQdqrf3sQfdX1Ruy+sjOi9c2P5Dk2rXb12TVuXwgj7218ez2B7ayo3B859frtdnbaYfJVdV3ZdXw\n+2hr7ZPD5oeq6qmttQeHt4V/c9i+aQ221jKVn0zy8qp6WZLvSfJ9VfXRqF/m70ySM621Lw+3P55V\nLs+DapeZ+4kkf9ta+/ckqapPJHlh1C7LcpTzBL0GZmWMPtlYV+89mdXHdV7RWvv22l2fSvLqqrqq\nqp6R5JlJvtRaezDJt4Yrn1WS1yX55AUPDOP6u6zCMp9eVVdlFa75qYn3Cc4Z1ssPJLmrtfa7a3d9\nKsnrh69fn8fW041r8Fj7C+taa29vrV3bWntGVkHyf9Vae13ULzM3nLfeX1XPGja9JMmdST4dtcu8\n3ZPkBVX1uOEc4iVZXUhJ7bIkRzpP0GtgLsbqk23tnX4X8b4kVyU5PVx05AuttRtaa3dV1S1Zvbg8\nkuSG4S25SXJDkj9O8risrob22ZH2FTZqrT1SVW9O8rmsrm72gdba3RPvFqz7qSSvTfIPVfXVYduN\nSd6V5JaqelOS+5K8MkkusgbD1M7WovplCX4tyZ8MfxT85yS/nNW5gtpltlprt1fVR7L6w/ajSb6S\n5A+SPDFqlxmqqo8leVGSH6iq+5P8do53nqDXwKg21O5NWf2etvM+WVmnAQAAAKAvU1y9FwAAAADY\nIU0/AAAAAOiMph8AAAAAdEbTDwAAAAA6o+kHAAAAAJ3R9AMAAACAzmj6AQAAAEBnNP0AAAAAoDP/\nDzYM+WhAhWzLAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = traffic_log\n", + "y = itteration_log\n", + "plt.rcParams['figure.figsize'] = 22, 12\n", + "plt.scatter(x, y, marker = \"_\", c=['b', 'r', 'g'])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "62.216772722464235\n" + ] + } + ], + "source": [ + "average_speed = (sum(speed_log) / len(speed_log))\n", + "variation = []\n", + "for _ in speed_log:\n", + " variation.append((_ - average_speed)**2)\n", + "variation = (sum(variation) / len(variation))\n", + "standard_dev = variation**(.5)\n", + "optimum_speed = average_speed + standard_dev\n", + "\n", + "print(optimum_speed)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.4.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/README.md b/README.md index f63bc20..58fb3a0 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ -# Traffic simulation +# Run traffic_sim.ipynb using Ipython Notebook +## Traffic simulation + ## Description Analyze the behavior of drivers on a new road to determine the optimal speed limits. diff --git a/traffic_sim.ipynb b/traffic_sim.ipynb new file mode 100644 index 0000000..6459344 --- /dev/null +++ b/traffic_sim.ipynb @@ -0,0 +1,205 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import random\n", + "import math\n", + "import statistics\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "%matplotlib inline\n", + "\n", + "#import traffic_sim.py" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + } + ], + "source": [ + "class Road:\n", + " def __init__(self):\n", + " self.length = 1000\n", + "\n", + " def __str__(self):\n", + " return self.length\n", + "\n", + "\n", + "class Car:\n", + " def __init__(self, location, following_who=None):\n", + " self.speed = 30\n", + " self.max_speed = 60\n", + " self.min_distance = int(self.speed + 5)\n", + " self.location = location\n", + " self.following_who = following_who\n", + "\n", + " @property\n", + " # wha? So we use this to call without passing variables right?\n", + " def __str__(self):\n", + " return \"{}\".format(self.location)\n", + "\n", + " def accelerate(self):\n", + " if self.speed < self.max_speed:\n", + " self.speed += 2\n", + " # return\n", + " else:\n", + " self.speed = self.following_who.speed\n", + " # return\n", + "\n", + " def decelerate(self):\n", + " distraction = random.randint(0, 9)\n", + " if distraction == 0:\n", + " self.speed -= 2\n", + " if self.speed < 0:\n", + " self.speed = 0\n", + "\n", + " def simulate(self):\n", + " if self.following_who.location > self.min_distance:\n", + " self.accelerate()\n", + " self.decelerate()\n", + " self.location += self.speed\n", + " if self.location >= road.length:\n", + " self.location -= road.length\n", + " else:\n", + " self.decelerate()\n", + " self.location += self.speed\n", + " if self.location >= road.length:\n", + " self.location -= road.length\n", + "\n", + "\n", + "road = Road()\n", + "car_list = []\n", + "location = 980\n", + "car_in_front = None\n", + "traffic = []\n", + "traffic_log = []\n", + "print(traffic_log)\n", + "in_range = []\n", + "itteration_log = []\n", + "speed_log = []\n", + "\n", + "for _ in range(30):\n", + " # this creates the car instances\n", + " car_to_spawn = Car(location, car_in_front)\n", + " car_list.append(car_to_spawn)\n", + " # this next line allows the first car to spawn without knowing who it is following by setting var above to none\n", + " # Each iteration allows the first car to be assigned the last car no matter how many are put on the road\n", + " car_list[0].following_who = car_list[-1]\n", + " location -= 32\n", + " car_in_front = car_to_spawn\n", + "\n", + "for _ in range(120):\n", + " for car in car_list:\n", + " car.simulate()\n", + " [speed_log.append(car.speed)]\n", + " [traffic.append(car.location)]\n", + " [in_range.append(_)]\n", + " [traffic_log.append(traffic)]\n", + " #for use with scatter plot\n", + " itteration_log.append(in_range)\n", + " \n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\nG/79/Nr3vCPJd1prN29rXBiRq96wCFX1hCR/nuQtrbX/Wb9vuJr6QbWszplEVf1ckm+21r6ax97l\nt4f6ZaauTPLcJO9vrT03yf9l+HjZWWqXOaqqH0ryG0mentUvk0+oqteuf4/aZUkOUa8wO7vuk125\nrQdqrf3sQfdX1Ruy+sjOi9c2P5Dk2rXb12TVuXwgj7218ez2B7ayo3B859frtdnbaYfJVdV3ZdXw\n+2hr7ZPD5oeq6qmttQeHt4V/c9i+aQ221jKVn0zy8qp6WZLvSfJ9VfXRqF/m70ySM621Lw+3P55V\nLs+DapeZ+4kkf9ta+/ckqapPJHlh1C7LcpTzBL0GZmWMPtlYV+89mdXHdV7RWvv22l2fSvLqqrqq\nqp6R5JlJvtRaezDJt4Yrn1WS1yX55AUPDOP6u6zCMp9eVVdlFa75qYn3Cc4Z1ssPJLmrtfa7a3d9\nKsnrh69fn8fW041r8Fj7C+taa29vrV3bWntGVkHyf9Vae13ULzM3nLfeX1XPGja9JMmdST4dtcu8\n3ZPkBVX1uOEc4iVZXUhJ7bIkRzpP0GtgLsbqk23tnX4X8b4kVyU5PVx05AuttRtaa3dV1S1Zvbg8\nkuSG4S25SXJDkj9O8risrob22ZH2FTZqrT1SVW9O8rmsrm72gdba3RPvFqz7qSSvTfIPVfXVYduN\nSd6V5JaqelOS+5K8MkkusgbD1M7WovplCX4tyZ8MfxT85yS/nNW5gtpltlprt1fVR7L6w/ajSb6S\n5A+SPDFqlxmqqo8leVGSH6iq+5P8do53nqDXwKg21O5NWf2etvM+WVmnAQAAAKAvU1y9FwAAAADY\nIU0/AAAAAOiMph8AAAAAdEbTDwAAAAA6o+kHAAAAAJ3R9AMAAACAzmj6AQAAAEBnNP0AAAAAoDP/\nDzYM+WhAhWzLAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "x = traffic_log\n", + "y = itteration_log\n", + "plt.rcParams['figure.figsize'] = 22, 12\n", + "plt.scatter(x, y, marker = \"_\", c=['b', 'r', 'g'])\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "62.216772722464235\n" + ] + } + ], + "source": [ + "average_speed = (sum(speed_log) / len(speed_log))\n", + "variation = []\n", + "for _ in speed_log:\n", + " variation.append((_ - average_speed)**2)\n", + "variation = (sum(variation) / len(variation))\n", + "standard_dev = variation**(.5)\n", + "optimum_speed = average_speed + standard_dev\n", + "\n", + "print(optimum_speed)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "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.4.3" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/traffic_sim.py b/traffic_sim.py new file mode 100644 index 0000000..5d59266 --- /dev/null +++ b/traffic_sim.py @@ -0,0 +1,87 @@ +import random + +class Road: + def __init__(self): + self.length = 1000 + + def __str__(self): + return self.length + + +class Car: + def __init__(self, location, following_who=None): + self.speed = 0 + self.max_speed = 33 + self.min_distance = int(self.speed + 15) + self.location = location + self.following_who = following_who + + @property + # wha? So we use this to call without passing variables right? + def __str__(self): + return "{}".format(self.location) + + def accelerate(self): + if self.speed < self.max_speed: + self.speed += 2 + return + else: + self.speed = self.following_who.speed + return + + def decelerate(self): + distraction = random.randint(0, 9) + if distraction == 0: + self.speed -= 2 + if self.speed < 0: + self.speed = 0 + + def simulate(self): + if self.following_who.location > self.min_distance: + self.accelerate() + self.decelerate() + self.location += self.speed + if self.location >= road.length: + self.location -= road.length + else: + self.decelerate() + self.location += self.speed + if self.location >= road.length: + self.location -= road.length + + +road = Road() +car_list = [] +location = 600 +car_in_front = None +traffic = [] +traffic_log = [] +in_range = [] +itteration_log = [] +print(traffic_log) + +for _ in range(30): + # this creates the car instances + car_to_spawn = Car(location, car_in_front) + car_list.append(car_to_spawn) + # this next line allows the first car to spawn without knowing who it is following by setting var above to none + # Each iteration allows the first car to be assigned the last car no matter how many are put on the road + car_list[0].following_who = car_list[-1] + location -= 20 + car_in_front = car_to_spawn + +print("DEBUG: first run") +for _ in range(60): + print(_, " RUN") + for car in car_list: + car.simulate() + [traffic.append(car.location)] + [in_range.append(_)] + [traffic_log.append(traffic)] + # itteration log is for using with a scatter plot in homework + itteration_log.append(in_range) + traffic = [] + in_range = [] +print(len(traffic_log[0])) +print(len(traffic_log)) +print(traffic_log) \ No newline at end of file