ソースを参照

use the theoretical earliest arrival time

Sven Czarnian 3 年 前
コミット
5295d1c155
1 ファイル変更22 行追加31 行削除
  1. 22 31
      aman/sys/RecedingHorizonControl.py

+ 22 - 31
aman/sys/RecedingHorizonControl.py

@@ -31,43 +31,34 @@ class RecedingHorizonControl:
 
             plannedInbound = self.Windows[index].inbound(inbound.Report.aircraft.callsign)
             plannedInbound.CurrentPosition = inbound.CurrentPosition
-
-            # 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
+            plannedInbound.MaximumTimeToGain = inbound.MaximumTimeToGain
+
+            # 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