public override IChromosome Clone() { var scheduleChromosome = new ScheduleChromosome(this.JobShop, false) { ScheduleLength = this.ScheduleLength, Graph = this.Graph, Fitness = this.Fitness, }; var clonedGenes = GetGenes().Select(x => x.Value) .Cast <MachineChromosome>().Select(x => x.Clone()) .Select(x => new Gene(x)).ToArray(); scheduleChromosome.ReplaceGenes(0, clonedGenes); return(scheduleChromosome); }
private void PerformMutate(ScheduleChromosome chromosome, float probability) { if (RandomizationProvider.Current.GetDouble() <= probability) { // perform mutation by machines foreach (var gene in chromosome.GetGenes()) { if (RandomizationProvider.Current.GetDouble() <= machineMutationProbability) { // perform swap (maybe more times) machineMutation.Mutate((MachineChromosome)gene.Value, 1); chromosome.ScheduleLength = null; chromosome.Fitness = null; } } } }
private double Evaluate(ScheduleChromosome chromosome) { if (chromosome.Fitness != null) { return(chromosome.Fitness.Value); } // create graph chromosome.FixChromosome(); var graph = chromosome.Graph; double scheduleLength = new GraphHandler().GetMaximumCost(graph, chromosome.TopologicalOrder); chromosome.ScheduleLength = scheduleLength; chromosome.Fitness = 1 / (scheduleLength + 1); return(chromosome.Fitness.Value); }