Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        public GeneRange GetConflictedRange(PermutationChromosome chromosome)
        {
            var conflicted     = Random.GetInt(0, chromosome.ConflictList.Count);
            var sourcePosition = chromosome.ConflictList[conflicted];

            return(sourcePosition);
        }
Exemplo n.º 6
0
        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));
        }
Exemplo n.º 7
0
        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);
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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);
        }
Exemplo n.º 11
0
 public GeneRange GetSourceRange(PermutationChromosome chromosome)
 {
     return(ConflictShouldBeEliminated(chromosome)
         ? GetConflictedRange(chromosome)
         : GetRandomRange(chromosome));
 }