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