Mercurial Hosting > traffic-intelligence
changeset 790:944949c8ef3e dev
minor name change
author | Nicolas Saunier <nicolas.saunier@polymtl.ca> |
---|---|
date | Wed, 13 Apr 2016 23:03:43 -0400 |
parents | 3666342dabe2 |
children | ee3433fc0026 |
files | python/traffic_engineering.py |
diffstat | 1 files changed, 67 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/python/traffic_engineering.py Wed Mar 30 15:39:53 2016 -0400 +++ b/python/traffic_engineering.py Wed Apr 13 23:03:43 2016 -0400 @@ -54,6 +54,71 @@ def getDescriptor(self): return 'og' +######################### +# queueing models +######################### + +class CapacityReduction(object): + def __init__(self, beta, reductionDuration, demandCapacityRatio = None, demand = None, capacity = None): + '''reduction duration should be positive + demandCapacityRatio is demand/capacity (q/s)''' + if demandCapacityRatio is None and demand is None and capacity is None: + print('Missing too much information (demand, capacity and ratio)') + import sys + sys.exit() + if 0 <= beta < 1: + self.beta = beta + self.reductionDuration = reductionDuration + + if demandCapacityRatio is not None: + self.demandCapacityRatio = demandCapacityRatio + if demand is not None: + self.demand = demand + if capacity is not None: + self.capacity = capacity + if capacity is not None and demand is not None: + self.demandCapacityRatio = float(self.demand)/self.capacity + if demand <= beta*capacity: + print('There is no queueing as the demand {} is inferior to the reduced capacity {}'.format(demand, beta*capacity)) + else: + print('reduction coefficient (beta={}) is not in [0, 1['.format(beta)) + + def queueingDuration(self): + return self.reductionDuration*(1-self.beta)/(1-self.demandCapacityRatio) + + def nArrived(self, t): + if self.demand is None: + print('Missing demand field') + return None + return self.demand*t + + def nServed(self, t): + if self.capacity is None: + print('Missing capacity field') + return None + if 0<=t<=self.reductionDuration: + return self.beta*self.capacity*t + elif self.reductionDuration < t <= self.queueingDuration(): + return self.beta*self.capacity*self.reductionDuration+self.capacity*(t-self.reductionDuration) + + def nQueued(self, t): + return self.nArrived(t)-self.nServed(t) + + def maxNQueued(self): + return self.nQueued(self.reductionDuration) + + def totalDelay(self): + if self.capacity is None: + print('Missing capacity field') + return None + return self.capacity*self.reductionDuration**2*(1-self.beta)*(self.demandCapacityRatio-self.beta)/(2*(1-self.demandCapacityRatio)) + + def averageDelay(self): + return self.reductionDuration*(self.demandCapacityRatio-self.beta)/(2*self.demandCapacityRatio) + + def averageNQueued(self): + return self.totalDelay()/self.queueingDuration() + ######################### # fundamental diagram @@ -246,8 +311,8 @@ '''Computes the uniform delay''' return 0.5*cycleLength*(1-float(effectiveGreen)/cycleLength)/(1-float(effectiveGreen*saturationDegree)/cycleLength) -def overflowDelay(T, X, c, k=0.5, I=1): - '''Computes the overflow delay (HCM) +def incrementalDelay(T, X, c, k=0.5, I=1): + '''Computes the incremental delay (HCM) T in hours c capacity of the lane group k default for fixed time signal