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); }
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)); }
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"); }
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()); }
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; } } }