public CGroup Selection() { CGroup rSelectedGroup = new CGroup(m_rUpdater, m_rLaw); m_sSelectionLog = ""; double[] aSelectionPercents = new double[GroupSize]; double fGradesSum = 0; for (int i = 0; i < GroupSize; i++) { fGradesSum += GetGradeAtChromosome(i); } double fAvgGrade = fGradesSum / GroupSize; double fReverseGradesSum = 0; for (int i = 0; i < GroupSize; i++) { //aSelectionPercents[i] = fGradesSum - GetGradeAtChromosome(i); //fReverseGradesSum += aSelectionPercents[i]; aSelectionPercents[i] = fAvgGrade / GetGradeAtChromosome(i); fReverseGradesSum += aSelectionPercents[i]; } for (int i = 0; i < GroupSize; i++) { aSelectionPercents[i] = aSelectionPercents[i] / fReverseGradesSum; } UpdateSelectionLog(aSelectionPercents); for (int i = 0; i < GroupSize; i++) { double fRandom = SCRandom.Random; rSelectedGroup.AddChromosome(m_aChromosomes[GetNumberInGroup(fRandom, aSelectionPercents)]); } return(rSelectedGroup); }
public void Evolution() { CGroup rChilds = m_rPopulation.Selection().Crossbreeding(); rChilds.Mutate(); m_rPopulation.GenerateNewGroup(rChilds); }
public void GenerateNewGroup(CGroup rNewbies) { for (int i = 0; i < rNewbies.GroupSize; i++) { CChromosome rNewChromosome = rNewbies.m_aChromosomes[i]; int iWorstChromosomeIndex = GetWorst(); double fWorstGrade = GetGradeAtChromosome(iWorstChromosomeIndex); double fNewChromosomeGrade = rNewbies.GetGradeAtChromosome(i); if (fNewChromosomeGrade < fWorstGrade) { m_aChromosomes.Remove(m_aChromosomes[iWorstChromosomeIndex]); m_aChromosomes.Add(rNewChromosome); } } }
public void TestSelection() { m_rPopulation = new CGroup(m_rGraph, m_rLaw); m_rPopulation.GenerateChromosomes(m_rLaw.PopulationSize); Console.WriteLine(m_rPopulation.ToString()); CGroup rSelection = m_rPopulation.Selection(); Console.WriteLine(m_rPopulation.m_sSelectionLog); Console.WriteLine(rSelection.ToString()); Console.WriteLine(rSelection.Crossbreeding().ToString()); double fLastBestGrade = m_rPopulation.GetBestGrade(); Console.WriteLine(fLastBestGrade.ToString()); fLastBestGrade = rSelection.GetBestGrade(); Console.WriteLine(fLastBestGrade.ToString()); }
public CGroup Crossbreeding() { CGroup rChilds = new CGroup(m_rUpdater, m_rLaw); int iFirstCrossing = -1; for (int i = 0; i < GroupSize; i++) { double fDecision = SCRandom.Random; if (m_rLaw.CrossbreedingChance > fDecision) { if (iFirstCrossing == -1) { iFirstCrossing = i; } else { rChilds.AddChromosome(m_aChromosomes[iFirstCrossing].Crossbreeding (m_aChromosomes[i])); iFirstCrossing = -1; } } } return(rChilds); }
public void InitializeGroup() { m_rPopulation = new CGroup(m_rUpdater, m_rLaw); m_rPopulation.GenerateChromosomes(m_rLaw.PopulationSize); m_fLastBestGrade = m_rPopulation.GetBestGrade(); }