public override PermutationChromosome Mutate(PermutationChromosome chromosome) { if (chromosome == null) { return(null); } if (chromosome.Genes.Length < 2) { return(null); } var genes = chromosome.Genes; var range = GetSourceRange(chromosome); var rangeEnd = range.Position + range.Length - 1; var halfLength = range.Length / 2; for (int pos = 0; pos < halfLength; pos++) { var tmp = genes[range.Position + pos]; genes[range.Position + pos] = genes[rangeEnd - pos]; genes[rangeEnd - pos] = tmp; } return(chromosome); }
public override PermutationChromosome Mutate(PermutationChromosome chromosome) { if (chromosome == null) { return(null); } if (chromosome.Genes.Length < 2) { return(chromosome); } //TODO: ConflictCheck, retry //int retryCount = ParameterSet.GetInt(ParameterNames.FailedMutationRetryCount); //while (true) //{ var sourceRange = GetSourceRange(chromosome); int targetPosition = GetRandomPositionWithTabuRange(chromosome, sourceRange); if (targetPosition < sourceRange.Position) { var swapRange = new GeneRange(targetPosition, sourceRange.Position - targetPosition); chromosome.Genes = SwapTwoRange(chromosome.Genes, swapRange, sourceRange); } else { int sourceEndPosition = sourceRange.Position + sourceRange.Length; var swapRange = new GeneRange(sourceEndPosition, targetPosition - sourceEndPosition); chromosome.Genes = SwapTwoRange(chromosome.Genes, sourceRange, swapRange); } // if (success || retryCount-- < 0) break; //} return(chromosome); }
public override PermutationChromosome Mutate(PermutationChromosome chromosome) { if (chromosome == null) { return(null); } if (chromosome.Genes.Length < 2) { return(null); } //TODO: conflictDetection, repeat, conflictList cleaning bool success = false; while (!success) { var range1 = GetSourceRange(chromosome); var range2 = GetSourceRange(chromosome); success = range1.IsDisjointWith(range2); if (success) { chromosome.Genes = SwapTwoRange(chromosome.Genes, range1, range2); } } return(chromosome); }
public int GetRandomPositionWithTabuRange(PermutationChromosome chromosome, GeneRange tabuRange) { int position = 0; bool getFromEnd = false; if (tabuRange.Position == 0) { getFromEnd = true; } else if (tabuRange.Position + tabuRange.Length < chromosome.Genes.Length) { var decision = Random.GetDouble(0, 1); if (decision > 0.5) { getFromEnd = true; } } if (getFromEnd) { position = Random.GetInt(tabuRange.Position + tabuRange.Length, chromosome.Genes.Length); } else { position = Random.GetInt(0, tabuRange.Position); } return(position); }
public GeneRange GetConflictedRange(PermutationChromosome chromosome) { var conflicted = Random.GetInt(0, chromosome.ConflictList.Count); var sourcePosition = chromosome.ConflictList[conflicted]; return(sourcePosition); }
public GeneRange GetRandomRange(PermutationChromosome chromosome) { var sourcePosition = Random.GetInt(0, chromosome.Genes.Length); var sourceLength = Random.GetInt(0, chromosome.Genes.Length - sourcePosition); return(new GeneRange(sourcePosition, sourceLength)); }
public bool ConflictShouldBeEliminated(PermutationChromosome chromosome) { if (chromosome.ConflictList.Count == 0) { return(false); } var reducingConflictPossibility = ParameterSet.GetValue(ParameterNames.ConflictReducingProbability); var rnd = Random.GetDouble(0, 1); return(rnd < reducingConflictPossibility); }
public override PermutationChromosome Mutate(PermutationChromosome chromosome) { if (chromosome == null) { return(null); } if (chromosome.Genes.Length < 2) { return(null); } var genes = chromosome.Genes; var range = GetSourceRange(chromosome); var rangeStart = range.Position; var rangeEnd = range.Position + range.Length - 1; Shuffle(genes, rangeStart, rangeEnd); return(chromosome); }
public override IList <IChromosome> Cross(IChromosome iparent0, IChromosome iparent1) { var result = new List <IChromosome>(); var parent1 = iparent0 as PermutationChromosome; var parent2 = iparent1 as PermutationChromosome; var swapRange = GetSourceRange(parent1); int[] child1Genes = CrossoverGenes(parent1.Genes, parent2.Genes, swapRange); var child1 = new PermutationChromosome(child1Genes); result.Add(child1); int[] child2Genes = CrossoverGenes(parent2.Genes, parent1.Genes, swapRange); var child2 = new PermutationChromosome(child2Genes); result.Add(child2); return(result); }
public override PermutationChromosome Mutate(PermutationChromosome chromosome) { if (chromosome == null) { return(null); } if (chromosome.Genes.Length < 2) { return(chromosome); } //TODO: ConflictCheck, retry //int retryCount = ParameterSet.GetInt(ParameterNames.FailedMutationRetryCount); //while (true) //{ var sourcePosition = Random.GetInt(0, chromosome.Genes.Length); int targetPosition = Random.GetIntWithTabu(0, chromosome.Genes.Length, sourcePosition); if (sourcePosition > targetPosition) { var tempPos = sourcePosition; sourcePosition = targetPosition; targetPosition = tempPos; } var sourceRange = new GeneRange(sourcePosition, 1); var swapRange = new GeneRange(sourcePosition + 1, targetPosition - sourcePosition - 1); chromosome.Genes = SwapTwoRange(chromosome.Genes, sourceRange, swapRange); // if (success || retryCount-- < 0) break; //} return(chromosome); }
public GeneRange GetSourceRange(PermutationChromosome chromosome) { return(ConflictShouldBeEliminated(chromosome) ? GetConflictedRange(chromosome) : GetRandomRange(chromosome)); }