Mercurial Hosting > traffic-intelligence
annotate trafficintelligence/traffic_engineering.py @ 1029:c6cf75a2ed08
reorganization of imports
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Mon, 18 Jun 2018 22:50:59 -0400 |
parents | cc5cb04b04b0 |
children | c5863e04d302 |
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 |
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
4 from math import ceil |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
5 |
1029
c6cf75a2ed08
reorganization of imports
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1028
diff
changeset
|
6 from trafficintelligence import prediction |
73
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
7 |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
8 ######################### |
198
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
9 # Simulation |
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
10 ######################### |
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
11 |
479
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
12 def generateTimeHeadways(meanTimeHeadway, simulationTime): |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
13 '''Generates the time headways between arrivals |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
14 given the meanTimeHeadway and the negative exponential distribution |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
15 over a time interval of length simulationTime (assumed to be in same time unit as headway''' |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
16 from random import expovariate |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
17 headways = [] |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
18 totalTime = 0 |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
19 flow = 1/meanTimeHeadway |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
20 while totalTime < simulationTime: |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
21 h = expovariate(flow) |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
22 headways.append(h) |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
23 totalTime += h |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
24 return headways |
7828fec8bbd2
added function to generate headways based on flow or mean headway over some simulation period
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
314
diff
changeset
|
25 |
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
26 class RoadUser(object): |
652
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
27 '''Simple example of inheritance to plot different road users ''' |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
28 def __init__(self, position, velocity): |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
29 'Both fields are 2D numpy arrays' |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
30 self.position = position.astype(float) |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
31 self.velocity = velocity.astype(float) |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
32 |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
33 def move(self, deltaT): |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
34 self.position += deltaT*self.velocity |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
35 |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
36 def draw(self, init = False): |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
37 from matplotlib.pyplot import plot |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
38 if init: |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
39 self.plotLine = plot(self.position[0], self.position[1], self.getDescriptor())[0] |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
40 else: |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
41 self.plotLine.set_data(self.position[0], self.position[1]) |
300
f65b828e5521
working on trajectory simulation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
206
diff
changeset
|
42 |
f65b828e5521
working on trajectory simulation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
206
diff
changeset
|
43 |
652
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
44 class PassengerVehicle(RoadUser): |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
45 def getDescriptor(self): |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
46 return 'dr' |
300
f65b828e5521
working on trajectory simulation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
206
diff
changeset
|
47 |
652
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
48 class Pedestrian(RoadUser): |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
49 def getDescriptor(self): |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
50 return 'xb' |
198
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
51 |
652
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
52 class Cyclist(RoadUser): |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
53 def getDescriptor(self): |
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
54 return 'og' |
198
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
55 |
790
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
56 ######################### |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
57 # queueing models |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
58 ######################### |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
59 |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
60 class CapacityReduction(object): |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
61 def __init__(self, beta, reductionDuration, demandCapacityRatio = None, demand = None, capacity = None): |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
62 '''reduction duration should be positive |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
63 demandCapacityRatio is demand/capacity (q/s)''' |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
64 if demandCapacityRatio is None and demand is None and capacity is None: |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
65 print('Missing too much information (demand, capacity and ratio)') |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
66 import sys |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
67 sys.exit() |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
68 if 0 <= beta < 1: |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
69 self.beta = beta |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
70 self.reductionDuration = reductionDuration |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
71 |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
72 if demandCapacityRatio is not None: |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
73 self.demandCapacityRatio = demandCapacityRatio |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
74 if demand is not None: |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
75 self.demand = demand |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
76 if capacity is not None: |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
77 self.capacity = capacity |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
78 if capacity is not None and demand is not None: |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
79 self.demandCapacityRatio = float(self.demand)/self.capacity |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
80 if demand <= beta*capacity: |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
81 print('There is no queueing as the demand {} is inferior to the reduced capacity {}'.format(demand, beta*capacity)) |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
82 else: |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
83 print('reduction coefficient (beta={}) is not in [0, 1['.format(beta)) |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
84 |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
85 def queueingDuration(self): |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
86 return self.reductionDuration*(1-self.beta)/(1-self.demandCapacityRatio) |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
87 |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
88 def nArrived(self, t): |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
89 if self.demand is None: |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
90 print('Missing demand field') |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
91 return None |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
92 return self.demand*t |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
93 |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
94 def nServed(self, t): |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
95 if self.capacity is None: |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
96 print('Missing capacity field') |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
97 return None |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
98 if 0<=t<=self.reductionDuration: |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
99 return self.beta*self.capacity*t |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
100 elif self.reductionDuration < t <= self.queueingDuration(): |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
101 return self.beta*self.capacity*self.reductionDuration+self.capacity*(t-self.reductionDuration) |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
102 |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
103 def nQueued(self, t): |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
104 return self.nArrived(t)-self.nServed(t) |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
105 |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
106 def maxNQueued(self): |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
107 return self.nQueued(self.reductionDuration) |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
108 |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
109 def totalDelay(self): |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
110 if self.capacity is None: |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
111 print('Missing capacity field') |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
112 return None |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
113 return self.capacity*self.reductionDuration**2*(1-self.beta)*(self.demandCapacityRatio-self.beta)/(2*(1-self.demandCapacityRatio)) |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
114 |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
115 def averageDelay(self): |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
116 return self.reductionDuration*(self.demandCapacityRatio-self.beta)/(2*self.demandCapacityRatio) |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
117 |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
118 def averageNQueued(self): |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
119 return self.totalDelay()/self.queueingDuration() |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
120 |
198
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
121 |
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
122 ######################### |
73
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
123 # 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
|
124 ######################### |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
125 |
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
126 class FundamentalDiagram(object): |
73
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
127 ''' ''' |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
128 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
|
129 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
|
130 |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
131 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
|
132 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
|
133 |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
134 @staticmethod |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
135 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
|
136 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
|
137 |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
138 @staticmethod |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
139 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
|
140 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
|
141 |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
142 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
|
143 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
|
144 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
|
145 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
|
146 figure() |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
147 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
|
148 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
|
149 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
|
150 |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
151 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
|
152 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
|
153 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
|
154 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
|
155 figure() |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
156 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
|
157 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
|
158 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
|
159 |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
160 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
|
161 '''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
|
162 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
|
163 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
|
164 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
|
165 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
|
166 |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
167 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
|
168 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
|
169 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
|
170 |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
171 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
|
172 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
|
173 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
|
174 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
|
175 |
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
176 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
|
177 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
|
178 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
|
179 |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
180 ######################### |
116
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
181 # intersection |
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
182 ######################### |
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
183 |
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
184 class FourWayIntersection(object): |
116
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
185 '''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
|
186 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
|
187 self.dimension = dimension |
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
188 self.coordX = coordX |
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
189 self.coordY = coordY |
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
190 |
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
191 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
|
192 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
|
193 |
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
194 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
|
195 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
|
196 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
|
197 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
|
198 |
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
199 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
|
200 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
|
201 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
|
202 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
|
203 axis('equal') |
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
204 |
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
205 ######################### |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
206 # traffic signals |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
207 ######################### |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
208 |
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
209 class Volume(object): |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
210 '''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
|
211 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
|
212 '''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
|
213 |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
214 # check the sizes of the lists |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
215 if sum(proportions) == 1: |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
216 self.volume = volume |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
217 self.types = types |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
218 self.proportions = proportions |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
219 self.equivalents = equivalents |
314
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
220 self.nLanes = nLanes |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
221 else: |
302
9d88a4d97473
corrected bug in compute-homography
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
300
diff
changeset
|
222 print('Proportions do not sum to 1') |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
223 pass |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
224 |
314
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
225 def checkProtected(self, opposedThroughMvt): |
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
226 '''Checks if this left movement should be protected, |
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
227 ie if one of the main two conditions on left turn is verified''' |
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
228 return self.volume >= 200 or self.volume*opposedThroughMvt.volume/opposedThroughMvt.nLanes > 50000 |
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
229 |
205
aeaaf5579b46
minor changes to traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
198
diff
changeset
|
230 def getPCUVolume(self): |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
231 '''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
|
232 v = 0 |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
233 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
|
234 v += p*e |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
235 return v*self.volume |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
236 |
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
237 class IntersectionMovement(object): |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
238 '''Represents an intersection movement |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
239 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
|
240 and an equivalent for movement type''' |
205
aeaaf5579b46
minor changes to traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
198
diff
changeset
|
241 def __init__(self, volume, mvtEquivalent = 1): |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
242 self.volume = volume |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
243 self.mvtEquivalent = mvtEquivalent |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
244 |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
245 def getTVUVolume(self): |
205
aeaaf5579b46
minor changes to traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
198
diff
changeset
|
246 return self.mvtEquivalent*self.volume.getPCUVolume() |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
247 |
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
248 class LaneGroup(object): |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
249 '''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
|
250 |
34 | 251 def __init__(self, movements, nLanes): |
252 self.movements = movements | |
253 self.nLanes = nLanes | |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
254 |
34 | 255 def getTVUVolume(self): |
256 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
|
257 |
206
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
258 def getCharge(self, saturationVolume): |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
259 return self.getTVUVolume()/(self.nLanes*saturationVolume) |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
260 |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
261 def optimalCycle(lostTime, criticalCharge): |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
262 return (1.5*lostTime+5)/(1-criticalCharge) |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
263 |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
264 def minimumCycle(lostTime, criticalCharge, degreeSaturation=1.): |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
265 'degree of saturation can be used as the peak hour factor too' |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
266 return lostTime/(1-criticalCharge/degreeSaturation) |
34 | 267 |
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
268 class Cycle(object): |
34 | 269 '''Class to compute optimal cycle and the split of effective green times''' |
270 def __init__(self, phases, lostTime, saturationVolume): | |
271 '''phases is a list of phases | |
272 a phase is a list of lanegroups''' | |
273 self.phases = phases | |
274 self.lostTime = lostTime | |
275 self.saturationVolume = saturationVolume | |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
276 |
206
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
277 def computeCriticalCharges(self): |
314
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
278 self.criticalCharges = [max([lg.getCharge(self.saturationVolume) for lg in phase]) for phase in self.phases] |
34 | 279 self.criticalCharge = sum(self.criticalCharges) |
206
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
280 |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
281 def computeOptimalCycle(self): |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
282 self.computeCriticalCharges() |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
283 self.C = optimalCycle(self.lostTime, self.criticalCharge) |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
284 return self.C |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
285 |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
286 def computeMinimumCycle(self, degreeSaturation=1.): |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
287 self.computeCriticalCharges() |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
288 self.C = minimumCycle(self.lostTime, self.criticalCharge, degreeSaturation) |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
289 return self.C |
34 | 290 |
291 def computeEffectiveGreen(self): | |
314
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
292 #from numpy import round |
206
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
293 #self.computeCycle() # in case it was not done before |
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
294 effectiveGreenTime = self.C-self.lostTime |
34 | 295 self.effectiveGreens = [round(c*effectiveGreenTime/self.criticalCharge,1) for c in self.criticalCharges] |
296 return self.effectiveGreens | |
297 | |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
298 |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
299 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
|
300 '''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
|
301 Deceleration is positive |
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
302 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
|
303 if deceleration > 0: |
36 | 304 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
|
305 else: |
992
2cd1ce245024
update to python 3
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
796
diff
changeset
|
306 print('Issue deceleration should be strictly positive') |
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
307 return None |
37
911b52744ceb
added uniform delay function
Nicolas Saunier <nico@confins.net>
parents:
36
diff
changeset
|
308 |
911b52744ceb
added uniform delay function
Nicolas Saunier <nico@confins.net>
parents:
36
diff
changeset
|
309 def uniformDelay(cycleLength, effectiveGreen, saturationDegree): |
911b52744ceb
added uniform delay function
Nicolas Saunier <nico@confins.net>
parents:
36
diff
changeset
|
310 '''Computes the uniform delay''' |
796 | 311 return 0.5*cycleLength*(1-float(effectiveGreen)/cycleLength)**2/(1-float(effectiveGreen*saturationDegree)/cycleLength) |
312 | |
313 def randomDelay(volume, saturationDegree): | |
314 '''Computes the random delay = queueing time for M/D/1''' | |
315 return saturationDegree**2/(2*volume*(1-saturationDegree)) | |
87
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
316 |
790
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
317 def incrementalDelay(T, X, c, k=0.5, I=1): |
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
318 '''Computes the incremental delay (HCM) |
493
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
319 T in hours |
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
320 c capacity of the lane group |
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
321 k default for fixed time signal |
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
322 I=1 for isolated intersection (Poisson arrival)''' |
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
323 from math import sqrt |
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
324 return 900*T*(X - 1 + sqrt((X - 1)**2 + 8*k*I*X/(c*T))) |
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
325 |
87
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
326 ######################### |
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
327 # misc |
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
328 ######################### |
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
329 |
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
330 def timeChangingSpeed(v0, vf, a, TPR): |
789 | 331 'for decelerations, a < 0' |
332 return TPR-(vf-v0)/a | |
87
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
333 |
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
334 def distanceChangingSpeed(v0, vf, a, TPR): |
789 | 335 'for decelerations, a < 0' |
336 return TPR*v0-(vf**2-v0**2)/(2*a) |