Пример #1
0
 public Solution(Solution _Solution)
 {
     this.Residuals = new List<int>() { }; this.Residuals.AddRange(_Solution.Residuals);
     this.Unknowns = new List<int>() { }; this.Unknowns.AddRange(_Solution.Unknowns);
     this.Residuals_Sum = _Solution.Residuals_Sum;
     this.Unknowns_Sum = _Solution.Unknowns_Sum;
 }
 private void Simplex_Deep_Cycle()
 {
     Residual_Back = new List<int>(Global_Task.Rezults);
     Solution_List = new ConcurrentStack<Solution>() { };
     Best_Solution = new Solution(Enumerable.Repeat(0, Task.Unknown_Multipliers[0].Count).ToList());
     Start_Sum_Process = false;
     Continue_Calculation = true;
     while (Continue_Calculation == true)
     {
         Data = new Data_Possibilitys();
         Make_Simplex_Tabel();
         Continue_Calculation = false;
         Simplex_Cycle(Table);
         Start_Sum_Process = true;
         Find_Best_Solution();
         Prepare_For_Data_Reading();
     }
 }
Пример #3
0
 private void Generate_Children_Solutions(object Thread_Info)
 {
     Random Random_Number = new Random();
     int Original_Count = Solution_List.Count;
     for (int i = 0; i < Original_Count; i++)
     {
         for (int j = 0; j < count; j++)
         {
             Solution New_Solution = new Solution(Solution_List[i]);
             for (int h = 0; h < New_Solution.Unknowns.Count; h++)
             {
                 int New_Value = Convert.ToInt32(New_Solution.Unknowns[h] * argument);
                 New_Solution.Unknowns[h] = New_Value;
                 Reduce_Residuals(h, New_Value - New_Solution.Unknowns[h], ref New_Solution);
             }
             List<int> UnusedUnkowns = new List<int>(Enumerable.Range(0, Number_Of_Unique_Unkowns));
             while (UnusedUnkowns.Count != 0)
             {
                 int Random_Unknown_Picked = Random_Number.Next(0, UnusedUnkowns.Count);
                 int Unknown_Value = Random_Number.Next(0, Find_Max_Unknown_Value(Random_Unknown_Picked, New_Solution) + 1);
                 if (Unknown_Value != 0)
                 {
                     Reduce_Residuals(Random_Unknown_Picked, Unknown_Value, ref New_Solution);
                     New_Solution.Unknowns[Random_Unknown_Picked] += Unknown_Value;
                     New_Solution.Unknowns_Sum += Unknown_Value;
                 }
                 else
                 {
                     UnusedUnkowns.RemoveAt(Random_Unknown_Picked);
                 }
             }
             Solution_List_Threading.Push(New_Solution);
         }
     }
     e.Signal();
 }
Пример #4
0
 private void Reduce_Residuals(int _Unknown_Nr, int _Unknown_Value, ref Solution _Solution)
 {
     for (int i = 0; i < _Solution.Residuals.Count; i++)
     {
         int SubTr = _Unknown_Value * Task.Unknown_Multipliers[i][_Unknown_Nr];
         _Solution.Residuals[i] -= SubTr;
         _Solution.Residuals_Sum -= SubTr;
     }
 }
Пример #5
0
        private int Find_Max_Unknown_Value(int Unknown_Nr, Solution _Solution)
        {
            int Max_Value = _Solution.Residuals[0] / Task.Unknown_Multipliers[0][Unknown_Nr];
            for (int i = 0; i < Number_Of_Results; i++)
            {
                if (Task.Unknown_Multipliers[i][Unknown_Nr] != 0)
                {
                    int Test_Value = _Solution.Residuals[i] / Task.Unknown_Multipliers[i][Unknown_Nr];
                    if (Test_Value < Max_Value)
                    {
                        Max_Value = Test_Value;
                    }

                }
            }
            return Max_Value;
        }
Пример #6
0
 private void Generate_Starting_Solutions(object Thread_Info)
 {
     Random Random_Number = new Random();
     int Number_Of_Zeros = Task.Unknown_Multipliers[0].Count;
     for (int Made_Items = 0; Made_Items < count; Made_Items++)
     {
         Solution New_Solution = new Solution(Task.Rezults, Task.Rezults.Sum(), Enumerable.Repeat(0, Number_Of_Zeros).ToList());
         List<int> UnusedUnkowns = new List<int>(Enumerable.Range(0,Number_Of_Unique_Unkowns));
         while (UnusedUnkowns.Count != 0)
         {
             int Random_Unknown_Picked = Random_Number.Next(0, UnusedUnkowns.Count);
             int Unknown_Value = Random_Number.Next(0, Find_Max_Unknown_Value(Random_Unknown_Picked, New_Solution) + 1);
             if (Unknown_Value != 0)
             {
                 Reduce_Residuals(Random_Unknown_Picked, Unknown_Value, ref New_Solution);
                 New_Solution.Unknowns[Random_Unknown_Picked] += Unknown_Value;
                 New_Solution.Unknowns_Sum += Unknown_Value;
             }
             else
             {
                 UnusedUnkowns.RemoveAt(Random_Unknown_Picked);
             }
         }
         Solution_List_Threading.Push(New_Solution);
     }
     e.Signal();
 }
 private void Find_Best_Solution()
 {
     List<Solution> Sol = new List<Solution>(Solution_List.ToList());
     int max = -1;
     int mx = -1;
     for (int i = 0; i < Sol.Count; i++)
     {
         if (max < Sol[i].Unknowns_Sum)
         {
             max = Sol[i].Unknowns_Sum;
             mx = i;
         }
     }
     if (mx != -1)
     {
         Best_Solution = new Solution(Sol[mx]);
     }
 }
        private Boolean Test_Simplex_Answer(Simplex_Table Table, List<int> Residual)
        {
            Solution Solution = new Solution(Residual, Residual.Sum(), Enumerable.Repeat(0, Task.Unknown_Multipliers[0].Count).ToList());
            for (int j = 0; j < Table.Selected_Indicator.Count; j++)
            {
                int index = Table.Selected_Indicator[j];
                if (index >= 0)
                {
                    Solution.Unknowns[index] = Table.Selected_Indicators_Result[j];
                }
            }
            Solution.Unknowns_Sum = Solution.Unknowns.Sum();
            if (Solution.Unknowns_Sum > 0)
            {
                if (Start_Sum_Process == true)
                {
                    Solution.Unknowns_Sum += Best_Solution.Unknowns_Sum;
                    for (int i = 0; i < Best_Solution.Unknowns.Count; i++)
                    {
                        Solution.Unknowns[i] += Best_Solution.Unknowns[i];
                    }
                }
                Solution_List.Push(Solution);
            }

            int Sum_Answers = 0;
            List<int> Row = Table.Selected_Indicators_Result;
            int count = Row.Count;
            for (int i = 0; i < count; i++)
            {
                if (Table.Selected_Indicator[i] >= 0)
                {
                    if (Row[i] < 0)
                    {
                        return false;
                    }
                    Sum_Answers += Row[i];
                }
            }
            return true;
        }