public void Crossover(ref ScheduleGenome p2, ref ScheduleGenome o1) { int cutpoint = SimpleRNG.Next(0, _jobsLength); //Debug.Write(Environment.NewLine + "Distance between " + p1 + " - " + p2 + ": " + population[p1].Distance(population[p2])); for (int i = 0; i < _jobsLength; i++) { o1.JobGenes[i] = JobGenes[i]; } Debug.Assert(o1.IsValid(), "Invalid creature before crossover"); List <int> remainder = new List <int>(p2.JobGenes); for (int i = 0; i < cutpoint; i++) { remainder.Remove(JobGenes[i]); } for (int i = cutpoint; i < _jobsLength; i++) { o1.JobGenes[i] = remainder[i - cutpoint]; } Debug.Assert(o1.IsValid(), "Invalid creature after crossover"); RealCrossover(ref p2, ref o1); CombinationCrossover(ref p2, ref o1); }
public void RealCrossover(ref ScheduleGenome p2, ref ScheduleGenome o1) { switch (realCrossover) { case RealCrossoverOp.MeanWithNoise: // Mean-with-noise Crossover: for (int i = 0; i < _modesLength; i++) { double mean = TimeGenes[i] + p2.TimeGenes[i]; mean = mean / 2.0; o1.TimeGenes[i] = SimpleRNG.GetNormal(mean, 0.5); if (o1.TimeGenes[i] < 0.0) { o1.TimeGenes[i] = 0.0; } } break; case RealCrossoverOp.Uniform: // Uniform Crossover: int cutpoint = SimpleRNG.Next(0, _modesLength + 1); for (int i = 0; i < cutpoint; i++) { o1.TimeGenes[i] = TimeGenes[i]; } for (int i = cutpoint; i < _modesLength; i++) { o1.TimeGenes[i] = p2.TimeGenes[i]; } break; } }
public ScheduleGenome(ScheduleGenome g) { JobGenes = new int[g._jobsLength]; TimeGenes = new double[g._timesLength]; ModeGenes = new int[g._modesLength]; _delayRate = g._delayRate; _delayMean = g._delayMean; _jobsLength = g._jobsLength; _timesLength = g._timesLength; _modesLength = g._modesLength; _numberOfModes = g._numberOfModes; _mutationRate = g._mutationRate; realCrossover = g.realCrossover; for (int i = 0; i < g._jobsLength; i++) { JobGenes[i] = g.JobGenes[i]; } for (int i = 0; i < g._timesLength; i++) { TimeGenes[i] = g.TimeGenes[i]; } for (int i = 0; i < g._modesLength; i++) { ModeGenes[i] = g.ModeGenes[i]; } fitness = -1; }
public double Distance(ScheduleGenome c) { double d = 0; for (int i = 0; i < _modesLength; i++) { d += Math.Pow(TimeGenes[i] - c.TimeGenes[i], 2.0); } return(Math.Sqrt(d)); }
public void CombinationCrossover(ref ScheduleGenome p2, ref ScheduleGenome o1) { int cutpoint = SimpleRNG.Next(0, _modesLength); for (int i = 0; i < cutpoint; i++) { o1.ModeGenes[i] = p2.ModeGenes[i]; } for (int i = cutpoint; i < _modesLength; i++) { o1.ModeGenes[i] = ModeGenes[i]; } }
public void Copy(ScheduleGenome c) { fitness = c.fitness; for (int i = 0; i < JobGenes.Length; i++) { JobGenes[i] = c.JobGenes[i]; if (i < _modesLength) { TimeGenes[i] = c.TimeGenes[i]; ModeGenes[i] = c.ModeGenes[i]; } } }
public void IntializePopulations(ScheduleGenome genomeDefinition) { elite = new ScheduleGenome(genomeDefinition); elite.realCrossover = realCrossover; elite.RandomInit(); for (int i = 0; i < _popsize; i++) { population[i] = new ScheduleGenome(elite); population[i].RandomInit(); //population[i] = new ScheduleGenome(length, tl, modes, mutationRate, delayRate, delayMean); //population[i].realCrossover = realCrossover; } for (int i = 0; i < _offsize; i++) { offspring[i] = new ScheduleGenome(elite); offspring[i].RandomInit(); //offspring[i] = new ScheduleGenome(length, tl, modes, mutationRate, delayRate, delayMean); //offspring[i].realCrossover = realCrossover; } }
// todo: broken, fix. public void SeedPopulation(int[] genes, double[] times, int[] modes, int mModes, double mutationRate) { population[0] = new ScheduleGenome(genes.Length, times.Length, modes.Length, mModes, mutationRate, genes, times, modes); }