public void MFO_Crossover(Crossover_Parameters crss_Para, Chromosome par_1, Chromosome par_2, int num_Genens, ref Chromosome child_1, ref Chromosome child_2, Random rnd) { switch (crss_Para.Crossver_Name) { case "REAL_CROSSVER": child_1.Rnvec = real_Crossover(par_1.Rnvec, par_2.Rnvec, num_Genens, crss_Para.Cf); child_2.Rnvec = real_Crossover(par_1.Rnvec, par_2.Rnvec, num_Genens, crss_Para.Cf); break; case "ONE_POINT_CROSSOVER": one_Point_Crossover(par_1.Rnvec, par_2.Rnvec, num_Genens, child_1.Rnvec, child_2.Rnvec, rnd); break; case "PMX": PMX(par_1.Invec, par_2.Invec, num_Genens, child_1.Invec, child_2.Invec, rnd); break; case "PRUFER_ONE_POINT_CROSSOVER": prufer_One_Point_Crossover(par_1.Invec, par_2.Invec, num_Genens, child_1.Invec, child_2.Invec, rnd); break; case "PRIMRST_CROSSOVER": child_1.Edges_Matrix = primRST_Crossover(par_1.Edges_Matrix, par_2.Edges_Matrix, num_Genens, rnd); //???child_2 break; } }
/********************************************************************************************************************************************* * - PrimRST_Crossover: Chi tao ra 1 ca the con * - num_Genens: * + PRUFER_ONE_POINT_CROSSOVER: Num_Vertex - 2 * + PRIMRST_CROSSOVER: Num_Vertex ********************************************************************************************************************************************/ public void MFO_Crossover(Crossover_Parameters crss_Para, Chromosome par_1, Chromosome par_2, int num_Genens, int num_Tasks, ref List <Chromosome> child, Tasks tsk, Random rnd) { Chromosome child_1; Chromosome child_2; switch (crss_Para.Crossver_Name) { case "REAL_CROSSVER": #region REAL_CROSSVER child_1 = new Chromosome(num_Genens, num_Tasks); child_1.Rnvec = real_Crossover(par_1.Rnvec, par_2.Rnvec, num_Genens, crss_Para.Cf); child.Add(child_1); child_2 = new Chromosome(num_Genens, num_Tasks); child_2.Rnvec = real_Crossover(par_1.Rnvec, par_2.Rnvec, num_Genens, crss_Para.Cf); child.Add(child_2); #endregion break; case "ONE_POINT_CROSSOVER": #region ONE_POINT_CROSSOVER child_1 = new Chromosome(num_Genens, num_Tasks); child_2 = new Chromosome(num_Genens, num_Tasks); one_Point_Crossover(par_1.Rnvec, par_2.Rnvec, num_Genens, child_1.Rnvec, child_2.Rnvec, rnd); child.Add(child_1); child.Add(child_2); #endregion break; case "PMX": #region PMX child_1 = new Chromosome(num_Genens, num_Tasks); child_2 = new Chromosome(num_Genens, num_Tasks); PMX(par_1.Invec, par_2.Invec, num_Genens, child_1.Invec, child_2.Invec, rnd); child.Add(child_1); child.Add(child_2); #endregion break; case "PRUFER_ONE_POINT_CROSSOVER": #region PRUFER_ONE_POINT_CROSSOVER child_1 = new Chromosome(num_Genens, num_Tasks); child_2 = new Chromosome(num_Genens, num_Tasks); prufer_One_Point_Crossover(par_1.Invec, par_2.Invec, num_Genens, child_1.Invec, child_2.Invec, rnd); child.Add(child_1); child.Add(child_2); #endregion break; case "PRIMRST_CROSSOVER": #region PRIMRST_CROSSOVER //if (!init_Chrom.check_Symetric_Matrix(num_Genens, par_1.Edges_Matrix)) //{ // Console.WriteLine("Par_1 ko doi xung"); // ioFile.writeMatrixToFile("Par_1_truoc_lai_ghep.txt", par_1.Edges_Matrix, num_Genens, false); // Console.ReadKey(); // return; //} //if (!init_Chrom.check_Symetric_Matrix(num_Genens, par_2.Edges_Matrix)) //{ // Console.WriteLine("Par_2 ko doi xung"); // ioFile.writeMatrixToFile("Par_2_truoc_lai_ghep.txt", par_1.Edges_Matrix, num_Genens, false); // Console.ReadKey(); // return; //} child_1 = new Chromosome(num_Genens, num_Tasks); child_1.Edges_Matrix = primRST_Crossover(par_1.Edges_Matrix, par_2.Edges_Matrix, num_Genens, rnd); child.Add(child_1); #endregion break; case "PRIMRST_CLUSTER_CROSSOVER": #region PRIMRST_CLUSTER_CROSSOVER //if (!init_Chrom.check_Symetric_Matrix(num_Genens, par_1.Edges_Matrix)) //{ // Console.WriteLine("Par_1 ko doi xung"); // ioFile.writeMatrixToFile("Par_1_truoc_lai_ghep.txt", par_1.Edges_Matrix, num_Genens, false); // Console.ReadKey(); // return; //} //int[,] aaa = new int[num_Genens, num_Genens]; //for (int i = 0; i < num_Genens; i++) //{ // for (int j = 0; j < num_Genens; j++) // { // aaa[i, j] = (int)par_1.Edges_Matrix[i, j]; // } //} //ioFile.draw_Plot_in_Matlab("Par_1" + @".m", num_Genens, aaa); //if (!init_Chrom.check_Symetric_Matrix(num_Genens, par_2.Edges_Matrix)) //{ // Console.WriteLine("Par_2 ko doi xung"); // ioFile.writeMatrixToFile("Par_2_truoc_lai_ghep.txt", par_1.Edges_Matrix, num_Genens, false); // Console.ReadKey(); // return; //} //for (int i = 0; i < num_Genens; i++) //{ // for (int j = 0; j < num_Genens; j++) // { // aaa[i, j] = (int)par_2.Edges_Matrix[i, j]; // } //} //ioFile.draw_Plot_in_Matlab("Par_2" + @".m", num_Genens, aaa); child_1 = new Chromosome(num_Genens, num_Tasks); child_1.Edges_Matrix = primRST_Cluster_Crossover(par_1.Edges_Matrix, par_2.Edges_Matrix, num_Genens, tsk.Num_Cluster, tsk.Vertex_In_Cluster, rnd); child.Add(child_1); //double[,] temp_Matrix = new double[num_Genens, num_Genens]; //for (int i = 0; i < num_Genens; i++) //{ // for (int j = 0; j < num_Genens; j++) // { // if ((child_1.Edges_Matrix[i, j] > 0) && (child_1.Edges_Matrix[i, j] < double.MaxValue))//neu co canh // { // temp_Matrix[i, j] = child_1.Edges_Matrix[i, j]; // } // else // { // temp_Matrix[i, j] = 0; // } // } //} //int[,] aaa = new int[num_Genens, num_Genens]; //for (int i = 0; i < num_Genens; i++) //{ // for (int j = 0; j < num_Genens; j++) // { // aaa[i, j] = (int)child_1.Edges_Matrix[i, j]; // } //} //ioFile.draw_Plot_in_Matlab("Child" + @".m", num_Genens, aaa); //Graph_Method graph_Method_Class = new Graph_Method(); //graph_Method_Class.dijkstra(temp_Matrix, num_Genens, 0); #endregion break; } }
public Data_MFEA main_GA_1(string init_Individual_Alg, TerminationCondition termination_Condition, int pop_Size, Tasks[] tsk, double lambda, Crossover_Parameters cros_Para, Mutation_Parameters mu_Para, string selection_pressure, string local_Search_Method, string population_Diversity_Method, Random rnd) { Initialize_Chromosome init_Chromosome = new Initialize_Chromosome(); double best_Fitness_In_Generation = double.MaxValue, //Cá thể tốt nhất của mỗi TAS diversity_of_Pop = 0.0f; List <double> ev_Best_Fitness = new List <double>(); //Lưu best fitness tốt nhất qua các thế hệ List <double> diversity_of_pop_in_Gers = new List <double>(); //Lưu độ đa dạng quần thể qua các thế hệ Chromosome best_Ind_data; Evaluate evaluate = new Evaluate(); Chromosome[] current_pop = new Chromosome[pop_Size]; Chromosome[] offspring_pop = new Chromosome[pop_Size]; Chromosome[] c_pop = new Chromosome[2 * pop_Size]; int num_Genens = tsk[0].Dims, //D_multitask count_Evaluate = 0, //Biến trung gian đếm số lần đánh giá khi gọi hàm evaluate bst_Idx; best_Ind_data = new Chromosome(num_Genens, 1); for (int i = 0; i < pop_Size; i++) { current_pop[i] = new Chromosome(num_Genens, 1); offspring_pop[i] = new Chromosome(num_Genens, 1); c_pop[i] = new Chromosome(num_Genens, 1); c_pop[i + pop_Size] = new Chromosome(num_Genens, 1); } //Initial Population for (int i = 0; i < pop_Size; i++) { init_Chromosome.initialize_Chromosome(init_Individual_Alg, num_Genens, tsk[0], rnd, ref current_pop[i]); current_pop[i].Skill_Factor = -1; current_pop[i].Constraint_violation[0] = 0;//DO CHI CO 1 TASSK } number_of_evaluations = 0; //Evaluate population bst_Idx = -1; for (int i = 0; i < pop_Size; i++) { evaluate.evaluate(tsk, 1, lambda, ref current_pop[i], ref count_Evaluate); number_of_evaluations = number_of_evaluations + count_Evaluate; if (current_pop[i].Factorial_Cost[0] < best_Fitness_In_Generation) { best_Fitness_In_Generation = current_pop[i].Factorial_Cost[0];//do chi co 1 task bst_Idx = i; } } mfea_Class.copy_Individual(current_pop[bst_Idx], ref best_Ind_data, num_Genens, 1); ev_Best_Fitness.Add(best_Fitness_In_Generation); diversity_of_Pop = evaluate.compute_Population_Diversity(current_pop, pop_Size, num_Genens, population_Diversity_Method); diversity_of_pop_in_Gers.Add(diversity_of_Pop); int generation = 1; termination_Condition.Number_of_evaluations = number_of_evaluations; //while (generation < max_Generations) while (termination_Condition.checkTerminationCondition()) { //i. Apply genetic operators on current-pop to generate an offspring-pop (C). Refer to Algorithm 2. int count_Child = 0; while (count_Child < pop_Size) { int pos1 = rnd.Next(pop_Size); int pos2 = rnd.Next(pop_Size); while (pos1 == pos2) { pos2 = rnd.Next(pop_Size); } List <Chromosome> lst_Child = new List <Chromosome>(); mfea_Class.apply_Genetic_Operators(current_pop[pos1], current_pop[pos2], num_Genens, 1, cros_Para, mu_Para, ref lst_Child, tsk[0], rnd); for (int i = 0; i < lst_Child.Count; i++) { mfea_Class.copy_Individual(lst_Child[i], ref offspring_pop[count_Child + i], num_Genens, 1); } count_Child = count_Child + lst_Child.Count; } //ii. Evaluate the individuals in offspring-pop for selected optimization tasks only (see Algorithm 3) bst_Idx = -1; for (int i = 0; i < pop_Size; i++) { evaluate.evaluate(tsk, 1, lambda, ref offspring_pop[i], ref count_Evaluate); number_of_evaluations = number_of_evaluations + count_Evaluate; if (offspring_pop[i].Factorial_Cost[0] < best_Fitness_In_Generation) { best_Fitness_In_Generation = offspring_pop[i].Factorial_Cost[0];//do chi co 1 task bst_Idx = i; } termination_Condition.Number_of_evaluations = number_of_evaluations; //Nếu đủ điều kiện thì dừng if (!termination_Condition.checkTerminationCondition()) { break; } } if (bst_Idx != -1) { mfea_Class.copy_Individual(offspring_pop[bst_Idx], ref best_Ind_data, num_Genens, 1); } ev_Best_Fitness.Add(best_Fitness_In_Generation); //iii. Concatenate offspring-pop and current-pop to form an intermediate-pop (P ∪ C). for (int i = 0; i < pop_Size; i++) { mfea_Class.copy_Individual(current_pop[i], ref c_pop[i], num_Genens, 1); mfea_Class.copy_Individual(offspring_pop[i], ref c_pop[i + pop_Size], num_Genens, 1); } //v. Select the fittest individuals from intermediate-pop to form the next current-pop (P). if (string.Equals(selection_pressure, "elitist")) { Array.Sort(c_pop, new SortAscFactorialCostIdx()); for (int j = 0; j < pop_Size; j++) { mfea_Class.copy_Individual(c_pop[j], ref current_pop[j], num_Genens, 1); } } else { if (string.Equals(selection_pressure, "roulette wheel")) { } } //Local search if (!string.IsNullOrEmpty(local_Search_Method) && (local_Search_Method.Trim() != "NONE")) { for (int i = 0; i < pop_Size; i++) { local_Search.local_search_alg(tsk[0], local_Search_Method, num_Genens, rnd, ref offspring_pop[i], ref count_Evaluate); number_of_evaluations = number_of_evaluations + count_Evaluate; termination_Condition.Number_of_evaluations = number_of_evaluations; //Nếu đủ điều kiện thì dừng if (!termination_Condition.checkTerminationCondition()) { break; } } } diversity_of_Pop = evaluate.compute_Population_Diversity(current_pop, pop_Size, num_Genens, population_Diversity_Method); diversity_of_pop_in_Gers.Add(diversity_of_Pop); generation++; frmCmdOut.ClearFromPosToEndOfCurrentLine(50); Console.Write(String.Format("{0, 7} | {1, 13} |", generation, "")); termination_Condition.Number_of_evaluations = number_of_evaluations; } //while Data_MFEA data_MFEA = new Data_MFEA(num_Genens, 1); mfea_Class.copy_Individual(best_Ind_data, ref data_MFEA.Best_Ind_Data[0], num_Genens, 1); foreach (double items in ev_Best_Fitness) { double[] tmp = new double[1]; tmp[0] = items; data_MFEA.Ev_Best_Fitness.Add(tmp); } foreach (double items in diversity_of_pop_in_Gers) { data_MFEA.Diversity_of_Pop.Add(items); } return(data_MFEA); }