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