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
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')
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
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
375 def __init__(self, movements, nLanes):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
376 self.movements = movements
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
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
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
379 def getTVUVolume(self):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
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
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
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
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
393 '''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
394 def __init__(self, phases, lostTime, saturationVolume):
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
395 '''phases is a list of phases
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
396 a phase is a list of lanegroups'''
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
397 self.phases = phases
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
398 self.lostTime = lostTime
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
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
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
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
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
414
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
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
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
419 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
420 return self.effectiveGreens
388a5a25fe92 Code for lab5 works
Nicolas Saunier <nico@confins.net>
parents: 33
diff changeset
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
571b11304ec9 corrected bug
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 34
diff changeset
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
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
435 return 0.5*cycleLength*(1-float(effectiveGreen)/cycleLength)**2/(1-float(effectiveGreen*saturationDegree)/cycleLength)
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
436
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
437 def randomDelay(volume, saturationDegree):
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
438 '''Computes the random delay = queueing time for M/D/1'''
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 790
diff changeset
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
3666342dabe2 minor changes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
455 'for decelerations, a < 0'
3666342dabe2 minor changes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
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
3666342dabe2 minor changes
Nicolas Saunier <nicolas.saunier@polymtl.ca>
parents: 665
diff changeset
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)