add the runway assignment based on shall-should-may
This commit is contained in:
		| @@ -2,6 +2,7 @@ | ||||
|  | ||||
| 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 | ||||
| @@ -57,15 +58,85 @@ class RunwayManager: | ||||
|             else: | ||||
|                 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): | ||||
|         availableRunways = self.Configuration.RunwayConstraints.ActiveArrivalRunways | ||||
|  | ||||
|         #if 1 < len(availableRunways): | ||||
|             # TODO filter based on type | ||||
|             # TODO filter based on airline | ||||
|             # ensure that at least one runway is available | ||||
|         if True == self.Configuration.RunwayConstraints.UseShallShouldMay: | ||||
|             availableRunways = self.executeShallShouldMayAssignment(node, useETA, earliestArrivalTime) | ||||
|         else: | ||||
|             availableRunways = self.Configuration.RunwayConstraints.ActiveArrivalRunways | ||||
|  | ||||
|         # fallback to check if we have available runways | ||||
|         if 0 == len(availableRunways): | ||||
|             runway = self.Configuration.RunwayConstraints.ActiveArrivalRunways[0] | ||||
|             return runway, self.calculateEarliestArrivalTime(runway.Runway.Name, node, useETA, earliestArrivalTime) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user