Skip to content

Instantly share code, notes, and snippets.

@steven-tey
Last active October 3, 2019 17:28
Show Gist options
  • Save steven-tey/ca4dc36a59d7da41dff6c228720e7954 to your computer and use it in GitHub Desktop.
Save steven-tey/ca4dc36a59d7da41dff6c228720e7954 to your computer and use it in GitHub Desktop.
CS166 Session 4.2 Pre-Class Work
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 55,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import random"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Code from previous class"
]
},
{
"cell_type": "code",
"execution_count": 72,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
".........0..........01.4.......003....02.....5......0.0.......................1.....00...1.01..2..4.\n",
"..4......0..........1.1....3...00...0.1..3........0.1.0........................1....01....01.1...3..\n",
"4.....1..0...........1.2......000...1..1....4.....0..00.........................2...0.1...0.0.2.....\n",
"....1..0.1............1..2....001....1..2.......1.1..00...........................1.1..1..1.1...3...\n",
".....0.0..2............2...1..01.2....2...3......0.1.00............................0.1..2..1.1.....4\n",
"...1.0.1....2............2..0.0.1..2....2....2...1..001............................1..1...1.1.1.....\n",
"....00..2.....2............01.0..2...3....2....1..0.00.2............................1..1...1.0.2....\n",
"....01....2.....3..........0.01....3....2...3...1.1.01...2...........................1..1...01...2..\n",
"....1.2.....2......3.......1.1.1......3...3....1.1.00.2....3..........................2..1..0.2....3\n",
"..1..2..3.....3.......3.....1.1.1........2...1..1.000...2.....4.........................1.1.0...2...\n",
"...1...2...3.....3.......3...1.0.1.........1..1..0001.....2.......4......................1.01.....2.\n",
"2...2....2....4.....3.......1.01..2.........2..0.001.1......2.........5...................00.1......\n",
"..2...3....3......4....4.....01.1...2.........00.00.0.2.......2............4..............00..2.....\n",
"....3....3....3.......3....0.0.1.2....2.......00.01.0...3.......2..............5..........01....2...\n",
".......3....4....3.......1.0.0..2..2....2.....00.0.00......4......2.................5.....1.2.....3.\n",
".4........4.....2...4.....01.0....2..3....3...00.0.00..........3....3....................0.1..3.....\n",
".....4........2...2.....1.0.01......2...3....001.0.00.............4....3.................0..2....3..\n",
"3........5......2...2....01.1.2.......3....1.01.01.00.................2...4..............0....2.....\n",
"...3..........3...2...1..1.1.2..3........2..01.01.001...................2.....5..........0......2...\n",
"......3..........1..1..1..0.2..2...3.......01.01.000.1....................3........5.....0........2.\n",
"3........4........2..1..1.0...2..3....3....0.01.0000..1......................4..........01..........\n",
"...4.........5......1.1..01.....3...3....1.0.0.00000...1.........................4......0.2.........\n",
".......5..........2..0.1.0.2.......2...1..00.0.00001....1............................1..0...3.......\n",
"............5.......00..01...2.......2..0.01.1.0000.1....2............................1.1......3....\n",
".................2..01..1.1....3.......01.1.0.00000..2.....3...........................0.1........3.\n",
".3.................00.2..1.2......3....0.1.00.00000....3......4........................1..2.........\n",
"....3..............00...0.2..3.......0.0..000.00001.......4.......5.....................2...2.......\n",
".......4...........01...1...2...4....0.0..000.0000.1..........4........5..................2...3.....\n",
"...........4.......0.2...1....2.....00.1..000.0001..2.............5.........5...............2....4..\n",
".5.............2...1...2..1.....3...01..1.000.000.2...3................4.........5............3.....\n",
"......4..........1..2....1.1.......01.1..0001.001...3....4.................4..........5..........4..\n",
".4........4.......1...3...0.2......1.0.0.001.001.1.....3.....4.................5...........5........\n",
".....5........3....2.....01...3.....01.1.01.000.1.1.......3......5..................5...........4...\n",
"4.........5......3...3...0.2.....2..0.1.00.0000..1.1.........4........5..................5..........\n",
"....5..........4....2...00...2.....01..000.0001...0.1............5.........4..................5.....\n",
".........4.........1..0.01.....3...1.0.001.001.2..0..1................5........5...................5\n",
"....5........4......1.0.0.1.......1.00.01.000.1..01...1....................4........4...............\n",
".........4.......2...00.0..2.......001.1.0001..0.1.1...2.......................5........4...........\n",
".............5.....1.00.0....2.....01.1.0001.1.1..1.1....2..........................4.......4.......\n",
"..................0.001.1......2...1.1.0000.1.0.1..1.2.....2............................5.......5...\n",
".4................0.01.1.2.......1..0.00000..01..2..2..3.....2...............................4......\n",
".....5............0.1.1.2..2......0.1.00000..1.1...1..3...3....2.................................4..\n",
".4........5.......0..1.1..2..3....1..000001...0.1...2....2...3...3..................................\n",
".....5.........1..1...0.2...3...2..1.00000.1..0..2....3....3....2...4...............................\n",
"..........5.....1..1..0...2....2..0.000000..1.1....2.....3....3...3.....5...........................\n",
"...............1.1..1.1.....2....01.000001...1.2.....2......4....3...3.......5......................\n",
"................1.2..1.2......1..1.000001.2...1..2.....3........2...3...4.........5.................\n",
".................2..0.2..3.....1..000001.1..1..2...3......4.......3....4....5..........4............\n",
"...................00...2...2...0.00000.0.2..1...2....4.......5......3.....4.....4.........5........\n",
"...................00.....3...1.1.00000.0...1.1....3......4........4....4......5.....5..........4...\n"
]
}
],
"source": [
"class TrafficSimulation():\n",
" \n",
" def __init__(self, length = 100, density = 0.2, max_velocity = 5, prob = 0.5):\n",
" # Here, we define the model parameters (road length, traffic density, maximum velocity, \n",
" # probability of slowing down) \n",
" self.length = length # The length of the road (number of cells)\n",
" self.density = density # The density of traffic\n",
" self.max_velocity = max_velocity # The maximum speed of the cars\n",
" self.slow_prob = prob # The probability of slowing down for no apparent reason\n",
" self.state = -np.ones(self.length, dtype=int) # \"-1\" represents an empty cell\n",
" filled_cells = np.random.choice(range(self.length), size=int(round(density * self.length)), replace=False)\n",
" self.state[filled_cells] = np.random.randint(0, self.max_velocity + 1, size=len(filled_cells))\n",
" \n",
" \n",
" def changeSpeed(self, display = True): \n",
" for i in range(self.length):\n",
" if self.state[i] != -1: # We only change the speed if there's a car in the cell\n",
" dist = 0 # Algorithm that scans the grids in front of the car until it finds the next car\n",
" while self.state[(i + (dist + 1)) % self.length] == -1:\n",
" dist += 1\n",
" # Here we will code for the 3 rules for speed change in the Nagel-Schreckenberg model\n",
" if dist > self.state[i] and self.state[i] < self.max_velocity:\n",
" self.state[i] += 1\n",
" if dist < self.state[i]:\n",
" self.state[i] = dist \n",
" if self.state[i] > 0 and np.random.random() < self.slow_prob:\n",
" self.state[i] -= 1 \n",
" \n",
" if display == True: # Display the model\n",
" self.display()\n",
" \n",
" # Here we are coding for the last rule in the Nagel-Schrekenberg model - the movement rule\n",
" next_state = -np.ones(self.length, dtype=int) \n",
" for i in range(self.length):\n",
" if self.state[i] != -1:\n",
" next_state[(i + self.state[i]) % self.length] = self.state[i]\n",
" self.state = next_state \n",
" \n",
" def display(self):\n",
" print(''.join('.' if x == -1 else str(x) for x in self.state))\n",
" \n",
"sim = TrafficSimulation()\n",
"for i in range(50):\n",
" sim.changeSpeed() "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Measure the Flow Rate"
]
},
{
"cell_type": "code",
"execution_count": 74,
"metadata": {},
"outputs": [],
"source": [
"class TrafficSimulation():\n",
" \n",
" def __init__(self, length = 100, density = 0.2, max_velocity = 5, prob = 0.5):\n",
" # Here, we define the model parameters (road length, traffic density, maximum velocity, \n",
" # probability of slowing down) \n",
" self.length = length # The length of the road (number of cells)\n",
" self.density = density # The density of traffic\n",
" self.max_velocity = max_velocity # The maximum speed of the cars\n",
" self.slow_prob = prob # The probability of slowing down for no apparent reason\n",
" self.state = -np.ones(self.length, dtype=int) # \"-1\" represents an empty cell\n",
" filled_cells = np.random.choice(range(self.length), size=int(round(density * self.length)), replace=False)\n",
" self.state[filled_cells] = np.random.randint(0, self.max_velocity + 1, size=len(filled_cells))\n",
" self.time_step = 0 # Adding new parameters to measure traffic flow\n",
" self.total_traffic_flow = 0 \n",
" \n",
" def changeSpeed(self, display = False): # Changing this to False because we will be running this multiple times\n",
" # and we don't want the model to be printed every time\n",
" for i in range(self.length):\n",
" if self.state[i] != -1: # We only change the speed if there's a car in the cell\n",
" dist = 0 # Algorithm that scans the grids in front of the car until it finds the next car\n",
" while self.state[(i + (dist + 1)) % self.length] == -1:\n",
" dist += 1\n",
" # Here we will code for the 3 rules for speed change in the Nagel-Schreckenberg model\n",
" if dist > self.state[i] and self.state[i] < self.max_velocity:\n",
" self.state[i] += 1\n",
" if dist < self.state[i]:\n",
" self.state[i] = dist \n",
" if self.state[i] > 0 and np.random.random() < self.slow_prob:\n",
" self.state[i] -= 1 \n",
" \n",
" if display == True: # Display the model\n",
" self.display()\n",
" \n",
" # Here we are coding for the last rule in the Nagel-Schrekenberg model - the movement rule\n",
" next_state = -np.ones(self.length, dtype=int) \n",
" for i in range(self.length):\n",
" if self.state[i] != -1:\n",
" next_state[(i + self.state[i]) % self.length] = self.state[i]\n",
" self.state = next_state \n",
" \n",
" # For every time step, we add the traffic flow measured in that time step to total_traffic_flow\n",
" self.time_step += 1\n",
" for i in range(self.max_velocity):\n",
" if self.state[i] > i:\n",
" self.total_traffic_flow += 1\n",
" \n",
" def display(self):\n",
" print(''.join('.' if x == -1 else str(x) for x in self.state))\n",
" \n",
"sim = TrafficSimulation()\n",
"for i in range(50):\n",
" sim.changeSpeed() "
]
},
{
"cell_type": "code",
"execution_count": 84,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Traffic density: 0.01\n",
"Average traffic flow: 0.04500000000000001\n",
"Traffic density: 0.02\n",
"Average traffic flow: 0.08897556508571408\n",
"Traffic density: 0.03\n",
"Average traffic flow: 0.13394338788791188\n",
"Traffic density: 0.04\n",
"Average traffic flow: 0.1796713984190474\n",
"Traffic density: 0.05\n",
"Average traffic flow: 0.2232780415061375\n",
"Traffic density: 0.06\n",
"Average traffic flow: 0.267825579115372\n",
"Traffic density: 0.07\n",
"Average traffic flow: 0.3140758225703176\n",
"Traffic density: 0.08\n",
"Average traffic flow: 0.3554552896181476\n",
"Traffic density: 0.09\n",
"Average traffic flow: 0.3950752343588644\n",
"Traffic density: 0.1\n",
"Average traffic flow: 0.41719429468450364\n",
"Traffic density: 0.11\n",
"Average traffic flow: 0.35310376013412975\n",
"Traffic density: 0.12\n",
"Average traffic flow: 0.3195380561464249\n",
"Traffic density: 0.13\n",
"Average traffic flow: 0.3046729224518602\n",
"Traffic density: 0.14\n",
"Average traffic flow: 0.32583499617857203\n",
"Traffic density: 0.15\n",
"Average traffic flow: 0.3034859857269494\n",
"Traffic density: 0.16\n",
"Average traffic flow: 0.3022581191351219\n",
"Traffic density: 0.17\n",
"Average traffic flow: 0.3041910573688437\n",
"Traffic density: 0.18\n",
"Average traffic flow: 0.31288958005144146\n",
"Traffic density: 0.19\n",
"Average traffic flow: 0.30503839345853656\n",
"Traffic density: 0.2\n",
"Average traffic flow: 0.2875087145053089\n",
"Traffic density: 0.21\n",
"Average traffic flow: 0.2961702932860053\n",
"Traffic density: 0.22\n",
"Average traffic flow: 0.2889666426753501\n",
"Traffic density: 0.23\n",
"Average traffic flow: 0.28530515141570667\n",
"Traffic density: 0.24\n",
"Average traffic flow: 0.28348396565809497\n",
"Traffic density: 0.25\n",
"Average traffic flow: 0.2866230346569066\n",
"Traffic density: 0.26\n",
"Average traffic flow: 0.2793471142000844\n",
"Traffic density: 0.27\n",
"Average traffic flow: 0.27240193241893135\n",
"Traffic density: 0.28\n",
"Average traffic flow: 0.2763534638478137\n",
"Traffic density: 0.29\n",
"Average traffic flow: 0.2730388687915971\n",
"Traffic density: 0.3\n",
"Average traffic flow: 0.267102887915533\n",
"Traffic density: 0.31\n",
"Average traffic flow: 0.26226862728022754\n",
"Traffic density: 0.32\n",
"Average traffic flow: 0.26059187523755056\n",
"Traffic density: 0.33\n",
"Average traffic flow: 0.26120557544021167\n",
"Traffic density: 0.34\n",
"Average traffic flow: 0.2526783288220208\n",
"Traffic density: 0.35\n",
"Average traffic flow: 0.24736459054254137\n",
"Traffic density: 0.36\n",
"Average traffic flow: 0.2512467852033158\n",
"Traffic density: 0.37\n",
"Average traffic flow: 0.24311891295731275\n",
"Traffic density: 0.38\n",
"Average traffic flow: 0.2423203462687983\n",
"Traffic density: 0.39\n",
"Average traffic flow: 0.2388179207703201\n",
"Traffic density: 0.4\n",
"Average traffic flow: 0.23656759745994466\n",
"Traffic density: 0.41\n",
"Average traffic flow: 0.23355171966836058\n",
"Traffic density: 0.42\n",
"Average traffic flow: 0.22784151396741378\n",
"Traffic density: 0.43\n",
"Average traffic flow: 0.22552482204113397\n",
"Traffic density: 0.44\n",
"Average traffic flow: 0.2203607732266014\n",
"Traffic density: 0.45\n",
"Average traffic flow: 0.21910951428709743\n",
"Traffic density: 0.46\n",
"Average traffic flow: 0.2185791860036249\n",
"Traffic density: 0.47\n",
"Average traffic flow: 0.21197341591049992\n",
"Traffic density: 0.48\n",
"Average traffic flow: 0.21201137715376298\n",
"Traffic density: 0.49\n",
"Average traffic flow: 0.20193868464267073\n",
"Traffic density: 0.5\n",
"Average traffic flow: 0.20501898305512856\n",
"Traffic density: 0.51\n",
"Average traffic flow: 0.20018471932801463\n",
"Traffic density: 0.52\n",
"Average traffic flow: 0.1930169325901137\n",
"Traffic density: 0.53\n",
"Average traffic flow: 0.1944246892351285\n",
"Traffic density: 0.54\n",
"Average traffic flow: 0.1870795030369527\n",
"Traffic density: 0.55\n",
"Average traffic flow: 0.18153389445951362\n",
"Traffic density: 0.56\n",
"Average traffic flow: 0.18075638665707355\n",
"Traffic density: 0.57\n",
"Average traffic flow: 0.1757418733023512\n",
"Traffic density: 0.58\n",
"Average traffic flow: 0.174481031071182\n",
"Traffic density: 0.59\n",
"Average traffic flow: 0.17219071675228798\n",
"Traffic density: 0.6\n",
"Average traffic flow: 0.16524842549628735\n",
"Traffic density: 0.61\n",
"Average traffic flow: 0.16584688136833065\n",
"Traffic density: 0.62\n",
"Average traffic flow: 0.15848954820764033\n",
"Traffic density: 0.63\n",
"Average traffic flow: 0.15454828940516832\n",
"Traffic density: 0.64\n",
"Average traffic flow: 0.14888384308544916\n",
"Traffic density: 0.65\n",
"Average traffic flow: 0.14733858643721257\n",
"Traffic density: 0.66\n",
"Average traffic flow: 0.14700340036855128\n",
"Traffic density: 0.67\n",
"Average traffic flow: 0.1390064275754775\n",
"Traffic density: 0.68\n",
"Average traffic flow: 0.13602328464986166\n",
"Traffic density: 0.69\n",
"Average traffic flow: 0.13270170540566245\n",
"Traffic density: 0.7\n",
"Average traffic flow: 0.12838496931237836\n",
"Traffic density: 0.71\n",
"Average traffic flow: 0.12298685357792365\n",
"Traffic density: 0.72\n",
"Average traffic flow: 0.12135472730743631\n",
"Traffic density: 0.73\n",
"Average traffic flow: 0.1179693876320618\n",
"Traffic density: 0.74\n",
"Average traffic flow: 0.11423377434076928\n",
"Traffic density: 0.75\n",
"Average traffic flow: 0.11041479424857911\n",
"Traffic density: 0.76\n",
"Average traffic flow: 0.10726738326388094\n",
"Traffic density: 0.77\n",
"Average traffic flow: 0.10115056332448942\n",
"Traffic density: 0.78\n",
"Average traffic flow: 0.09694204022778907\n",
"Traffic density: 0.79\n",
"Average traffic flow: 0.09535753287282893\n",
"Traffic density: 0.8\n",
"Average traffic flow: 0.08924277334185421\n",
"Traffic density: 0.81\n",
"Average traffic flow: 0.0850148522132752\n",
"Traffic density: 0.82\n",
"Average traffic flow: 0.0803249570927009\n",
"Traffic density: 0.83\n",
"Average traffic flow: 0.07915459198846389\n",
"Traffic density: 0.84\n",
"Average traffic flow: 0.073116090916952\n",
"Traffic density: 0.85\n",
"Average traffic flow: 0.06803506307396595\n",
"Traffic density: 0.86\n",
"Average traffic flow: 0.06388217734063321\n",
"Traffic density: 0.87\n",
"Average traffic flow: 0.06118328825349917\n",
"Traffic density: 0.88\n",
"Average traffic flow: 0.057363261971301836\n",
"Traffic density: 0.89\n",
"Average traffic flow: 0.05305882278733478\n",
"Traffic density: 0.9\n",
"Average traffic flow: 0.048116723643358714\n",
"Traffic density: 0.91\n",
"Average traffic flow: 0.0430995973410834\n",
"Traffic density: 0.92\n",
"Average traffic flow: 0.03770494141973437\n",
"Traffic density: 0.93\n",
"Average traffic flow: 0.03485467811449817\n",
"Traffic density: 0.94\n",
"Average traffic flow: 0.028739195257142237\n",
"Traffic density: 0.95\n",
"Average traffic flow: 0.02509691558441559\n",
"Traffic density: 0.96\n",
"Average traffic flow: 0.020656045189975145\n",
"Traffic density: 0.97\n",
"Average traffic flow: 0.015055171783625736\n",
"Traffic density: 0.98\n",
"Average traffic flow: 0.010125234808835815\n",
"Traffic density: 0.99\n",
"Average traffic flow: 0.005000000000000001\n",
"Traffic density: 1.0\n",
"Average traffic flow: 0.0\n"
]
}
],
"source": [
"density_list = []\n",
"traffic_flow_list = []\n",
"for density in range(1, 101):\n",
" sim = TrafficSimulation(density=density/100)\n",
" print('Traffic density:', sim.density)\n",
" density_list.append(sim.density)\n",
" \n",
" trial_flow = []\n",
" for trial in range(20): # Repeating each time steps by 20 times to get the average value\n",
" for i in range(200): # Run the simulation for 200 timesteps to get the average flow rate\n",
" sim.changeSpeed()\n",
" trial_flow.append(sim.total_traffic_flow / sim.time_step)\n",
" traffic_flow_list.append(sum(trial_flow)/len(trial_flow))\n",
" print('Average traffic flow:', sum(trial_flow)/len(trial_flow))"
]
},
{
"cell_type": "code",
"execution_count": 85,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.plot(density_list, traffic_flow_list)\n",
"plt.xlabel(\"Density (cars per site)\")\n",
"plt.ylabel(\"Flow rate (cars per time step)\")\n",
"plt.title(\"Simulation of density vs flow rate\")\n",
"plt.show()"
]
}
],
"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.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment