Beispiel #1
0
        public void CanMergeNearGaps()
        {
            var gaps = new GapList();

            gaps.AddGap(1, 2);             // 0.1
            gaps.AddGap(2.1, 3);           // 0.09
            gaps.AddGap(3.09, 4);          // 0.001
            gaps.AddGap(4.001, 5);
            Assert.AreEqual(4, gaps.Count);
            Assert.AreEqual(1, gaps.MergeNearGaps(0.089999));
            Assert.AreEqual(3, gaps.Count);
            Assert.AreEqual(1, gaps.MergeNearGaps(0.090001));
            Assert.AreEqual(2, gaps.Count);
            Assert.AreEqual(0, gaps.MergeNearGaps(0.099999));
            Assert.AreEqual(2, gaps.Count);
            Assert.AreEqual(1, gaps.MergeNearGaps(0.100001));
            Assert.AreEqual(1, gaps.Count);
            Assert.AreEqual(1.0, gaps.Gaps.Single().Min);
            Assert.AreEqual(5.0, gaps.Gaps.Single().Max);
        }
Beispiel #2
0
 internal static bool FindArrayBounds(GapList <AttachedPropertyMetadata> properties, string assemblyName, string namespaceName, string typeName, out int hi, out int lo)
 {
     return(OrderedListExtensions.GetHiLoBounds((IList <AttachedPropertyMetadata>)properties, new
     {
         AssemblyName = assemblyName,
         NamespaceName = namespaceName,
         TypeName = typeName
     }, (searchCriteria, property) =>
     {
         int num = string.CompareOrdinal(searchCriteria.AssemblyName, AttachedPropertiesMetadata.AttachedPropertyMetadataBackgroundWorker.GetAssemblyName(property.OwnerType));
         if (num == 0 && searchCriteria.NamespaceName != null)
         {
             num = string.CompareOrdinal(searchCriteria.NamespaceName, property.OwnerType.Namespace ?? string.Empty);
             if (num == 0 && searchCriteria.TypeName != null)
             {
                 num = string.CompareOrdinal(searchCriteria.TypeName, property.OwnerType.Name);
             }
         }
         return num;
     }, out hi, out lo));
 }
Beispiel #3
0
        public void TestCreateGapList()
        {
            var gaps = clientGaps.Select(g => new GapInfo {
                start = g.start, end = g.end
            }).ToList();
            var groups = GapList.CreateGapList(gaps, 1);

            Assert.AreEqual(3, groups.Count, "CreateGapList: error grouping gaps, groups.Count != 3");
            for (var groupIndex = 0; groupIndex < groups.Count; groupIndex++)
            {
                Assert.AreNotEqual(0, groups[groupIndex].Gaps.Count, "CreateGapList: gap group empty");
            }
            for (var groupIndex = 1; groupIndex < groups.Count; groupIndex++)
            {
                Assert.Less(groups[groupIndex - 1].Gaps.Last().end, groups[groupIndex].Gaps.First().start, "CreateGapList: gap groups intersect each other");
            }
            gaps.Clear();
            groups.ForEach(g => gaps.AddRange(g.Gaps));
            GapInfo.StickSmallGaps(ref gaps, 1);
            Assert.True(gaps.Count == clientGaps.Length, "CreateGapList: error sticking & returning to original");
        }
Beispiel #4
0
        public void CanAddGap()
        {
            var gaps = new GapList();

            gaps.AddGap(1, 2);
            gaps.AddGap(3, 4);
            gaps.AddGap(6, 8);
            Assert.AreEqual(3, gaps.Count);
            gaps.AddGap(7, 9);              // should merge with [6,8]
            Assert.AreEqual(3, gaps.Count);
            gaps.AddGap(3, 5);              // existing start, should merge with [3,4]
            Assert.AreEqual(3, gaps.Count);
            gaps.AddGap(0, 3);              // should merge with [1,2] and [3,5]
            Assert.AreEqual(2, gaps.Count); // [0,5] and [6,9]
            gaps.AddGap(5, 6);
            var gap = gaps.Gaps.Single();

            Assert.AreEqual(0, gap.Min);
            Assert.AreEqual(9, gap.Max);

            gaps = new GapList();
            gaps.AddGap(4, 5);
            gaps.AddGap(3, 6);
            gaps.AddGap(2, 7);
            gaps.AddGap(1, 8);
            gaps.AddGap(0, 9);
            gap = gaps.Gaps.Single();
            Assert.AreEqual(0, gap.Min);
            Assert.AreEqual(9, gap.Max);

            gaps = new GapList();
            gaps.AddGap(1, 2);
            gaps.AddGap(3, 4);
            gaps.AddGap(5, 6);
            gaps.AddGap(7, 8);
            Assert.AreEqual(4, gaps.Gaps.Count());
            gaps.AddGap(0, 9);
            Assert.AreEqual(1, gaps.Gaps.Count());
        }
