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