Mercurial > hg > nsaunier > traffic-intelligence
comparison trafficintelligence/traffic_engineering.py @ 1176:5874ece33637
reorganized fundamental diagram and added triangular
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Thu, 17 Feb 2022 10:55:11 -0500 |
| parents | c5863e04d302 |
| children | fa07a78b29f6 |
comparison
equal
deleted
inserted
replaced
| 1175:35725db5e83f | 1176:5874ece33637 |
|---|---|
| 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 from math import ceil | 4 from math import ceil |
| 5 from numpy import e, log, arange | |
| 6 | |
| 7 from matplotlib.pyplot import figure,plot,xlabel,ylabel, xlim, ylim | |
| 5 | 8 |
| 6 from trafficintelligence import prediction | 9 from trafficintelligence import prediction |
| 7 | 10 |
| 8 ######################### | 11 ######################### |
| 9 # Simulation | 12 # Simulation |
| 118 def averageNQueued(self): | 121 def averageNQueued(self): |
| 119 return self.totalDelay()/self.queueingDuration() | 122 return self.totalDelay()/self.queueingDuration() |
| 120 | 123 |
| 121 | 124 |
| 122 ######################### | 125 ######################### |
| 123 # fundamental diagram | 126 # fundamental diagrams |
| 124 ######################### | 127 ######################### |
| 125 | 128 |
| 126 class FundamentalDiagram(object): | 129 class FundamentalDiagram(object): |
| 127 ''' ''' | 130 ''' ''' |
| 128 def __init__(self, name): | 131 def __init__(self, name): |
| 129 self.name = name | 132 self.name = name |
| 133 self.kj = None | |
| 134 self.kc = None | |
| 135 self.vf = None | |
| 136 self.qmax = None | |
| 137 | |
| 138 def getJamDensity(self): | |
| 139 return self.kj | |
| 140 | |
| 141 def getCriticalDensity(self): | |
| 142 return self.kc | |
| 143 | |
| 144 def getCapacity(self): | |
| 145 return self.qmax | |
| 146 | |
| 147 def getFreeFlowSpeed(self): | |
| 148 return self.vf | |
| 130 | 149 |
| 131 def q(self, k): | 150 def q(self, k): |
| 132 return k*self.v(k) | 151 return k*self.v(k) |
| 133 | 152 |
| 134 @staticmethod | 153 @staticmethod |
| 138 @staticmethod | 157 @staticmethod |
| 139 def meanSpacing(q): | 158 def meanSpacing(q): |
| 140 return 1/q | 159 return 1/q |
| 141 | 160 |
| 142 def plotVK(self, language='fr', units={}): | 161 def plotVK(self, language='fr', units={}): |
| 143 from numpy import arange | |
| 144 from matplotlib.pyplot import figure,plot,xlabel,ylabel | |
| 145 densities = [k for k in arange(1, self.kj+1)] | 162 densities = [k for k in arange(1, self.kj+1)] |
| 146 figure() | 163 figure() |
| 147 plot(densities, [self.v(k) for k in densities]) | 164 plot(densities, [self.v(k) for k in densities]) |
| 165 xlim(xmin=0) | |
| 166 ylim(ymin=0) | |
| 148 xlabel('Densite (veh/km)') # todo other languages and adapt to units | 167 xlabel('Densite (veh/km)') # todo other languages and adapt to units |
| 149 ylabel('Vitesse (km/h)') | 168 ylabel('Vitesse (km/h)') |
| 150 | 169 |
| 151 def plotQK(self, language='fr', units={}): | 170 def plotQK(self, language='fr', units={}): |
| 152 from numpy import arange | |
| 153 from matplotlib.pyplot import figure,plot,xlabel,ylabel | |
| 154 densities = [k for k in arange(1, self.kj+1)] | 171 densities = [k for k in arange(1, self.kj+1)] |
| 155 figure() | 172 figure() |
| 156 plot(densities, [self.q(k) for k in densities]) | 173 plot(densities, [self.q(k) for k in densities]) |
| 174 xlim(xmin=0) | |
| 175 ylim(ymin=0) | |
| 157 xlabel('Densite (veh/km)') # todo other languages and adapt to units | 176 xlabel('Densite (veh/km)') # todo other languages and adapt to units |
| 158 ylabel('Debit (km/h)') | 177 ylabel('Debit (km/h)') |
| 159 | 178 |
| 179 class GreenshieldsFD(FundamentalDiagram): | |
| 180 '''Speed is a linear function of density''' | |
| 181 def __init__(self, vf, kj): | |
| 182 FundamentalDiagram.__init__(self,'Greenshields') | |
| 183 self.vf=vf | |
| 184 self.kj=kj | |
| 185 self.kc=kj/2 | |
| 186 self.qmax=vf*kj/4 | |
| 187 | |
| 188 def v(self,k): | |
| 189 from numpy import log | |
| 190 return self.vmax*(1-k/self.kj) | |
| 191 | |
| 192 | |
| 160 class GreenbergFD(FundamentalDiagram): | 193 class GreenbergFD(FundamentalDiagram): |
| 161 '''Speed is the logarithm of density''' | 194 '''Speed is the logarithm of density''' |
| 162 def __init__(self, vc, kj): | 195 def __init__(self, vc, kj): |
| 163 FundamentalDiagram.__init__(self,'Greenberg') | 196 FundamentalDiagram.__init__(self,'Greenberg') |
| 164 self.vc=vc | 197 self.vc=vc |
| 165 self.kj=kj | 198 self.kj=kj |
| 199 self.qmax = self.kc*self.vc | |
| 200 self.kc = self.kj/e | |
| 166 | 201 |
| 167 def v(self,k): | 202 def v(self,k): |
| 168 from numpy import log | |
| 169 return self.vc*log(self.kj/k) | 203 return self.vc*log(self.kj/k) |
| 170 | 204 |
| 171 def criticalDensity(self): | 205 class TriangularFD(FundamentalDiagram): |
| 172 from numpy import e | 206 def __init__(self, vf = None, kc = None, kj = None, qmax = None, w = None): |
| 173 self.kc = self.kj/e | 207 FundamentalDiagram.__init__(self,'Triangular') |
| 174 return self.kc | 208 if vf is not None and qmax is not None and kj is not None: |
| 175 | 209 self.vf=vf |
| 176 def capacity(self): | 210 self.qmax = qmax |
| 177 self.qmax = self.kc*self.vc | 211 self.kj = kj |
| 178 return self.qmax | 212 self.kc = qmax/vf |
| 179 | 213 self.w = qmax/(self.kc-kj) |
| 214 | |
| 215 def v(self, k): | |
| 216 if k<self.kc: | |
| 217 return self.vf | |
| 218 else: | |
| 219 return self.vf*self.kc*(self.kj/k-1)/(self.kj-self.kc) | |
| 220 | |
| 180 ######################### | 221 ######################### |
| 181 # intersection | 222 # intersection |
| 182 ######################### | 223 ######################### |
| 183 | 224 |
| 184 class FourWayIntersection(object): | 225 class FourWayIntersection(object): |
