comparison python/traffic_engineering.py @ 34:388a5a25fe92

Code for lab5 works
author Nicolas Saunier <nico@confins.net>
date Sun, 11 Apr 2010 02:23:48 -0400
parents 4bd7cc69b6cd
children 571b11304ec9
comparison
equal deleted inserted replaced
33:4bd7cc69b6cd 34:388a5a25fe92
29 v = 0 29 v = 0
30 for p, e in zip(self.proportions, self.equivalents): 30 for p, e in zip(self.proportions, self.equivalents):
31 v += p*e 31 v += p*e
32 return v*self.volume 32 return v*self.volume
33 33
34 class IntersectionMouvement: 34 class IntersectionMovement:
35 '''Represents an intersection movement 35 '''Represents an intersection movement
36 with a volume, a type (through, left or right) 36 with a volume, a type (through, left or right)
37 and an equivalent for movement type''' 37 and an equivalent for movement type'''
38 def __init__(self, volume, type, mvtEquivalent = 1): 38 def __init__(self, volume, type, mvtEquivalent = 1):
39 self.volume = volume 39 self.volume = volume
40 self.type = type 40 self.type = type
41 self.mvtEquivalent = mvtEquivalent 41 self.mvtEquivalent = mvtEquivalent
42 42
43 def getTVUVolume(self): 43 def getTVUVolume(self):
53 return self.leftTurnVolume.getPCEVolume()*leftTurnEquivalent+self.throughVolume.getPCEVolume()*throughEquivalent+self.rightTurnVolume.getPCEVolume()*rightTurnEquivalent 53 return self.leftTurnVolume.getPCEVolume()*leftTurnEquivalent+self.throughVolume.getPCEVolume()*throughEquivalent+self.rightTurnVolume.getPCEVolume()*rightTurnEquivalent
54 54
55 class LaneGroup: 55 class LaneGroup:
56 '''Class that represents a group of mouvements''' 56 '''Class that represents a group of mouvements'''
57 57
58 def __init__(self): 58 def __init__(self, movements, nLanes):
59 self.mouvements = {'left': [], 59 self.movements = movements
60 'through': [], 60 self.nLanes = nLanes
61 'right': []}
62 61
63 # all the add*Mvt should add a IntersectionMovement instance 62 def getTVUVolume(self):
64 def addLeftMvt(self, vol): 63 return sum([mvt.getTVUVolume() for mvt in self.movements])
65 self.mouvements['left'].append(vol)
66
67 def addRightMvt(self, vol):
68 self.mouvements['right'].append(vol)
69
70 def addThroughMvt(self, vol):
71 self.mouvements['through'].append(vol)
72
73 def getTVUVolume(self, leftTurnEquivalent = 1, throughEquivalent = 1, rightTurnEquivalent = 1):
74 return leftTurnEquivalent*sum([m.getPCEVolume() for m in mouvements['left']])\
75 +rightTurnEquivalent*sum([m.getPCEVolume() for m in mouvements['right']])\
76 +throughTurnEquivalent*sum([m.getPCEVolume() for m in mouvements['through']])
77 64
78 def checkProtectedLeftTurn(leftMvt, opposedThroughMvt): 65 def checkProtectedLeftTurn(leftMvt, opposedThroughMvt):
79 '''Checks if one of the main two conditions on left turn is verified 66 '''Checks if one of the main two conditions on left turn is verified
80 The lane groups should contain left and through movement''' 67 The lane groups should contain left and through movement'''
81 return leftMvt.volume >= 200 or leftMvt.volume*opposedMvt.volume/opposedMvt.nLanes > 50000 68 return leftMvt.volume >= 200 or leftMvt.volume*opposedThroughMvt.volume/opposedThroughMvt.nLanes > 50000
82 69
83 def optimalCycle(lostTime, criticalCharge): 70 def optimalCycle(lostTime, criticalCharge, rounding=True):
84 return ceil((1.5*lostTime+5)/(1-criticalCharge)) 71 if rounding:
72 return ceil((1.5*lostTime+5)/(1-criticalCharge))
73 else:
74 return (1.5*lostTime+5)/(1-criticalCharge)
75
76 class Cycle:
77 '''Class to compute optimal cycle and the split of effective green times'''
78 def __init__(self, phases, lostTime, saturationVolume):
79 '''phases is a list of phases
80 a phase is a list of lanegroups'''
81 self.phases = phases
82 self.lostTime = lostTime
83 self.saturationVolume = saturationVolume
84
85 def computeCycle(self):
86 self.criticalCharges = []
87 for phase in self.phases:
88 self.criticalCharges.append(max([lg.getTVUVolume() for lg in phase])/(lg.nLanes*self.saturationVolume))
89
90 self.criticalCharge = sum(self.criticalCharges)
91 self.C0 = optimalCycle(self.lostTime, self.criticalCharge)
92 return self.C0
93
94 def computeEffectiveGreen(self):
95 from numpy import round
96 self.computeCycle() # in case it was not done before
97 effectiveGreenTime = self.C0-self.lostTime
98 self.effectiveGreens = [round(c*effectiveGreenTime/self.criticalCharge,1) for c in self.criticalCharges]
99 return self.effectiveGreens
100
85 101
86 def computeInterGreen(perceptionReactionTime, initialSpeed, intersectionLength, vehicleAverageLength = 6, deceleration = 3): 102 def computeInterGreen(perceptionReactionTime, initialSpeed, intersectionLength, vehicleAverageLength = 6, deceleration = 3):
87 '''Computes the intergreen time (yellow/amber plus all red time) 103 '''Computes the intergreen time (yellow/amber plus all red time)
88 Deceleration is positive 104 Deceleration is positive
89 All variables should be in the same units''' 105 All variables should be in the same units'''