Exemplo n.º 1
0
        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;
            }
        }
Exemplo n.º 2
0
        /*********************************************************************************************************************************************
         *  - 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;
            }
        }
Exemplo n.º 3
0
        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);
        }