Mercurial > hg > nsaunier > traffic-intelligence
comparison python/traffic_engineering.py @ 790:944949c8ef3e dev
minor name change
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Wed, 13 Apr 2016 23:03:43 -0400 |
| parents | 3666342dabe2 |
| children | 9f8e9fb5621b |
comparison
equal
deleted
inserted
replaced
| 789:3666342dabe2 | 790:944949c8ef3e |
|---|---|
| 52 | 52 |
| 53 class Cyclist(RoadUser): | 53 class Cyclist(RoadUser): |
| 54 def getDescriptor(self): | 54 def getDescriptor(self): |
| 55 return 'og' | 55 return 'og' |
| 56 | 56 |
| 57 ######################### | |
| 58 # queueing models | |
| 59 ######################### | |
| 60 | |
| 61 class CapacityReduction(object): | |
| 62 def __init__(self, beta, reductionDuration, demandCapacityRatio = None, demand = None, capacity = None): | |
| 63 '''reduction duration should be positive | |
| 64 demandCapacityRatio is demand/capacity (q/s)''' | |
| 65 if demandCapacityRatio is None and demand is None and capacity is None: | |
| 66 print('Missing too much information (demand, capacity and ratio)') | |
| 67 import sys | |
| 68 sys.exit() | |
| 69 if 0 <= beta < 1: | |
| 70 self.beta = beta | |
| 71 self.reductionDuration = reductionDuration | |
| 72 | |
| 73 if demandCapacityRatio is not None: | |
| 74 self.demandCapacityRatio = demandCapacityRatio | |
| 75 if demand is not None: | |
| 76 self.demand = demand | |
| 77 if capacity is not None: | |
| 78 self.capacity = capacity | |
| 79 if capacity is not None and demand is not None: | |
| 80 self.demandCapacityRatio = float(self.demand)/self.capacity | |
| 81 if demand <= beta*capacity: | |
| 82 print('There is no queueing as the demand {} is inferior to the reduced capacity {}'.format(demand, beta*capacity)) | |
| 83 else: | |
| 84 print('reduction coefficient (beta={}) is not in [0, 1['.format(beta)) | |
| 85 | |
| 86 def queueingDuration(self): | |
| 87 return self.reductionDuration*(1-self.beta)/(1-self.demandCapacityRatio) | |
| 88 | |
| 89 def nArrived(self, t): | |
| 90 if self.demand is None: | |
| 91 print('Missing demand field') | |
| 92 return None | |
| 93 return self.demand*t | |
| 94 | |
| 95 def nServed(self, t): | |
| 96 if self.capacity is None: | |
| 97 print('Missing capacity field') | |
| 98 return None | |
| 99 if 0<=t<=self.reductionDuration: | |
| 100 return self.beta*self.capacity*t | |
| 101 elif self.reductionDuration < t <= self.queueingDuration(): | |
| 102 return self.beta*self.capacity*self.reductionDuration+self.capacity*(t-self.reductionDuration) | |
| 103 | |
| 104 def nQueued(self, t): | |
| 105 return self.nArrived(t)-self.nServed(t) | |
| 106 | |
| 107 def maxNQueued(self): | |
| 108 return self.nQueued(self.reductionDuration) | |
| 109 | |
| 110 def totalDelay(self): | |
| 111 if self.capacity is None: | |
| 112 print('Missing capacity field') | |
| 113 return None | |
| 114 return self.capacity*self.reductionDuration**2*(1-self.beta)*(self.demandCapacityRatio-self.beta)/(2*(1-self.demandCapacityRatio)) | |
| 115 | |
| 116 def averageDelay(self): | |
| 117 return self.reductionDuration*(self.demandCapacityRatio-self.beta)/(2*self.demandCapacityRatio) | |
| 118 | |
| 119 def averageNQueued(self): | |
| 120 return self.totalDelay()/self.queueingDuration() | |
| 121 | |
| 57 | 122 |
| 58 ######################### | 123 ######################### |
| 59 # fundamental diagram | 124 # fundamental diagram |
| 60 ######################### | 125 ######################### |
| 61 | 126 |
| 244 | 309 |
| 245 def uniformDelay(cycleLength, effectiveGreen, saturationDegree): | 310 def uniformDelay(cycleLength, effectiveGreen, saturationDegree): |
| 246 '''Computes the uniform delay''' | 311 '''Computes the uniform delay''' |
| 247 return 0.5*cycleLength*(1-float(effectiveGreen)/cycleLength)/(1-float(effectiveGreen*saturationDegree)/cycleLength) | 312 return 0.5*cycleLength*(1-float(effectiveGreen)/cycleLength)/(1-float(effectiveGreen*saturationDegree)/cycleLength) |
| 248 | 313 |
| 249 def overflowDelay(T, X, c, k=0.5, I=1): | 314 def incrementalDelay(T, X, c, k=0.5, I=1): |
| 250 '''Computes the overflow delay (HCM) | 315 '''Computes the incremental delay (HCM) |
| 251 T in hours | 316 T in hours |
| 252 c capacity of the lane group | 317 c capacity of the lane group |
| 253 k default for fixed time signal | 318 k default for fixed time signal |
| 254 I=1 for isolated intersection (Poisson arrival)''' | 319 I=1 for isolated intersection (Poisson arrival)''' |
| 255 from math import sqrt | 320 from math import sqrt |
