Mercurial Hosting > 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): |