add the runway assignment based on shall-should-may
This commit is contained in:
		| @@ -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) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user