public CChromosome Crossbreeding(CChromosome rChromosomePartner) { CChromosome rChild = new CChromosome(m_rLaw); IList <int> aGensToChange = new List <int>(); for (int i = 0; i < m_aGens.Length; i++) { double fDecision = SCRandom.Random; if ((0.5 * m_rLaw.CrossbreedingChance) > fDecision) { aGensToChange.Add(m_aGens[i]); } } int[] aSelectedLocuses = FindLocusesWithValues(aGensToChange.ToArray()), aSelectedLocusesPartner = rChromosomePartner.FindLocusesWithValues(aGensToChange.ToArray()), aNotSelectedLocuses = NotSelectedLocuses(aSelectedLocuses), aNotSelectedLocusesPartner = rChromosomePartner.NotSelectedLocuses(aSelectedLocusesPartner), aChildGens = new int[m_rLaw.GensCount]; int iNonSelectedIndex = 0; for (int i = 0; i < aChildGens.Length; i++) { if (IsNotPresentInSequence(i, aNotSelectedLocusesPartner)) { aChildGens[i] = rChromosomePartner.m_aGens[i]; } else { aChildGens[i] = m_aGens[aNotSelectedLocuses[iNonSelectedIndex]]; iNonSelectedIndex++; } } rChild.Gens = aChildGens; return(rChild); }
public void TestCrossBreeding() { CChromosome rFirst = new CChromosome(m_rLaw), rSecond = new CChromosome(m_rLaw), rChild = null; Console.WriteLine(rFirst.ToString()); Console.WriteLine(rSecond.ToString()); rChild = rFirst.Crossbreeding(rSecond); Console.WriteLine(rChild.ToString()); rChild = rSecond.Crossbreeding(rFirst); Console.WriteLine(rChild.ToString()); }
public double UpdateGrade(CChromosome rChromosome) { double fPathDistance = 0; int[] aGens = rChromosome.Gens; int iLastIndex = aGens.Length - 1; for (int i = 0; i < iLastIndex; i++) { fPathDistance += aDistancesGraph[aGens[i]][aGens[i + 1]]; } fPathDistance += aDistancesGraph[aGens[iLastIndex]][aGens[0]]; return(fPathDistance); }
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); } } }
private void AddChromosome(CChromosome rChromosome) { m_aChromosomes.Add(rChromosome); GroupSize++; }