add the runway assignment based on shall-should-may

This commit is contained in:
Sven Czarnian
2021-11-17 10:02:29 +01:00
parent 3560e98ad2
commit 3affbd9d57

View File

@@ -2,6 +2,7 @@
from datetime import datetime, timedelta from datetime import datetime, timedelta
from aman.config.RunwaySequencing import RunwayAssignmentType
from aman.sys.aco.Configuration import Configuration from aman.sys.aco.Configuration import Configuration
from aman.sys.aco.Constraints import SpacingConstraints from aman.sys.aco.Constraints import SpacingConstraints
from aman.sys.aco.Node import Node from aman.sys.aco.Node import Node
@@ -57,15 +58,85 @@ class RunwayManager:
else: else:
return eta, timedelta(seconds = 0) return eta, timedelta(seconds = 0)
def selectShallShouldMayArrivalRunway(self, node : Node, runways, useETA : bool, earliestArrivalTime : datetime):
candidate = None
delay = None
for runway in runways:
if True == useETA:
reference = node.ArrivalCandidates[runway.Runway.Name].EarliestArrivalTime
else:
reference = node.ArrivalCandidates[runway.Runway.Name].InitialArrivalTime
eta, _ = self.calculateEarliestArrivalTime(runway.Runway.Name, node)
if None == delay:
delay = eta - reference
candidate = runway
elif delay > (eta - reference):
delay = eta- reference
candidate = runway
return candidate
def executeShallShouldMayAssignment(self, node : Node, useETA : bool, earliestArrivalTime : datetime):
shallRunways = []
shouldRunways = []
mayRunways = []
for runway in self.Configuration.RunwayConstraints.ActiveArrivalRunways:
# test the shall assignments
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)
# test the should assignments
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 True == useETA:
reference = node.ArrivalCandidates[runway.Runway.Name].EarliestArrivalTime
else:
reference = node.ArrivalCandidates[runway.Runway.Name].InitialArrivalTime
# test the may assignments
if RunwayAssignmentType.AircraftType in runway.MayAssignments:
if node.Inbound.Report.aircraft.type in runway.MayAssignments[RunwayAssignmentType.AircraftType]:
eta, _ = self.calculateEarliestArrivalTime(runway.Runway.Name, node, useETA, earliestArrivalTime)
if (eta - reference) <= self.Configuration.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, useETA, earliestArrivalTime)
if (eta - reference) <= self.Configuration.MaxDelayMay:
mayRunways.append(runway)
runway = self.selectShallShouldMayArrivalRunway(node, shallRunways, useETA, earliestArrivalTime)
if None != runway:
return [ runway ]
runway = self.selectShallShouldMayArrivalRunway(node, shouldRunways, useETA, earliestArrivalTime)
if None != runway:
return [ runway ]
runway = self.selectShallShouldMayArrivalRunway(node, mayRunways, useETA, earliestArrivalTime)
if None != runway:
return [ runway ]
return self.Configuration.RunwayConstraints.ActiveArrivalRunways
def selectArrivalRunway(self, node : Node, useETA : bool, earliestArrivalTime : datetime): def selectArrivalRunway(self, node : Node, useETA : bool, earliestArrivalTime : datetime):
availableRunways = self.Configuration.RunwayConstraints.ActiveArrivalRunways availableRunways = self.Configuration.RunwayConstraints.ActiveArrivalRunways
#if 1 < len(availableRunways): if True == self.Configuration.RunwayConstraints.UseShallShouldMay:
# TODO filter based on type availableRunways = self.executeShallShouldMayAssignment(node, useETA, earliestArrivalTime)
# TODO filter based on airline else:
# ensure that at least one runway is available availableRunways = self.Configuration.RunwayConstraints.ActiveArrivalRunways
# fallback to check if we have available runways
if 0 == len(availableRunways): if 0 == len(availableRunways):
runway = self.Configuration.RunwayConstraints.ActiveArrivalRunways[0] runway = self.Configuration.RunwayConstraints.ActiveArrivalRunways[0]
return runway, self.calculateEarliestArrivalTime(runway.Runway.Name, node, useETA, earliestArrivalTime) return runway, self.calculateEarliestArrivalTime(runway.Runway.Name, node, useETA, earliestArrivalTime)