public GAs(int m_Population_size, int m_IndividualLength, RadialNetwork RadialNetwork, double m_MaxIterations, double[][] inputData) { this.m_Population_size = m_Population_size; this.m_IndividualLength = m_IndividualLength; this.m_Random = new Random(); this.Population = new Population_GA(m_Population_size); this.m_RadialNetwork = RadialNetwork; this.m_MaxIterations = m_MaxIterations; this.Population.Population_init(m_IndividualLength); // set fitness for (int i = 0; i < m_Population_size; i++) { CalculateFitnessOf(Population.Individuals[i], inputData); } }
// Đây là quá trình tiến hóa của GA nhé public void Reproduction(double[][] inputData) { for (int i = 0; i < m_MaxIterations; i++) { Population_GA pop_temp = new Population_GA(m_Population_size); // tao mot population tam pop_temp = (Population_GA)Population.Clone(); // Duyệt qua tất cả các cá thể trong quần thể for (int index = 0; index < m_Population_size; index++) { Individual_GA currIndividual = pop_temp.Individuals[index]; int sol1 = (int)(m_Random.NextDouble() * (m_Population_size - 1)); int sol2 = (int)(m_Random.NextDouble() * (m_Population_size - 1)); Individual_GA solution1 = pop_temp.Individuals[sol1]; Individual_GA solution2 = pop_temp.Individuals[sol2]; while (sol1 == sol2) { sol2 = (int)(m_Random.NextDouble() * (m_Population_size - 1)); solution2 = pop_temp.Individuals[sol2]; } Individual_GA[] Childs = DoCrossover(solution1, solution2);//DoCrossover(solution1, solution2);// DoMutation(Childs[0]); DoMutation(Childs[1]); // tính toán lại độ thích nghi và từ đó tính ra MSE của cá thể đang xét double MSE_temp1 = CalculateFitnessOf(Childs[0], inputData); double MSE_temp2 = CalculateFitnessOf(Childs[1], inputData); // Chọn lọc // chỉ với những cái cho ra MSE tốt thì mới được cho vào thế hệ mới, còn không vẫn giữ những cái cũ if (MSE_temp1 > MSE_temp2) { if (MSE_temp1 > currIndividual.Fitness) { Childs[0].Values.CopyTo(Population.Individuals[index].Values, 0); } } else { if (MSE_temp2 > currIndividual.Fitness) { Childs[1].Values.CopyTo(Population.Individuals[index].Values, 0); } } } } }