annotate python/traffic_engineering.py @ 148:ad21db62b785

bug correction for cosine functions in python
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Thu, 01 Sep 2011 16:44:23 -0400
parents 2bf5b76320c0
children c91c8fd8bf1e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
1 #! /usr/bin/env python
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
2 ''' Traffic Engineering Tools and Examples'''
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
3
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
4 from math import ceil
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
5
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
6 __metaclass__ = type
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
7
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
8
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
9 #########################
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
10 # fundamental diagram
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
11 #########################
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
12
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
13 class FundamentalDiagram:
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
14 ''' '''
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
15 def __init__(self, name):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
16 self.name = name
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
17
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
18 def q(self, k):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
19 return k*self.v(k)
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
20
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
21 @staticmethod
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
22 def meanHeadway(k):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
23 return 1/k
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
24
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
25 @staticmethod
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
26 def meanSpacing(q):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
27 return 1/q
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
28
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
29 def plotVK(self, language='fr', units={}):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
30 from numpy import arange
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
31 from matplotlib.pyplot import figure,plot,xlabel,ylabel
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
32 densities = [k for k in arange(1, self.kj+1)]
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
33 figure()
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
34 plot(densities, [self.v(k) for k in densities])
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
35 xlabel('Densite (veh/km)') # todo other languages and adapt to units
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
36 ylabel('Vitesse (km/h)')
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
37
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
38 def plotQK(self, language='fr', units={}):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
39 from numpy import arange
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
40 from matplotlib.pyplot import figure,plot,xlabel,ylabel
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
41 densities = [k for k in arange(1, self.kj+1)]
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
42 figure()
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
43 plot(densities, [self.q(k) for k in densities])
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
44 xlabel('Densite (veh/km)') # todo other languages and adapt to units
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
45 ylabel('Debit (km/h)')
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
46
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
47 class GreenbergFD(FundamentalDiagram):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
48 '''Speed is the logarithm of density'''
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
49 def __init__(self, vc, kj):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
50 FundamentalDiagram.__init__(self,'Greenberg')
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
51 self.vc=vc
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
52 self.kj=kj
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
53
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
54 def v(self,k):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
55 from numpy import log
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
56 return self.vc*log(self.kj/k)
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
57
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
58 def criticalDensity(self):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
59 from numpy import e
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
60 self.kc = self.kj/e
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
61 return self.kc
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
62
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
63 def capacity(self):
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
64 self.qmax = self.kc*self.vc
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
65 return self.qmax
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
66
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
67 #########################
116
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
68 # intersection
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
69 #########################
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
70
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
71 class FourWayIntersection:
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
72 '''Simple class for simple intersection outline'''
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
73 def __init__(self, dimension, coordX, coordY):
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
74 self.dimension = dimension
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
75 self.coordX = coordX
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
76 self.coordY = coordY
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
77
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
78 def plot(self, options = 'k'):
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
79 from matplotlib.pyplot import plot, axis
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
80
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
81 minX = min(self.dimension[0])
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
82 maxX = max(self.dimension[0])
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
83 minY = min(self.dimension[1])
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
84 maxY = max(self.dimension[1])
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
85
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
86 plot([minX, self.coordX[0], self.coordX[0]], [self.coordY[0], self.coordY[0], minY],options)
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
87 plot([self.coordX[1], self.coordX[1], maxX], [minY, self.coordY[0], self.coordY[0]],options)
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
88 plot([minX, self.coordX[0], self.coordX[0]], [self.coordY[1], self.coordY[1], maxY],options)
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
89 plot([self.coordX[1], self.coordX[1], maxX], [maxY, self.coordY[1], self.coordY[1]],options)
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
90 axis('equal')
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
91
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
92 #########################
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
93 # traffic signals
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
94 #########################
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
95
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
96 class Volume:
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
97 '''Class to represent volumes with varied vehicule types '''
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
98 def __init__(self, volume, types = ['pc'], proportions = [1], equivalents = [1], nLanes = 1):
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
99 '''mvtEquivalent is the equivalent if the movement is right of left turn'''
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
100
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
101 # check the sizes of the lists
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
102 if sum(proportions) == 1:
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
103 self.volume = volume
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
104 self.types = types
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
105 self.proportions = proportions
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
106 self.equivalents = equivalents
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
107 self.nLanes = nLanes
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
108 else:
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
109 pass
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
110
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
111 def getPCEVolume(self):
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
112 '''Returns the passenger-car equivalent for the input volume'''
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
113 v = 0
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
114 for p, e in zip(self.proportions, self.equivalents):
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
115 v += p*e
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
116 return v*self.volume
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
117
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
118 class IntersectionMovement:
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
119 '''Represents an intersection movement
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
120 with a volume, a type (through, left or right)
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
121 and an equivalent for movement type'''
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
122 def __init__(self, volume, type, mvtEquivalent = 1):
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
123 self.volume = volume
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
124 self.type = type
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
125 self.mvtEquivalent = mvtEquivalent
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
126
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
127 def getTVUVolume(self):
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
128 return self.mvtEquivalent*self.volume.getPCEVolume()
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
129
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
130 class IntersectionApproach:
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
131 def __init__(self, leftTurnVolume, throughVolume, rightTurnVolume):
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
132 self.leftTurnVolume = leftTurnVolume
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
133 self.throughVolume = throughVolume
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
134 self.rightTurnVolume = rightTurnVolume
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
135
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
136 def getTVUVolume(self, leftTurnEquivalent = 1, throughEquivalent = 1, rightTurnEquivalent = 1):
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
137 return self.leftTurnVolume.getPCEVolume()*leftTurnEquivalent+self.throughVolume.getPCEVolume()*throughEquivalent+self.rightTurnVolume.getPCEVolume()*rightTurnEquivalent
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
138
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
139 class LaneGroup:
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
140 '''Class that represents a group of mouvements'''
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
141
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
142 def __init__(self, movements, nLanes):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
143 self.movements = movements
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
144 self.nLanes = nLanes
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
145
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
146 def getTVUVolume(self):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
147 return sum([mvt.getTVUVolume() for mvt in self.movements])
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
148
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
149 def checkProtectedLeftTurn(leftMvt, opposedThroughMvt):
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
150 '''Checks if one of the main two conditions on left turn is verified
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
151 The lane groups should contain left and through movement'''
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
152 return leftMvt.volume >= 200 or leftMvt.volume*opposedThroughMvt.volume/opposedThroughMvt.nLanes > 50000
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
153
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
154 def optimalCycle(lostTime, criticalCharge, rounding=True):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
155 if rounding:
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
156 return ceil((1.5*lostTime+5)/(1-criticalCharge))
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
157 else:
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
158 return (1.5*lostTime+5)/(1-criticalCharge)
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
159
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
160 class Cycle:
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
161 '''Class to compute optimal cycle and the split of effective green times'''
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
162 def __init__(self, phases, lostTime, saturationVolume):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
163 '''phases is a list of phases
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
164 a phase is a list of lanegroups'''
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
165 self.phases = phases
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
166 self.lostTime = lostTime
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
167 self.saturationVolume = saturationVolume
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
168
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
169 def computeCycle(self):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
170 self.criticalCharges = []
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
171 for phase in self.phases:
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
172 self.criticalCharges.append(max([lg.getTVUVolume() for lg in phase])/(lg.nLanes*self.saturationVolume))
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
173
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
174 self.criticalCharge = sum(self.criticalCharges)
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
175 self.C0 = optimalCycle(self.lostTime, self.criticalCharge)
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
176 return self.C0
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
177
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
178 def computeEffectiveGreen(self):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
179 from numpy import round
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
180 self.computeCycle() # in case it was not done before
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
181 effectiveGreenTime = self.C0-self.lostTime
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
182 self.effectiveGreens = [round(c*effectiveGreenTime/self.criticalCharge,1) for c in self.criticalCharges]
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
183 return self.effectiveGreens
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
184
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
185
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
186 def computeInterGreen(perceptionReactionTime, initialSpeed, intersectionLength, vehicleAverageLength = 6, deceleration = 3):
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
187 '''Computes the intergreen time (yellow/amber plus all red time)
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
188 Deceleration is positive
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
189 All variables should be in the same units'''
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
190 if deceleration > 0:
36
571b11304ec9 corrected bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 34
diff changeset
191 return [perceptionReactionTime+float(initialSpeed)/(2*deceleration), float(intersectionLength+vehicleAverageLength)/initialSpeed]
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
192 else:
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
193 print 'Issue deceleration should be strictly positive'
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
194 return None
37
911b52744ceb added uniform delay function
Nicolas Saunier <nico@confins.net>
parents: 36
diff changeset
195
911b52744ceb added uniform delay function
Nicolas Saunier <nico@confins.net>
parents: 36
diff changeset
196 def uniformDelay(cycleLength, effectiveGreen, saturationDegree):
911b52744ceb added uniform delay function
Nicolas Saunier <nico@confins.net>
parents: 36
diff changeset
197 '''Computes the uniform delay'''
911b52744ceb added uniform delay function
Nicolas Saunier <nico@confins.net>
parents: 36
diff changeset
198 return 0.5*cycleLength*(1-float(effectiveGreen)/cycleLength)/(1-float(effectiveGreen*saturationDegree)/cycleLength)
87
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
199
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
200 #########################
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
201 # misc
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
202 #########################
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
203
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
204 def timeChangingSpeed(v0, vf, a, TPR):
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
205 return TPR+(vf-v0)/a
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
206
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
207 def distanceChangingSpeed(v0, vf, a, TPR):
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
208 return TPR*v0+(vf*vf-v0*v0)/(2*a)