Last active
October 3, 2019 17:28
-
-
Save steven-tey/ca4dc36a59d7da41dff6c228720e7954 to your computer and use it in GitHub Desktop.
CS166 Session 4.2 Pre-Class Work
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"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