From 760fa87c2f6fb9e638bba889928bdc145394a534 Mon Sep 17 00:00:00 2001 From: ningshuxia <ningshuxia0927@outlook.com> Date: 星期四, 06 六月 2024 13:51:55 +0800 Subject: [PATCH] 同段泵组合 新增 --- IStation.Service/07-algorithm/02-schedule/ScheduleHelper.cs | 128 +++++++++++++++++++++++++++++++++++++++++- 1 files changed, 123 insertions(+), 5 deletions(-) diff --git a/IStation.Service/07-algorithm/02-schedule/ScheduleHelper.cs b/IStation.Service/07-algorithm/02-schedule/ScheduleHelper.cs index b0b20cf..c22e2ed 100644 --- a/IStation.Service/07-algorithm/02-schedule/ScheduleHelper.cs +++ b/IStation.Service/07-algorithm/02-schedule/ScheduleHelper.cs @@ -24,6 +24,7 @@ List<int> _must_close_flag_list = null; // 蹇呭叧娉靛垪琛� List<List<int>> _forbidden_flag_combine_list = null; // 绂佺敤娉电粍鍚� List<List<int>> _associative_flag_combine_list = null; // 鍏宠仈娉电粍鍚� + List<List<int>> _same_section_flag_combine_list = null; // 鍚屾娉电粍鍚� List<Model.WaterSupplyLimit> _water_supply_limit_list = null; //渚涙按闄愬埗鍒楄〃 List<Model.FrequencyLimit> _frequency_limit_list = null; // 棰戠巼闄愬埗鍒楄〃 //List<int> _priority_order_flag_list = null; // 浼樺厛搴︽帓搴� 鏆傛湭鑰冭檻 @@ -38,22 +39,23 @@ _must_close_flag_list = null; _forbidden_flag_combine_list = null; _associative_flag_combine_list = null; + _same_section_flag_combine_list = null; _water_supply_limit_list = null; _frequency_limit_list = null; - if (schedule_config!=null) + if (schedule_config != null) { _must_open_flag_list = schedule_config.MustOpenFlagList; _must_close_flag_list = schedule_config.MustCloseFlagList; _forbidden_flag_combine_list = schedule_config.ForbiddenFlagCombineList; _associative_flag_combine_list = schedule_config.AssociativeFlagCombineList; + _same_section_flag_combine_list = schedule_config.SameSectionFlagCombineList; _water_supply_limit_list = schedule_config.WaterSupplyLimitList; _frequency_limit_list = schedule_config.FrequencyLimitList; - } + } } - - + /// <summary> /// 璁$畻 /// </summary> @@ -70,9 +72,9 @@ var must_close_flag_list = _must_close_flag_list; var forbidden_flag_combine_list = _forbidden_flag_combine_list; var associative_flag_combine_list = _associative_flag_combine_list; + var same_section_flag_combine_list = _same_section_flag_combine_list; var water_supply_limit_list = _water_supply_limit_list; var frequency_limit_list = _frequency_limit_list; - // var priority_order_flag_list = _priority_order_flag_list; if (pumps == null || !pumps.Any()) { @@ -116,6 +118,80 @@ var exist_associative_flag_combine_list = associative_flag_combine_list != null && associative_flag_combine_list.Count > 0; #endregion + + #region 瀛樺湪-鍚屾娉电粍鍚� + + Dictionary<int, List<int[]>> same_section_combine_dict = new(); + var exist_same_section_flag_combine_list = _same_section_flag_combine_list != null && _same_section_flag_combine_list.Count > 0; + if (exist_same_section_flag_combine_list) + { + for (int pump_count = 1; pump_count <= pumps.Count; pump_count++) + { + same_section_combine_dict[pump_count] = new List<int[]>(); + switch (pump_count) + { + case 2: + { + foreach (var same_section_flag_combine in same_section_flag_combine_list) + { + var combine_list = GetCombineList(same_section_flag_combine, 2); + same_section_combine_dict[pump_count].AddRange(combine_list); + } + } + break; + case 3: + { + foreach (var same_section in same_section_flag_combine_list) + { + var combine_list = GetCombineList(same_section, 3); + same_section_combine_dict[pump_count].AddRange(combine_list); + } + } + break; + case 4: + { + foreach (var same_section in same_section_flag_combine_list) + { + var combine_list3 = GetCombineList(same_section, 3); + same_section_combine_dict[pump_count].AddRange(combine_list3); + if (same_section.Count > 3) + { + var combine_list = GetCombineList(same_section, 4); + same_section_combine_dict[pump_count].AddRange(combine_list); + } + } + } + break; + case 5: + { + foreach (var same_section in same_section_flag_combine_list) + { + if (same_section.Count > 3) + { + var combine_list = GetCombineList(same_section, 4); + same_section_combine_dict[pump_count].AddRange(combine_list); + } + } + } + break; + case 6: + { + foreach (var same_section in same_section_flag_combine_list) + { + if (same_section.Count > 3) + { + var combine_list = GetCombineList(same_section, 4); + same_section_combine_dict[pump_count].AddRange(combine_list); + } + } + } + break; + default: + break; + } + } + } + #endregion #region 瀛樺湪-渚涙按闄愬埗 @@ -175,6 +251,7 @@ foreach (var combine in combine_list) { double combine_merit_ratio = 1;//缁勫悎鎷╀紭鐜� + //蹇呭紑 if (exist_must_open_flag_list) { @@ -182,6 +259,7 @@ if (!combine_remark.Contains(must_open_flag_list_remark)) continue; } + //蹇呭叧 if (exist_must_close_flag_list) { @@ -189,6 +267,7 @@ if (exist_intersected) continue; } + //绂佺敤缁勫悎 if (exist_forbidden_flag_combine_list) { @@ -204,6 +283,31 @@ if (exist_equal) continue; } + + //鍚屾娉电粍鍚� + if (exist_same_section_flag_combine_list) + { + var exist_equal = false; + foreach (var flag_list in same_section_combine_dict[pumpCount]) + { + //鐩稿悓 + if (combine.SequenceEqual(flag_list)) + { + exist_equal = true; + break; + } + + //鍖呭惈 + if (flag_list.Intersect(combine).Count() == flag_list.Length) + { + exist_equal = true; + break; + } + } + if (exist_equal) + continue; + } + //鍏宠仈缁勫悎 if (exist_associative_flag_combine_list) { @@ -445,6 +549,8 @@ } } } + if (total_flow < target_flow) + continue; if (optimal_combine_part1 == null && optimal_combine_part2 == null) continue; @@ -503,6 +609,18 @@ return opt; } + /// <summary> + /// 鑾峰彇缁勫悎 + /// </summary> + /// <param name="flags"></param> + /// <param name="count"></param> + /// <returns></returns> + private List<int[]> GetCombineList(List<int> flags, int count) + { + var combine = IStation.Curve.PermutationAndCombination<int>.GetCombination(flags.ToArray(), count); + return combine; + } + /// <summary> /// 鏍规嵁宸ュ喌璁$畻 -- Gitblit v1.9.3