annotate trafficintelligence/traffic_engineering.py @ 1300:f3574e43c238

correcting bug on line crossings (and renaming method)
author Nicolas Saunier <nicolas.saunier@polymtl.ca>
date Fri, 11 Apr 2025 16:14:51 -0400
parents c15b9fcdbcb1
children d828f3f76273
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
1 #! /usr/bin/env python
73
930a6282c9a9 added class for fundamental diagram (including plotting) with implementation of Greenberg model
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 37
diff changeset
2 ''' Traffic Engineering Tools and Examples'''
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
3
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')
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
264 if vf is not None and qmax is not None and kj is not None:
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.qmax = qmax
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
267 self.kj = kj
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
268 self.kc = qmax/vf
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
269 self.w = 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
270
1176
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
271 def v(self, k):
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
272 if k<self.kc:
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
273 return self.vf
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
274 else:
5874ece33637 reorganized fundamental diagram and added triangular
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1165
diff changeset
275 return self.vf*self.kc*(self.kj/k-1)/(self.kj-self.kc)
1206
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
276
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
277 def generateDensities(n, maxDensity):
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
278 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
279
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
280 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
281 densities = generateDensities(n, maxDensity)
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
282 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
283 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
284 if maxHGVProportion > 0:
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
285 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
286 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
287 else:
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
288 hgvProportions = None
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
289 return speeds, volumes, hgvProportions
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
290
1262
f10e84505443 modif for highway level of service
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1259
diff changeset
291 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
292
1206
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
293 def highwayLOS(k):
770306fef827 moving functions for exams in traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1198
diff changeset
294 '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
295 for los, kmax in higwayMaxDensityLOS.items():
f10e84505443 modif for highway level of service
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1259
diff changeset
296 if k<kmax: return los
f10e84505443 modif for highway level of service
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1259
diff changeset
297 return 'F'
f10e84505443 modif for highway level of service
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1259
diff changeset
298
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
299 #########################
116
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
300 # intersection
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
301 #########################
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
302
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
303 class FourWayIntersection(object):
116
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
304 '''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
305 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
306 self.dimension = dimension
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
307 self.coordX = coordX
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
308 self.coordY = coordY
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
309
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
310 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
311 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
312
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
313 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
314 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
315 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
316 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
317
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
318 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
319 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
320 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
321 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
322 axis('equal')
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
323
2bf5b76320c0 moved intersection plotting and added markers for scatter plots
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 87
diff changeset
324 #########################
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
325 # traffic signals
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
326 #########################
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
327
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
328 class Volume(object):
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
329 '''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
330 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
331 '''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
332
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
333 # check the sizes of the lists
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
334 if sum(proportions) == 1:
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
335 self.volume = volume
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
336 self.types = types
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
337 self.proportions = proportions
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
338 self.equivalents = equivalents
314
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
339 self.nLanes = nLanes
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
340 else:
302
9d88a4d97473 corrected bug in compute-homography
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 300
diff changeset
341 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
342 pass
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
343
314
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
344 def checkProtected(self, opposedThroughMvt):
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
345 '''Checks if this left movement should be protected,
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
346 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
347 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
348
205
aeaaf5579b46 minor changes to traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 198
diff changeset
349 def getPCUVolume(self):
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
350 '''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
351 v = 0
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
352 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
353 v += p*e
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
354 return v*self.volume
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
355
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
356 class IntersectionMovement(object):
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
357 '''Represents an intersection movement
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
358 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
359 and an equivalent for movement type'''
205
aeaaf5579b46 minor changes to traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 198
diff changeset
360 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
361 self.volume = volume
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
362 self.mvtEquivalent = mvtEquivalent
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
363
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
364 def getTVUVolume(self):
205
aeaaf5579b46 minor changes to traffic engineering
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 198
diff changeset
365 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
366
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
367 class LaneGroup(object):
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
368 '''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
369
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
370 def __init__(self, movements, nLanes):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
371 self.movements = movements
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
372 self.nLanes = nLanes
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
373
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
374 def getTVUVolume(self):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
375 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
376
206
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
377 def getCharge(self, saturationVolume):
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
378 return self.getTVUVolume()/(self.nLanes*saturationVolume)
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
379
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
380 def optimalCycle(lostTime, criticalCharge):
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
381 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
382
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
383 def minimumCycle(lostTime, criticalCharge, degreeSaturation=1.):
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
384 '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
385 return lostTime/(1-criticalCharge/degreeSaturation)
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
386
665
15e244d2a1b5 corrected bug with circular import for VideoFilenameAddable, moved to base module
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 652
diff changeset
387 class Cycle(object):
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
388 '''Class to compute optimal cycle and the split of effective green times'''
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
389 def __init__(self, phases, lostTime, saturationVolume):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
390 '''phases is a list of phases
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
391 a phase is a list of lanegroups'''
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
392 self.phases = phases
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
393 self.lostTime = lostTime
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
394 self.saturationVolume = saturationVolume
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
395
206
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
396 def computeCriticalCharges(self):
314
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
397 self.criticalCharges = [max([lg.getCharge(self.saturationVolume) for lg in phase]) for phase in self.phases]
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
398 self.criticalCharge = sum(self.criticalCharges)
206
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
399
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
400 def computeOptimalCycle(self):
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
401 self.computeCriticalCharges()
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
402 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
403 return self.C
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 computeMinimumCycle(self, degreeSaturation=1.):
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 = minimumCycle(self.lostTime, self.criticalCharge, degreeSaturation)
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
408 return self.C
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
409
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
410 def computeEffectiveGreen(self):
314
539e2b4cfaa3 modified for 4740 tps
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 302
diff changeset
411 #from numpy import round
206
82b4101d9a2f re-arranged and commnted signal cycle calculations
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 205
diff changeset
412 #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
413 effectiveGreenTime = self.C-self.lostTime
34
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
414 self.effectiveGreens = [round(c*effectiveGreenTime/self.criticalCharge,1) for c in self.criticalCharges]
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
415 return self.effectiveGreens
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
416
33
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
417
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
418 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
419 '''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
420 Deceleration is positive
4bd7cc69b6cd added traffic engineering utilities with first version of LaneGroups
Nicolas Saunier <nico@confins.net>
parents:
diff changeset
421 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
422 if deceleration > 0:
36
571b11304ec9 corrected bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 34
diff changeset
423 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
424 else:
992
2cd1ce245024 update to python 3
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 796
diff changeset
425 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
426 return None
37
911b52744ceb added uniform delay function
Nicolas Saunier <nico@confins.net>
parents: 36
diff changeset
427
911b52744ceb added uniform delay function
Nicolas Saunier <nico@confins.net>
parents: 36
diff changeset
428 def uniformDelay(cycleLength, effectiveGreen, saturationDegree):
911b52744ceb added uniform delay function
Nicolas Saunier <nico@confins.net>
parents: 36
diff changeset
429 '''Computes the uniform delay'''
796
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
430 return 0.5*cycleLength*(1-float(effectiveGreen)/cycleLength)**2/(1-float(effectiveGreen*saturationDegree)/cycleLength)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
431
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
432 def randomDelay(volume, saturationDegree):
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
433 '''Computes the random delay = queueing time for M/D/1'''
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
434 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
435
790
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
436 def incrementalDelay(T, X, c, k=0.5, I=1):
944949c8ef3e minor name change
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 789
diff changeset
437 '''Computes the incremental delay (HCM)
493
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
438 T in hours
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
439 c capacity of the lane group
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
440 k default for fixed time signal
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
441 I=1 for isolated intersection (Poisson arrival)'''
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
442 from math import sqrt
850ed17c7b2f added some computation of delay
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 479
diff changeset
443 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
444
87
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
445 #########################
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
446 # misc
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
447 #########################
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
448
f234154207d4 distance and time to change speed
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 73
diff changeset
449 def timeChangingSpeed(v0, vf, a, TPR):
789
3666342dabe2 minor changes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
450 'for decelerations, a < 0'
3666342dabe2 minor changes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
451 return TPR-(vf-v0)/a
87
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 def distanceChangingSpeed(v0, vf, a, TPR):
789
3666342dabe2 minor changes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
454 'for decelerations, a < 0'
1165
c5863e04d302 corrected bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 1029
diff changeset
455 return TPR*v0+(vf**2-v0**2)/(2*a)