Beispiel #5
0
        public async Task <GapList> GetGaps()
        {
            try
            {
                var instruments = await _instrumentRepository.GetInstruments();

                instruments = instruments.Where(x => (x.GroupName == "Major") || x.Symbol == "DE30" || x.Symbol == "US500" || x.Symbol == "US100" || x.Symbol == "GOLD").ToList();
                var chartsAsync = instruments.Select(async x => await _chartRepository.GetChartAsync(x.Symbol, "M1", 2250, x.Precision));
                var charts      = await Task.WhenAll(chartsAsync);

                var bars = charts.Select(x => new
                {
                    symbol        = x.Symbol,
                    highUs        = x.Quotations.Where(w => w.IsInUsTimeFrame())?.DefaultIfEmpty().Max(m => m?.High ?? 0) ?? 0,
                    lowUs         = x.Quotations.Where(w => w.IsInUsTimeFrame())?.DefaultIfEmpty().Min(m => m?.Low ?? 0) ?? 0,
                    highEu        = x.Quotations.Where(w => w.IsInEuropeTimeFrame())?.DefaultIfEmpty().Max(m => m?.High ?? 0) ?? 0,
                    lowEu         = x.Quotations.Where(w => w.IsInEuropeTimeFrame())?.DefaultIfEmpty().Min(m => m?.Low ?? 0) ?? 0,
                    lastQuotation = x.Quotations[x.Quotations.Count - 1]
                }).ToList();

                var model = new GapList
                {
                    TopGapSymbolEu    = bars.Where(x => x.highEu < x.lastQuotation.Close).Select(x => x.symbol).ToList() ?? new List <string>(),
                    BottomGapSymbolEu = bars.Where(x => x.lowEu > x.lastQuotation.Close).Select(x => x.symbol).ToList() ?? new List <string>(),
                    TopGapSymbolUs    = bars.Where(x => x.highUs < x.lastQuotation.Close).Select(x => x.symbol).ToList() ?? new List <string>(),
                    BottomGapSymbolUs = bars.Where(x => x.lowUs > x.lastQuotation.Close).Select(x => x.symbol).ToList() ?? new List <string>()
                };
                return(await Task.FromResult(model));
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "GetGaps");

                throw ex;
            }
        }
        public static void Run()
        {
            InitAirportIdAirlineDic();

            //单位时间容量限制
            UnitCapLimit();
            return;

            //修改执飞航班
            TryChangePlane();

            CancelPairList.Clear();

            GetCancelPair();
            //按照机场和重要度进行排序
            CancelPairList.Sort((x, y) =>
            {
                if (x.StartAirPort == y.StartAirPort)
                {
                    return(y.ImportFac.CompareTo(x.ImportFac));
                }
                else
                {
                    return(x.StartAirPort.CompareTo(y.StartAirPort));
                }
            });

            GapList.Clear();
            foreach (var airportId in AirportIdAirlineDic.Keys)
            {
                PutCancelToBigGap(airportId);
            }
            //按照机场和时间进行排序
            GapList.Sort(
                (x, y) =>
            {
                if (x.AirportID == y.AirportID)
                {
                    return(x.LandTime.CompareTo(y.LandTime));
                }
                else
                {
                    return(x.AirportID.CompareTo(y.AirportID));
                }
            }
                );


            //进行匹配
            for (int i = 0; i < CancelPairList.Count; i++)
            {
                double MaxScore   = 0;
                int    MaxIndex   = -1;
                var    CancelItem = CancelPairList[i];
                for (int j = 0; j < GapList.Count; j++)
                {
                    var GapItem = GapList[j];
                    if (GapItem.IsFilled)
                    {
                        continue;
                    }

                    //Gap的机场和取消组的机场一致
                    if (CancelItem.StartAirPort != GapItem.AirportID)
                    {
                        continue;
                    }
                    //不是同一架飞机,机型相同
                    if (CancelItem.PlaneID == GapItem.PlaneID || CancelItem.PlaneType != GapItem.PlaneType)
                    {
                        continue;
                    }
                    //中间是台风,暂时不考虑
                    var ArrivalTime = GapItem.LandTime.AddMinutes(Utility.StayAtAirPortMinutes) + CancelItem.First.FlightSpan;
                    if (CheckCondition.TyphoonAirport.Contains(CancelItem.MidAirport))
                    {
                        DateTime TyphoonTime = DateTime.MinValue;
                        foreach (var item in CheckCondition.TyphoonList)
                        {
                            if (item.AirPort == CancelItem.MidAirport && item.TroubleType == "停机")
                            {
                                TyphoonTime = item.EndTime;
                                break;
                            }
                        }
                        if (ArrivalTime < TyphoonTime)
                        {
                            continue;
                        }
                    }
                    //联航不能分割
                    if (CancelItem.First.ComboAirline != null && !CancelItem.First.IsFirstCombinedVoyage)
                    {
                        continue;
                    }
                    if (CancelItem.Second.ComboAirline != null && CancelItem.Second.IsFirstCombinedVoyage)
                    {
                        continue;
                    }
                    var TakeOffEarlyTime = GapItem.LandTime.AddMinutes(Utility.StayAtAirPortMinutes);
                    if (TakeOffEarlyTime <= CancelItem.First.StartTime)
                    {
                        //取消组的开始时间暂时要求在50分钟之内
                        if (CancelItem.Second.EndTime.AddMinutes(Utility.StayAtAirPortMinutes) < GapItem.TakeOffTime)
                        {
                            //结束飞行后有充分的过站时间
                            Console.WriteLine("Cancel: " + CancelItem.PlaneID + " StartAirPort:" + CancelItem.StartAirPort + " MidAirPort:" + CancelItem.MidAirport + " " +
                                              CancelItem.First.StartTime + " " + CancelItem.Second.EndTime);
                            Console.WriteLine("Gap: " + GapItem.PlaneID + " StartAirPort:" + GapItem.AirportID + " " + GapItem.LandTime + " " + GapItem.TakeOffTime);
                        }
                    }
                    else
                    {
                        //允许延期
                        var CloneAirline = Utility.DeepCopy(Solution.PlaneIdAirlineDic[GapItem.PlaneID]);
                        //取消恢复后的可以挽回的分数:
                        var FixScore = CancelItem.ImportFac * Statistics.CancelAirlineParm;
                        //修改前分数
                        var GapBefore = Statistics.WriteResult(CloneAirline);
                        //添加取消项目到原列表中
                        var C1       = Utility.DeepCopy(CancelItem.First);
                        var C2       = Utility.DeepCopy(CancelItem.Second);
                        var TimeDiff = TakeOffEarlyTime.Subtract(CancelItem.First.StartTime);
                        C1.ModifiedStartTime = TakeOffEarlyTime;
                        C2.ModifiedStartTime = C1.ModifiedEndTime.AddMinutes(Utility.StayAtAirPortMinutes);
                        C1.FixMethod         = enmFixMethod.UnFixed;
                        C2.FixMethod         = enmFixMethod.UnFixed;
                        C1.ModifiedPlaneID   = GapItem.PlaneID;
                        C2.ModifiedPlaneID   = GapItem.PlaneID;
                        if (C2.ModifiedEndTime.AddMinutes(Utility.StayAtAirPortMinutes) > GapItem.TakeOffTime)
                        {
                            continue;
                        }
                        CloneAirline.Add(C1);
                        CloneAirline.Add(C2);
                        CloneAirline.Sort((x, y) => { return(x.ModifiedStartTime.CompareTo(y.ModifiedStartTime)); });
                        if (!CoreAlgorithm.AdjustAirLineList(CloneAirline))
                        {
                            continue;
                        }
                        var GapAfter = Statistics.WriteResult(CloneAirline);
                        var Decream  = FixScore - (GapAfter - GapBefore);
                        if (Decream > MaxScore)
                        {
                            MaxScore = Decream;
                            MaxIndex = j;
                        }
                    }
                }

                if (MaxIndex != -1)
                {
                    var GapItem = GapList[MaxIndex];
                    Console.WriteLine("Gap PlaneID:" + GapItem.PlaneID + " Max Score:" + MaxScore);
                    Console.WriteLine("Gap Land:" + GapItem.LandAirline.ToString());
                    Console.WriteLine("Gap Takeoff:" + GapItem.TakeoffAirLine.ToString());
                    var TakeOffEarlyTime = GapItem.LandTime.AddMinutes(Utility.StayAtAirPortMinutes);
                    CancelItem.First.ModifiedStartTime  = TakeOffEarlyTime;
                    CancelItem.Second.ModifiedStartTime = CancelItem.First.ModifiedEndTime.AddMinutes(Utility.StayAtAirPortMinutes);
                    CancelItem.First.ModifiedPlaneID    = GapItem.PlaneID;
                    CancelItem.Second.ModifiedPlaneID   = GapItem.PlaneID;
                    CancelItem.First.FixMethod          = enmFixMethod.UnFixed;
                    CancelItem.Second.FixMethod         = enmFixMethod.UnFixed;
                    Solution.PlaneIdAirlineDic[GapItem.PlaneID].Add(CancelItem.First);
                    Solution.PlaneIdAirlineDic[GapItem.PlaneID].Add(CancelItem.Second);
                    Solution.PlaneIdAirlineDic[GapItem.PlaneID].Sort((x, y) => { return(x.ModifiedStartTime.CompareTo(y.ModifiedStartTime)); });
                    CoreAlgorithm.AdjustAirLineList(Solution.PlaneIdAirlineDic[GapItem.PlaneID]);
                    Solution.GetAirlineDicByPlaneId();
                    GapItem.IsFilled = true;
                }
            }
        }