Mercurial > hg > nsaunier > traffic-intelligence
annotate trafficintelligence/traffic_engineering.py @ 1306:4bc0651d91f9 default tip
bug corrected generating last velocity twice and saving it (not saved, duplicated at loading time
| author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
|---|---|
| date | Mon, 30 Mar 2026 15:31:34 -0400 |
| parents | d828f3f76273 |
| children |
| 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 |
|
1176
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
5 from numpy import e, log, arange |
|
1297
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
6 from numpy.random import triangular |
|
1206
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
7 from scipy import stats |
|
1176
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
8 |
|
1297
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
9 from matplotlib.pyplot import figure, plot, xlabel, ylabel, xlim, ylim |
|
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
10 |
|
1029
c6cf75a2ed08
reorganization of imports
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1028
diff
changeset
|
11 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
|
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 ######################### |
|
198
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
14 # Simulation |
|
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
15 ######################### |
|
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
16 |
|
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
|
17 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
|
18 '''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
|
19 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
|
20 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
|
21 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
|
22 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
|
23 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
|
24 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
|
25 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
|
26 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
|
27 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
|
28 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
|
29 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
|
30 |
|
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
31 class RoadUser(object): |
|
1297
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
32 '''Simple example of inheritance to plot different road users (no history)''' |
|
652
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
33 def __init__(self, position, velocity): |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
34 'Both fields are 2D numpy arrays' |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
35 self.position = position.astype(float) |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
36 self.velocity = velocity.astype(float) |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
37 |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
38 def move(self, deltaT): |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
39 self.position += deltaT*self.velocity |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
40 |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
41 def draw(self, init = False): |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
42 if init: |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
43 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
|
44 else: |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
45 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
|
46 |
|
652
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
47 class PassengerVehicle(RoadUser): |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
48 def getDescriptor(self): |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
49 return 'dr' |
|
300
f65b828e5521
working on trajectory simulation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
206
diff
changeset
|
50 |
|
652
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
51 class Pedestrian(RoadUser): |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
52 def getDescriptor(self): |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
53 return 'xb' |
|
198
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
54 |
|
652
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
55 class Cyclist(RoadUser): |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
56 def getDescriptor(self): |
|
3b13ec964476
removed useless and buggy code
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
493
diff
changeset
|
57 return 'og' |
|
198
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
58 |
|
1297
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
59 class SLUser(object): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
60 '''Class for single lane road users |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
61 |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
62 Warning: does not work with decimal time, time must be integer based''' |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
63 def __init__(self, t0, x0, v0, sigma): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
64 'sigma is the width of the triangular distribution around 1 for speed noise in ]0,0.1]' |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
65 self.t = [t0] |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
66 self.x = [x0] |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
67 self.v = [v0] |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
68 self.sigma = max(0.001,min(0.1,sigma)) |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
69 self.left = 1.-self.sigma |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
70 self.right = 1.+self.sigma |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
71 |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
72 def getT(self): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
73 return self.t |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
74 |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
75 def existsAt(self, t): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
76 return t in self.t |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
77 |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
78 def getX(self): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
79 return self.x |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
80 |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
81 def getXAt(self, t): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
82 if self.existsAt(t): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
83 i = self.t.index(t) |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
84 return self.x[i] |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
85 else: |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
86 return None |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
87 |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
88 def getV(self): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
89 return self.v |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
90 |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
91 def getVAt(self, t): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
92 if self.existsAt(t): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
93 i = self.t.index(t) |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
94 return self.v[i] |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
95 else: |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
96 return None |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
97 |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
98 def update(self, a, deltat): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
99 self.t.append(self.t[-1]+1) |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
100 self.v.append(max(0,self.v[-1]+a*deltat*triangular(self.left,1., self.right))) |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
101 self.x.append(self.x[-1]+self.v[-1]*deltat) |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
102 |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
103 def plotX(self, deltat): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
104 plot([t*deltat for t in self.t], self.x) |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
105 |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
106 def plotV(self, deltat): |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
107 plot([t*deltat for t in self.t], self.v) |
|
c15b9fcdbcb1
developement for CIV8740 midterm
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1262
diff
changeset
|
108 |
|
790
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
109 ######################### |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
110 # queueing models |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
111 ######################### |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
112 |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
113 class CapacityReduction(object): |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
114 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
|
115 '''reduction duration should be positive |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
116 demandCapacityRatio is demand/capacity (q/s)''' |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
117 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
|
118 print('Missing too much information (demand, capacity and ratio)') |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
119 import sys |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
120 sys.exit() |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
121 if 0 <= beta < 1: |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
122 self.beta = beta |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
123 self.reductionDuration = reductionDuration |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
124 |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
125 if demandCapacityRatio is not None: |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
126 self.demandCapacityRatio = demandCapacityRatio |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
127 if demand is not None: |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
128 self.demand = demand |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
129 if capacity is not None: |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
130 self.capacity = capacity |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
131 if capacity is not None and demand is not None: |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
132 self.demandCapacityRatio = float(self.demand)/self.capacity |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
133 if demand <= beta*capacity: |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
134 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
|
135 else: |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
136 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
|
137 |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
138 def queueingDuration(self): |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
139 return self.reductionDuration*(1-self.beta)/(1-self.demandCapacityRatio) |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
140 |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
141 def nArrived(self, t): |
|
1259
3bfdb2ffd29d
modif for plotting nserved
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1206
diff
changeset
|
142 '''since the beginning of the capacity reduction''' |
|
3bfdb2ffd29d
modif for plotting nserved
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1206
diff
changeset
|
143 if self.demand is None or t<0: |
|
790
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
144 print('Missing demand field') |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
145 return None |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
146 return self.demand*t |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
147 |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
148 def nServed(self, t): |
|
1259
3bfdb2ffd29d
modif for plotting nserved
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1206
diff
changeset
|
149 '''since the beginning of the capacity reduction''' |
|
3bfdb2ffd29d
modif for plotting nserved
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1206
diff
changeset
|
150 if self.capacity is None or t<0: |
|
790
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
151 print('Missing capacity field') |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
152 return None |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
153 if 0<=t<=self.reductionDuration: |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
154 return self.beta*self.capacity*t |
|
1259
3bfdb2ffd29d
modif for plotting nserved
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1206
diff
changeset
|
155 elif self.reductionDuration < t: |
|
3bfdb2ffd29d
modif for plotting nserved
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1206
diff
changeset
|
156 qDuration = self.queueingDuration() |
|
3bfdb2ffd29d
modif for plotting nserved
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1206
diff
changeset
|
157 if t <= qDuration: |
|
3bfdb2ffd29d
modif for plotting nserved
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1206
diff
changeset
|
158 return self.beta*self.capacity*self.reductionDuration+self.capacity*(t-self.reductionDuration) |
|
3bfdb2ffd29d
modif for plotting nserved
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1206
diff
changeset
|
159 else: |
|
3bfdb2ffd29d
modif for plotting nserved
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1206
diff
changeset
|
160 return self.beta*self.capacity*self.reductionDuration+self.capacity*(qDuration-self.reductionDuration)+self.demand*(t-qDuration) |
|
790
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
161 |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
162 def nQueued(self, t): |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
163 return self.nArrived(t)-self.nServed(t) |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
164 |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
165 def maxNQueued(self): |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
166 return self.nQueued(self.reductionDuration) |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
167 |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
168 def totalDelay(self): |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
169 if self.capacity is None: |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
170 print('Missing capacity field') |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
171 return None |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
172 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
|
173 |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
174 def averageDelay(self): |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
175 return self.reductionDuration*(self.demandCapacityRatio-self.beta)/(2*self.demandCapacityRatio) |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
176 |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
177 def averageNQueued(self): |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
178 return self.totalDelay()/self.queueingDuration() |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
179 |
|
198
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
180 |
|
c91c8fd8bf1e
simple vehicle model with constant acceleration
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
116
diff
changeset
|
181 ######################### |
|
1176
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
182 # fundamental diagrams |
|
73
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
183 ######################### |
|
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
184 |
|
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
185 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
|
186 ''' ''' |
|
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
187 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
|
188 self.name = name |
|
1176
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
189 self.kj = None |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
190 self.kc = None |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
191 self.vf = None |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
192 self.qmax = None |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
193 |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
194 def getJamDensity(self): |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
195 return self.kj |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
196 |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
197 def getCriticalDensity(self): |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
198 return self.kc |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
199 |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
200 def getCapacity(self): |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
201 return self.qmax |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
202 |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
203 def getFreeFlowSpeed(self): |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
204 return self.vf |
|
73
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
205 |
|
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
206 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
|
207 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
|
208 |
|
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
209 @staticmethod |
|
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
210 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
|
211 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
|
212 |
|
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
213 @staticmethod |
|
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
214 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
|
215 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
|
216 |
|
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
217 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
|
218 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
|
219 figure() |
|
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
220 plot(densities, [self.v(k) for k in densities]) |
|
1176
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
221 xlim(xmin=0) |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
222 ylim(ymin=0) |
|
73
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
223 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
|
224 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
|
225 |
|
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
226 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
|
227 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
|
228 figure() |
|
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
229 plot(densities, [self.q(k) for k in densities]) |
|
1176
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
230 xlim(xmin=0) |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
231 ylim(ymin=0) |
|
73
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
232 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
|
233 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
|
234 |
|
1176
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
235 class GreenshieldsFD(FundamentalDiagram): |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
236 '''Speed is a linear function of density''' |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
237 def __init__(self, vf, kj): |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
238 FundamentalDiagram.__init__(self,'Greenshields') |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
239 self.vf=vf |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
240 self.kj=kj |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
241 self.kc=kj/2 |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
242 self.qmax=vf*kj/4 |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
243 |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
244 def v(self,k): |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
245 from numpy import log |
|
1198
fa07a78b29f6
minor modif, change to makefile for repo opencv installation
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1176
diff
changeset
|
246 return self.vf*(1-k/self.kj) |
|
1176
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
247 |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
248 |
|
73
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
249 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
|
250 '''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
|
251 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
|
252 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
|
253 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
|
254 self.kj=kj |
|
1176
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
255 self.qmax = self.kc*self.vc |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
256 self.kc = self.kj/e |
|
73
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
257 |
|
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
258 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
|
259 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
|
260 |
|
1176
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
261 class TriangularFD(FundamentalDiagram): |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
262 def __init__(self, vf = None, kc = None, kj = None, qmax = None, w = None): |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
263 FundamentalDiagram.__init__(self,'Triangular') |
|
1303
d828f3f76273
forgot update to triangular FD equations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1297
diff
changeset
|
264 if vf is not None and kj is not None: |
|
1176
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
265 self.vf=vf |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
266 self.kj = kj |
|
1303
d828f3f76273
forgot update to triangular FD equations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1297
diff
changeset
|
267 if qmax is not None: |
|
d828f3f76273
forgot update to triangular FD equations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1297
diff
changeset
|
268 self.qmax = qmax |
|
d828f3f76273
forgot update to triangular FD equations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1297
diff
changeset
|
269 self.kc = qmax/vf |
|
d828f3f76273
forgot update to triangular FD equations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1297
diff
changeset
|
270 self.w = qmax/(self.kc-kj) |
|
d828f3f76273
forgot update to triangular FD equations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1297
diff
changeset
|
271 elif kc is not None: |
|
d828f3f76273
forgot update to triangular FD equations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1297
diff
changeset
|
272 self.kc = kc |
|
d828f3f76273
forgot update to triangular FD equations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1297
diff
changeset
|
273 self.qmax = vf*kc |
|
d828f3f76273
forgot update to triangular FD equations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1297
diff
changeset
|
274 self.w = self.qmax/(self.kc-kj) |
|
73
930a6282c9a9
added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
37
diff
changeset
|
275 |
|
1176
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
276 def v(self, k): |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
277 if k<self.kc: |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
278 return self.vf |
|
5874ece33637
reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1165
diff
changeset
|
279 else: |
|
1303
d828f3f76273
forgot update to triangular FD equations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1297
diff
changeset
|
280 return self.qmax/(self.kj-self.kc)*(1-self.kj/k) |
|
1206
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
281 |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
282 def generateDensities(n, maxDensity): |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
283 return stats.uniform.rvs(size=n)*maxDensity |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
284 |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
285 def generateSpeedVolumes(fd, n, maxDensity, maxHGVProportion = 0, etrucks = 2.5): |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
286 densities = generateDensities(n, maxDensity) |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
287 speeds = [fd.v(k) for k in densities] |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
288 volumes = [fd.q(k) for k in densities] |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
289 if maxHGVProportion > 0: |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
290 hgvProportions = stats.uniform.rvs(size=n)*maxHGVProportion # en pourcent |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
291 volumes = [v/(1+(etrucks-1)*p/100) for v,p in zip(volumes, hgvProportions)] |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
292 else: |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
293 hgvProportions = None |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
294 return speeds, volumes, hgvProportions |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
295 |
|
1262
f10e84505443
modif for highway level of service
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1259
diff
changeset
|
296 higwayMaxDensityLOS = {'A':7, 'B':11, 'C':16, 'D':22, 'E': 28} |
|
f10e84505443
modif for highway level of service
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1259
diff
changeset
|
297 |
|
1206
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
298 def highwayLOS(k): |
|
770306fef827
moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1198
diff
changeset
|
299 'returns the highway level of service for density k in veh/km' |
|
1262
f10e84505443
modif for highway level of service
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1259
diff
changeset
|
300 for los, kmax in higwayMaxDensityLOS.items(): |
|
f10e84505443
modif for highway level of service
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1259
diff
changeset
|
301 if k<kmax: return los |
|
f10e84505443
modif for highway level of service
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1259
diff
changeset
|
302 return 'F' |
|
f10e84505443
modif for highway level of service
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1259
diff
changeset
|
303 |
|
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
304 ######################### |
|
116
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
305 # intersection |
|
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
306 ######################### |
|
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
307 |
|
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
308 class FourWayIntersection(object): |
|
116
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
309 '''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
|
310 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
|
311 self.dimension = dimension |
|
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
312 self.coordX = coordX |
|
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
313 self.coordY = coordY |
|
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
314 |
|
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
315 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
|
316 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
|
317 |
|
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
318 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
|
319 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
|
320 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
|
321 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
|
322 |
|
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
323 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
|
324 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
|
325 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
|
326 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
|
327 axis('equal') |
|
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
328 |
|
2bf5b76320c0
moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
87
diff
changeset
|
329 ######################### |
|
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
330 # traffic signals |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
331 ######################### |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
332 |
|
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
333 class Volume(object): |
|
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
334 '''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
|
335 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
|
336 '''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
|
337 |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
338 # check the sizes of the lists |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
339 if sum(proportions) == 1: |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
340 self.volume = volume |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
341 self.types = types |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
342 self.proportions = proportions |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
343 self.equivalents = equivalents |
|
314
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
344 self.nLanes = nLanes |
|
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
345 else: |
|
302
9d88a4d97473
corrected bug in compute-homography
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
300
diff
changeset
|
346 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
|
347 pass |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
348 |
|
314
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
349 def checkProtected(self, opposedThroughMvt): |
|
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
350 '''Checks if this left movement should be protected, |
|
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
351 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
|
352 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
|
353 |
|
205
aeaaf5579b46
minor changes to traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
198
diff
changeset
|
354 def getPCUVolume(self): |
|
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
355 '''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
|
356 v = 0 |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
357 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
|
358 v += p*e |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
359 return v*self.volume |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
360 |
|
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
361 class IntersectionMovement(object): |
|
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
362 '''Represents an intersection movement |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
363 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
|
364 and an equivalent for movement type''' |
|
205
aeaaf5579b46
minor changes to traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
198
diff
changeset
|
365 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
|
366 self.volume = volume |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
367 self.mvtEquivalent = mvtEquivalent |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
368 |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
369 def getTVUVolume(self): |
|
205
aeaaf5579b46
minor changes to traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
198
diff
changeset
|
370 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
|
371 |
|
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
372 class LaneGroup(object): |
|
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
373 '''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
|
374 |
| 34 | 375 def __init__(self, movements, nLanes): |
| 376 self.movements = movements | |
| 377 self.nLanes = nLanes | |
|
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
378 |
| 34 | 379 def getTVUVolume(self): |
| 380 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
|
381 |
|
206
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
382 def getCharge(self, saturationVolume): |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
383 return self.getTVUVolume()/(self.nLanes*saturationVolume) |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
384 |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
385 def optimalCycle(lostTime, criticalCharge): |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
386 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
|
387 |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
388 def minimumCycle(lostTime, criticalCharge, degreeSaturation=1.): |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
389 '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
|
390 return lostTime/(1-criticalCharge/degreeSaturation) |
| 34 | 391 |
|
665
15e244d2a1b5
corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
652
diff
changeset
|
392 class Cycle(object): |
| 34 | 393 '''Class to compute optimal cycle and the split of effective green times''' |
| 394 def __init__(self, phases, lostTime, saturationVolume): | |
| 395 '''phases is a list of phases | |
| 396 a phase is a list of lanegroups''' | |
| 397 self.phases = phases | |
| 398 self.lostTime = lostTime | |
| 399 self.saturationVolume = saturationVolume | |
|
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
400 |
|
206
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
401 def computeCriticalCharges(self): |
|
314
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
402 self.criticalCharges = [max([lg.getCharge(self.saturationVolume) for lg in phase]) for phase in self.phases] |
| 34 | 403 self.criticalCharge = sum(self.criticalCharges) |
|
206
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
404 |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
405 def computeOptimalCycle(self): |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
406 self.computeCriticalCharges() |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
407 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
|
408 return self.C |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
409 |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
410 def computeMinimumCycle(self, degreeSaturation=1.): |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
411 self.computeCriticalCharges() |
|
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
412 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
|
413 return self.C |
| 34 | 414 |
| 415 def computeEffectiveGreen(self): | |
|
314
539e2b4cfaa3
modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
302
diff
changeset
|
416 #from numpy import round |
|
206
82b4101d9a2f
re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
205
diff
changeset
|
417 #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
|
418 effectiveGreenTime = self.C-self.lostTime |
| 34 | 419 self.effectiveGreens = [round(c*effectiveGreenTime/self.criticalCharge,1) for c in self.criticalCharges] |
| 420 return self.effectiveGreens | |
| 421 | |
|
33
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
422 |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
423 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
|
424 '''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
|
425 Deceleration is positive |
|
4bd7cc69b6cd
added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff
changeset
|
426 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
|
427 if deceleration > 0: |
| 36 | 428 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
|
429 else: |
|
992
2cd1ce245024
update to python 3
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
796
diff
changeset
|
430 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
|
431 return None |
|
37
911b52744ceb
added uniform delay function
Nicolas Saunier <nico@confins.net>
parents:
36
diff
changeset
|
432 |
|
911b52744ceb
added uniform delay function
Nicolas Saunier <nico@confins.net>
parents:
36
diff
changeset
|
433 def uniformDelay(cycleLength, effectiveGreen, saturationDegree): |
|
911b52744ceb
added uniform delay function
Nicolas Saunier <nico@confins.net>
parents:
36
diff
changeset
|
434 '''Computes the uniform delay''' |
| 796 | 435 return 0.5*cycleLength*(1-float(effectiveGreen)/cycleLength)**2/(1-float(effectiveGreen*saturationDegree)/cycleLength) |
| 436 | |
| 437 def randomDelay(volume, saturationDegree): | |
| 438 '''Computes the random delay = queueing time for M/D/1''' | |
| 439 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
|
440 |
|
790
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
441 def incrementalDelay(T, X, c, k=0.5, I=1): |
|
944949c8ef3e
minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
789
diff
changeset
|
442 '''Computes the incremental delay (HCM) |
|
493
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
443 T in hours |
|
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
444 c capacity of the lane group |
|
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
445 k default for fixed time signal |
|
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
446 I=1 for isolated intersection (Poisson arrival)''' |
|
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
447 from math import sqrt |
|
850ed17c7b2f
added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
479
diff
changeset
|
448 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
|
449 |
|
87
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
450 ######################### |
|
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
451 # misc |
|
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
452 ######################### |
|
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
453 |
|
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
454 def timeChangingSpeed(v0, vf, a, TPR): |
| 789 | 455 'for decelerations, a < 0' |
| 456 return TPR-(vf-v0)/a | |
|
87
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
457 |
|
f234154207d4
distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
73
diff
changeset
|
458 def distanceChangingSpeed(v0, vf, a, TPR): |
| 789 | 459 'for decelerations, a < 0' |
|
1165
c5863e04d302
corrected bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents:
1029
diff
changeset
|
460 return TPR*v0+(vf**2-v0**2)/(2*a) |
