123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- from datetime import datetime, timedelta
- from aman.config.RunwaySequencing import RunwayAssignmentType
- from aman.sys.aco.Configuration import Configuration
- from aman.sys.aco.Constraints import SpacingConstraints
- from aman.sys.aco.Node import Node
- class RunwayManager:
- def __init__(self, configuration : Configuration):
- self.Spacings = SpacingConstraints()
- self.Configuration = configuration
-
- self.RunwayInbounds = {}
- if None != configuration.PreceedingInbounds:
- for runway in configuration.PreceedingInbounds:
- self.RunwayInbounds[runway] = configuration.PreceedingInbounds[runway]
- for runway in configuration.RunwayConstraints.ActiveArrivalRunways:
- if not runway.Runway.Name in self.RunwayInbounds:
- self.RunwayInbounds[runway.Runway.Name] = None
- def calculateEarliestArrivalTime(self, runway : str, node : Node, earliestArrivalTime : datetime):
- constrainedETA = None
- if None != self.RunwayInbounds[runway]:
-
- if None == self.RunwayInbounds[runway].Inbound.WTC or None == node.Inbound.WTC:
- spacingWTC = 3
- else:
- spacingWTC = self.Spacings[self.RunwayInbounds[runway].Inbound.WTC][node.Inbound.WTC]
-
- spacingRunway = self.Configuration.RunwayConstraints.findRunway(runway).Spacing
- constrainedETA = self.RunwayInbounds[runway].Inbound.PlannedArrivalTime + timedelta(minutes = max(spacingWTC, spacingRunway) / (node.Inbound.PerformanceData.SpeedApproach / 60))
-
- for dependentRunway in self.Configuration.RunwayConstraints.findDependentRunways(runway):
- if None != self.RunwayInbounds[dependentRunway.Runway.Name]:
- candidate = self.RunwayInbounds[dependentRunway.Runway.Name].Inbound.PlannedArrivalTime + timedelta(minutes = 3 / (node.Inbound.PerformanceData.SpeedApproach / 60))
- if None == constrainedETA or candidate > constrainedETA:
- constrainedETA = candidate
- if None == constrainedETA:
- eta = max(node.ArrivalCandidates[runway].InitialArrivalTime, earliestArrivalTime)
- else:
- eta = max(node.ArrivalCandidates[runway].InitialArrivalTime, max(constrainedETA, earliestArrivalTime))
- return eta, eta - node.ArrivalCandidates[runway].InitialArrivalTime
- def selectShallShouldMayArrivalRunway(self, node : Node, runways, earliestArrivalTime : datetime):
- candidate = None
- delay = None
- for runway in runways:
- eta, _ = self.calculateEarliestArrivalTime(runway.Runway.Name, node, earliestArrivalTime)
- if None == delay:
- delay = eta - node.ArrivalCandidates[runway.Runway.Name].InitialArrivalTime
- candidate = runway
- elif delay > (eta - node.ArrivalCandidates[runway.Runway.Name].InitialArrivalTime):
- delay = eta- node.ArrivalCandidates[runway.Runway.Name].InitialArrivalTime
- candidate = runway
- return candidate
- def executeShallShouldMayAssignment(self, node : Node, earliestArrivalTime : datetime):
- shallRunways = []
- shouldRunways = []
- mayRunways = []
- for runway in self.Configuration.RunwayConstraints.ActiveArrivalRunways:
-
- if RunwayAssignmentType.AircraftType in runway.ShallAssignments:
- if node.Inbound.Report.aircraft.type in runway.ShallAssignments[RunwayAssignmentType.AircraftType]:
- shallRunways.append(runway)
- if RunwayAssignmentType.GateAssignment in runway.ShallAssignments:
- if node.Inbound.Report.plannedGate in runway.ShallAssignments[RunwayAssignmentType.GateAssignment]:
- shallRunways.append(runway)
-
- if RunwayAssignmentType.AircraftType in runway.ShouldAssignments:
- if node.Inbound.Report.aircraft.type in runway.ShouldAssignments[RunwayAssignmentType.AircraftType]:
- shouldRunways.append(runway)
- if RunwayAssignmentType.GateAssignment in runway.ShouldAssignments:
- if node.Inbound.Report.plannedGate in runway.ShouldAssignments[RunwayAssignmentType.GateAssignment]:
- shouldRunways.append(runway)
-
- if RunwayAssignmentType.AircraftType in runway.MayAssignments:
- if node.Inbound.Report.aircraft.type in runway.MayAssignments[RunwayAssignmentType.AircraftType]:
- eta, _ = self.calculateEarliestArrivalTime(runway.Runway.Name, node, earliestArrivalTime)
- if (eta - node.ArrivalCandidates[runway.Runway.Name].InitialArrivalTime) <= self.Configuration.AirportConfiguration.MaxDelayMay:
- mayRunways.append(runway)
- if RunwayAssignmentType.GateAssignment in runway.MayAssignments:
- if node.Inbound.Report.plannedGate in runway.MayAssignments[RunwayAssignmentType.GateAssignment]:
- eta, _ = self.calculateEarliestArrivalTime(runway.Runway.Name, node, earliestArrivalTime)
- if (eta - node.ArrivalCandidates[runway.Runway.Name].InitialArrivalTime) <= self.Configuration.AirportConfiguration.MaxDelayMay:
- mayRunways.append(runway)
- runway = self.selectShallShouldMayArrivalRunway(node, shallRunways, earliestArrivalTime)
- if None != runway:
- return [ runway ]
- runway = self.selectShallShouldMayArrivalRunway(node, shouldRunways, earliestArrivalTime)
- if None != runway:
- return [ runway ]
- runway = self.selectShallShouldMayArrivalRunway(node, mayRunways, earliestArrivalTime)
- if None != runway:
- return [ runway ]
- return self.Configuration.RunwayConstraints.ActiveArrivalRunways
- def selectArrivalRunway(self, node : Node, earliestArrivalTime : datetime):
- availableRunways = self.Configuration.RunwayConstraints.ActiveArrivalRunways
- if True == self.Configuration.RunwayConstraints.UseShallShouldMay:
- availableRunways = self.executeShallShouldMayAssignment(node, earliestArrivalTime)
- else:
- availableRunways = self.Configuration.RunwayConstraints.ActiveArrivalRunways
- if 0 == len(availableRunways):
- runway = self.Configuration.RunwayConstraints.ActiveArrivalRunways[0]
- return runway, self.calculateEarliestArrivalTime(runway.Runway.Name, node, earliestArrivalTime)
-
- selectedRunway = None
- lostTime = None
- eta = None
-
- for runway in availableRunways:
- candidate, delta = self.calculateEarliestArrivalTime(runway.Runway.Name, node, earliestArrivalTime)
- if None == eta or eta > candidate:
- selectedRunway = runway.Runway
- lostTime = delta
- eta = candidate
- return selectedRunway, eta, lostTime
|