namespace IStation.Algorithm { #region ViewModel /// /// 分析泵项 /// public class Combine { public Combine() { } public List PumpIds { get; set; } public string RunFlag { get; set; } public int RunCount { get; set; } public double Frequency { get; set; } public double Flow { get; set; } public double Head { get; set; } public double Power { get; set; } } /// /// 分析泵项 /// public class OptimalCombine { public OptimalCombine() { } public List PumpIds { get; set; } public double Flow { get; set; } public double Head { get; set; } public double Power { get; set; } public List Combines { get; set; } } #endregion /// /// 调度分析辅助类 /// public class SchedulingHelper { double _frequency_def = 50; double _frequency_min = 25; double _frequency_max = 50; double _frequency_space = 0.1;//频率间隔 double _head_space = 0.1;//扬程间隔 #region RunFlag string _falgFrePumpTag = "B"; string _falgFixPumpTag = "G"; string _falgSpaceMark = "_"; string GetRunFlag(int[] flags) { var runFlag = string.Empty; var index = 0; var count = flags.Length; foreach (var flag in flags) { runFlag += GetGFlag(flag); index++; if (index != count) { runFlag += _falgSpaceMark; } } return runFlag; } string GetRunFlag(List flags) { var runFlag = string.Empty; var index = 0; var count = flags.Count; foreach (var flag in flags) { runFlag += GetGFlag(flag); index++; if (index != count) { runFlag += _falgSpaceMark; } } return runFlag; } string GetGFlag(int flag) { return _falgFrePumpTag + flag; } #endregion DAL.ScheduleCombine _dal = new DAL.ScheduleCombine(); DAL.ScheduleConclusion _dalScheduleConclusion = new DAL.ScheduleConclusion(); DAL.ScheduleAnaLog _dalAnaLog = new DAL.ScheduleAnaLog(); private List _combineFlags1 = new List() { 11, 12, 13, 14, 16, 17, 18 }; private List _combineFlags2 = new List() { 15 }; public void Ana(List pumps, double tagetFlow, double tagetHead) { List open_combine_flags_1 = new List(); List open_combine_flags_2 = new List(); if (openPumpCombine != null && openPumpCombine.Any()) { foreach (var pump in openPumpCombine) { if (_combineFlags1.Contains(pump)) { open_combine_flags_1.Add(pump); } else { open_combine_flags_2.Add(pump); } } } else { open_combine_flags_1 = _combineFlags1.ToList(); open_combine_flags_2 = _combineFlags2.ToList(); } List combineList1 = null; List combineList2 = null; var open_combine_flags_1_count = open_combine_flags_1.Count; if (open_combine_flags_1_count > 0) { bool isSingular = false; var combine_flags_combination_list = PermutationAndCombination.GetCombination(open_combine_flags_1.ToArray(), 2); if ((open_combine_flags_1_count % 2) > 0) { isSingular = true; foreach (var flag in open_combine_flags_1) { combine_flags_combination_list.Add(new int[] { flag }); } } var combine_conclusion_dic = new Dictionary>(); foreach (var combine_flags in combine_flags_combination_list) { var runFlag = GetRunFlag(combine_flags); if (combine_conclusion_dic.ContainsKey(runFlag)) continue; var conclusionList = _dalScheduleConclusion.GetList(runFlag, tagetHead); combine_conclusion_dic[runFlag] = conclusionList; } if (combine_conclusion_dic.Count < 1) { ////无法计算 //return; } var combine_flags_permutation_list = PermutationAndCombination.GetPermutation(open_combine_flags_1.ToArray()); for (int i = 0; i < length; i++) { } foreach (var combine_flags_permutation in combine_flags_permutation_list) { var combine_part_flags_list = new List(); for (int i = 0; i < combine_flags_permutation.Length / 2; i++) { var flags = combine_flags_permutation.Skip(i * 2).Take(2).ToArray(); combine_part_flags_list.Add(flags); } if (isSingular) { var last_flag = combine_flags_permutation[combine_flags_permutation.Length - 1]; combine_part_flags_list.Add(new int[] { last_flag }); } if (combine_part_flags_list.Count < 1) continue; List combines = new List(); Dictionary> combines_fre_list = new Dictionary>(); for (double fre = _frequency_max; fre >= _frequency_min; fre -= _frequency_space) { var freItem = new AnaPumpFreItem(); freItem.Frequency = Math.Round(fre, 1); freItem.CurveQH = Curve.PumpCalculateHelper.CalculateSimilarQH(this.CurveQH, freDef, fre); freItem.CurveQP = Curve.PumpCalculateHelper.CalculateSimilarQP(this.CurveQP, freDef, fre); this.AnaFrequencyItems.Add(freItem); } foreach (var combine_part_flags in combine_part_flags_list) { var runFlag = GetRunFlag(combine_part_flags); } } } } private OptimalCombine AnaOptimalCombine(List combineList1, List combineList2, double targetFlow, double targetHead) { double flowDeviation = targetFlow; double totalPower = double.MaxValue; double totalFlow = double.MaxValue; Combine optimalCombine1 = null; Combine optimalCombine2 = null; for (int combineIndex1 = 0; combineIndex1 < combineList1.Count; combineIndex1++) { for (int combineIndex2 = 0; combineIndex2 < combineList2.Count; combineIndex2++) { var combine1 = combineList1[combineIndex1]; var combine2 = combineList2[combineIndex2]; var combineTotalFlow = combine1.Flow + combine2.Flow; var combineTotalPower = combine1.Power + combine2.Power; var diffFlow = Math.Abs(combineTotalFlow - targetFlow); if (diffFlow < flowDeviation) { optimalCombine1 = combine1; optimalCombine2 = combine2; totalPower = combine1.Power + combine2.Power; totalFlow = combineTotalFlow; flowDeviation = diffFlow; } if (diffFlow < targetFlow * 0.01 && combineTotalPower < totalPower) { optimalCombine1 = combine1; optimalCombine2 = combine2; totalPower = combine1.Power + combine2.Power; totalFlow = combineTotalFlow; } } } if (optimalCombine1 == null && optimalCombine2 == null) return default; var optimalCombine = new OptimalCombine(); optimalCombine.Combines = new List(); if (optimalCombine1 != null) { optimalCombine.Combines.Add(optimalCombine1); } if (optimalCombine2 != null) { optimalCombine.Combines.Add(optimalCombine2); } optimalCombine.Flow = totalFlow; optimalCombine.Power = totalPower; return optimalCombine; } /// /// 插入分析日志 /// private void InsertAnaLog(string info) { var entity = new Entity.ScheduleAnaLog(info); _dalAnaLog.Insert(entity); } /// /// 判断表是否存在 /// public bool ExistTable(string runFlag) { return _dal.ExistTable(runFlag); } } }