From 5295d1c155575ef0316be2b5f33e63b17550f476 Mon Sep 17 00:00:00 2001 From: Sven Czarnian Date: Wed, 13 Oct 2021 21:42:45 +0200 Subject: [PATCH] use the theoretical earliest arrival time --- aman/sys/RecedingHorizonControl.py | 51 ++++++++++++------------------ 1 file changed, 21 insertions(+), 30 deletions(-) diff --git a/aman/sys/RecedingHorizonControl.py b/aman/sys/RecedingHorizonControl.py index b289847..d15b2fe 100644 --- a/aman/sys/RecedingHorizonControl.py +++ b/aman/sys/RecedingHorizonControl.py @@ -31,43 +31,34 @@ class RecedingHorizonControl: plannedInbound = self.Windows[index].inbound(inbound.Report.aircraft.callsign) plannedInbound.CurrentPosition = inbound.CurrentPosition + plannedInbound.MaximumTimeToGain = inbound.MaximumTimeToGain - # check if not accessed by the optimizer - if plannedInbound.InitialArrivalTime == plannedInbound.EstimatedArrivalTime: - notPlanned = True - update = True - # check if the ITA is greater or the ETA - elif plannedInbound.EstimatedArrivalTime != inbound.InitialArrivalTime: - notPlanned = False - update = True + # get the reference time and update some times in case no replacement is needed + if plannedInbound.InitialArrivalTime == plannedInbound.EarliestArrivalTime + plannedInbound.MaximumTimeToGain: + plannedInbound.InitialArrivalTime = inbound.InitialArrivalTime + plannedInbound.EarliestArrivalTime = inbound.EarliestArrivalTime + plannedInbound.EstimatedArrivalTime = inbound.EstimatedArrivalTime + reference = inbound.EarliestArrivalTime + else: + plannedInbound.InitialArrivalTime = inbound.InitialArrivalTime + if plannedInbound.EarliestArrivalTime < inbound.EarliestArrivalTime: + plannedInbound.EarliestArrivalTime = inbound.EarliestArrivalTime + if plannedInbound.EstimatedArrivalTime < inbound.EstimatedArrivalTime: + plannedInbound.EstimatedArrivalTime = inbound.EstimatedArrivalTime + reference = plannedInbound.EarliestArrivalTime # update the windows - if True == update: - if inbound.InitialArrivalTime >= self.Windows[index].StartTime and inbound.InitialArrivalTime < self.Windows[index].EndTime: - keepInWindow = True - else: - keepInWindow = False - - # check if planning can be updated or needs to be due to a delay - if True == notPlanned or plannedInbound.Inbound.EstimatedArrivalTime < inbound.InitialArrivalTime: - # keep it in this bucket - if True == keepInWindow: - plannedInbound.EstimatedArrivalTime = inbound.InitialArrivalTime - plannedInbound.InitialArrivalTime = inbound.InitialArrivalTime - - self.Windows[index].Inbounds.sort(key = lambda x: x.EstimatedArrivalTime) - # put it in the new bucket - else: - self.Windows[index].remove(inbound.Report.aircraft.callsign) - self.AssignedWindow.pop(inbound.Report.aircraft.callsign) - self.update(inbound) + if reference < self.Windows[index].StartTime or reference >= self.Windows[index].EndTime: + self.Windows[index].remove(inbound.Report.aircraft.callsign) + self.AssignedWindow.pop(inbound.Report.aircraft.callsign) + self.update(inbound) else: inserted = False for i in range(0, len(self.Windows)): window = self.Windows[i] # find the correct window - if window.StartTime <= inbound.EstimatedArrivalTime and window.EndTime > inbound.EstimatedArrivalTime: + if window.StartTime <= inbound.EarliestArrivalTime and window.EndTime > inbound.EarliestArrivalTime: if i > self.FreezedIndex: self.AssignedWindow[inbound.Report.aircraft.callsign] = [ i, 0 ] window.insert(inbound) @@ -84,10 +75,10 @@ class RecedingHorizonControl: while True: self.Windows.append(RecedingHorizonWindow(lastWindowTime, lastWindowTime + timestep)) - if self.Windows[-1].EndTime > inbound.EstimatedArrivalTime: + if self.Windows[-1].EndTime > inbound.EarliestArrivalTime: self.AssignedWindow[inbound.Report.aircraft.callsign] = [ len(self.Windows) - 1, 0 ] self.Windows[-1].insert(inbound) - self.Windows[-1].Inbounds.sort(key = lambda x: x.EstimatedArrivalTime) + self.Windows[-1].Inbounds.sort(key = lambda x: x.EarliestArrivalTime) break lastWindowTime = self.Windows[-1].EndTime