Mercurial > hg > nsaunier > traffic-intelligence
comparison python/traffic_engineering.py @ 665:15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Wed, 20 May 2015 13:57:47 +0200 |
| parents | 3b13ec964476 |
| children | 3666342dabe2 |
comparison
equal
deleted
inserted
replaced
| 664:455f9b93819c | 665:15e244d2a1b5 |
|---|---|
| 1 #! /usr/bin/env python | 1 #! /usr/bin/env python |
| 2 ''' Traffic Engineering Tools and Examples''' | 2 ''' Traffic Engineering Tools and Examples''' |
| 3 | 3 |
| 4 import prediction | |
| 5 | |
| 4 from math import ceil | 6 from math import ceil |
| 5 | |
| 6 import prediction | |
| 7 | |
| 8 __metaclass__ = type | |
| 9 | 7 |
| 10 | 8 |
| 11 ######################### | 9 ######################### |
| 12 # Simulation | 10 # Simulation |
| 13 ######################### | 11 ######################### |
| 24 h = expovariate(flow) | 22 h = expovariate(flow) |
| 25 headways.append(h) | 23 headways.append(h) |
| 26 totalTime += h | 24 totalTime += h |
| 27 return headways | 25 return headways |
| 28 | 26 |
| 29 class RoadUser: | 27 class RoadUser(object): |
| 30 '''Simple example of inheritance to plot different road users ''' | 28 '''Simple example of inheritance to plot different road users ''' |
| 31 def __init__(self, position, velocity): | 29 def __init__(self, position, velocity): |
| 32 'Both fields are 2D numpy arrays' | 30 'Both fields are 2D numpy arrays' |
| 33 self.position = position.astype(float) | 31 self.position = position.astype(float) |
| 34 self.velocity = velocity.astype(float) | 32 self.velocity = velocity.astype(float) |
| 59 | 57 |
| 60 ######################### | 58 ######################### |
| 61 # fundamental diagram | 59 # fundamental diagram |
| 62 ######################### | 60 ######################### |
| 63 | 61 |
| 64 class FundamentalDiagram: | 62 class FundamentalDiagram(object): |
| 65 ''' ''' | 63 ''' ''' |
| 66 def __init__(self, name): | 64 def __init__(self, name): |
| 67 self.name = name | 65 self.name = name |
| 68 | 66 |
| 69 def q(self, k): | 67 def q(self, k): |
| 117 | 115 |
| 118 ######################### | 116 ######################### |
| 119 # intersection | 117 # intersection |
| 120 ######################### | 118 ######################### |
| 121 | 119 |
| 122 class FourWayIntersection: | 120 class FourWayIntersection(object): |
| 123 '''Simple class for simple intersection outline''' | 121 '''Simple class for simple intersection outline''' |
| 124 def __init__(self, dimension, coordX, coordY): | 122 def __init__(self, dimension, coordX, coordY): |
| 125 self.dimension = dimension | 123 self.dimension = dimension |
| 126 self.coordX = coordX | 124 self.coordX = coordX |
| 127 self.coordY = coordY | 125 self.coordY = coordY |
| 142 | 140 |
| 143 ######################### | 141 ######################### |
| 144 # traffic signals | 142 # traffic signals |
| 145 ######################### | 143 ######################### |
| 146 | 144 |
| 147 class Volume: | 145 class Volume(object): |
| 148 '''Class to represent volumes with varied vehicule types ''' | 146 '''Class to represent volumes with varied vehicule types ''' |
| 149 def __init__(self, volume, types = ['pc'], proportions = [1], equivalents = [1], nLanes = 1): | 147 def __init__(self, volume, types = ['pc'], proportions = [1], equivalents = [1], nLanes = 1): |
| 150 '''mvtEquivalent is the equivalent if the movement is right of left turn''' | 148 '''mvtEquivalent is the equivalent if the movement is right of left turn''' |
| 151 | 149 |
| 152 # check the sizes of the lists | 150 # check the sizes of the lists |
| 170 v = 0 | 168 v = 0 |
| 171 for p, e in zip(self.proportions, self.equivalents): | 169 for p, e in zip(self.proportions, self.equivalents): |
| 172 v += p*e | 170 v += p*e |
| 173 return v*self.volume | 171 return v*self.volume |
| 174 | 172 |
| 175 class IntersectionMovement: | 173 class IntersectionMovement(object): |
| 176 '''Represents an intersection movement | 174 '''Represents an intersection movement |
| 177 with a volume, a type (through, left or right) | 175 with a volume, a type (through, left or right) |
| 178 and an equivalent for movement type''' | 176 and an equivalent for movement type''' |
| 179 def __init__(self, volume, mvtEquivalent = 1): | 177 def __init__(self, volume, mvtEquivalent = 1): |
| 180 self.volume = volume | 178 self.volume = volume |
| 181 self.mvtEquivalent = mvtEquivalent | 179 self.mvtEquivalent = mvtEquivalent |
| 182 | 180 |
| 183 def getTVUVolume(self): | 181 def getTVUVolume(self): |
| 184 return self.mvtEquivalent*self.volume.getPCUVolume() | 182 return self.mvtEquivalent*self.volume.getPCUVolume() |
| 185 | 183 |
| 186 class LaneGroup: | 184 class LaneGroup(object): |
| 187 '''Class that represents a group of mouvements''' | 185 '''Class that represents a group of mouvements''' |
| 188 | 186 |
| 189 def __init__(self, movements, nLanes): | 187 def __init__(self, movements, nLanes): |
| 190 self.movements = movements | 188 self.movements = movements |
| 191 self.nLanes = nLanes | 189 self.nLanes = nLanes |
| 201 | 199 |
| 202 def minimumCycle(lostTime, criticalCharge, degreeSaturation=1.): | 200 def minimumCycle(lostTime, criticalCharge, degreeSaturation=1.): |
| 203 'degree of saturation can be used as the peak hour factor too' | 201 'degree of saturation can be used as the peak hour factor too' |
| 204 return lostTime/(1-criticalCharge/degreeSaturation) | 202 return lostTime/(1-criticalCharge/degreeSaturation) |
| 205 | 203 |
| 206 class Cycle: | 204 class Cycle(object): |
| 207 '''Class to compute optimal cycle and the split of effective green times''' | 205 '''Class to compute optimal cycle and the split of effective green times''' |
| 208 def __init__(self, phases, lostTime, saturationVolume): | 206 def __init__(self, phases, lostTime, saturationVolume): |
| 209 '''phases is a list of phases | 207 '''phases is a list of phases |
| 210 a phase is a list of lanegroups''' | 208 a phase is a list of lanegroups''' |
| 211 self.phases = phases | 209 self.phases = phases |
