Ejemplo n.º 1
0
        public override Chromosome PerformMutation(Chromosome chromosome)
        {
            Chromosome mutated = new Chromosome(shouldInitGenes: false);

            mutated.Genes = new List <int>(chromosome.Genes);

            if (Random.NextDouble() < Settings.MutationRate)
            {
                // Generate a random gene
                //mutated.GetRandomGenes();
                Shuffle(mutated.Genes);
                mutated.MakeProperGenes();
                //Console.WriteLine("{0}", string.Join(",", chromosome.GetReadableGenes()));
                //Console.WriteLine("{0}\n", string.Join(",", mutated.GetReadableGenes()));

                mutated.CalculateFitness();
            }

            return(mutated);
        }
Ejemplo n.º 2
0
        public void CalculateAllFitness()
        {
            // initialize best individual to be the first element of the Population
            Chromosome best = Population[0];

            best.CalculateFitness();

            for (int i = 0; i < Population.Count; i++)
            {
                Population[i].CalculateFitness();

                if (Population[i].Fitness <= best.Fitness)
                {
                    best = Population[i];
                }
            }

            BestFitness    = best.Fitness;
            BestGenes      = best.Genes;
            BestChromosome = best;
        }
Ejemplo n.º 3
0
        // Crossover function
        public override Chromosome PerformCrossover(Chromosome firstParent, Chromosome secondParent)
        {
            Chromosome child = new Chromosome(shouldInitGenes: false);

            if (firstParent.Genes.SequenceEqual(secondParent.Genes))
            {
                child.Genes = firstParent.Genes;
            }
            else
            {
                bool isFeasible = false;
                int  counter    = 0;
                while (!isFeasible)
                {
                    // create new child Chromosome with same gene array size as parent; improve performance by setting shouldInitGenes: false
                    Chromosome firstChild  = new Chromosome(shouldInitGenes: false);
                    Chromosome secondChild = new Chromosome(shouldInitGenes: false);

                    counter++;

                    if (counter > 20)
                    {
                        //Console.WriteLine(counter);
                        child.Genes = child.GetRandomGenes();
                        child.CalculateFitness();
                        break;
                    }

                    //Console.WriteLine("firstChild:      {0}", firstChild.GetReadableGenes());
                    //Console.WriteLine("secondChild:     {0}", secondChild.GetReadableGenes());


                    List <int> positionProfile = new List <int>(new int[firstParent.Genes.Count]);
                    double     prob;
                    for (int i = 0; i < firstParent.Genes.Count; i++)
                    {
                        prob = Random.NextDouble();
                        if (prob < secondParent.Fitness / (firstParent.Fitness + secondParent.Fitness))
                        {
                            positionProfile[i] = 1;
                        }
                    }

                    for (int i = 0; i < positionProfile.Count; i++)
                    {
                        if (positionProfile[i] == 1)
                        {
                            firstChild.Genes[i] = firstParent.Genes[i];
                        }
                        else
                        {
                            secondChild.Genes[i] = secondParent.Genes[i];
                        }
                    }

                    //Console.WriteLine("positionProfile: {0}", string.Join(" ", positionProfile));
                    //Console.WriteLine("firstParent:     {0}", firstParent.GetReadableGenes());
                    //Console.WriteLine("secondParent:    {0}", secondParent.GetReadableGenes());
                    //Console.WriteLine("firstChild:      {0}", firstChild.GetReadableGenes());
                    //Console.WriteLine("secondChild:     {0}", secondChild.GetReadableGenes());

                    for (int i = 0; i < firstChild.Genes.Count; i++)
                    {
                        if (firstChild.Genes[i] == -1)
                        {
                            firstChild.Genes[i] = NextUnrepeatedElem(firstChild.Genes, secondParent.Genes);
                        }
                        else if (secondChild.Genes[i] == -1)
                        {
                            secondChild.Genes[i] = NextUnrepeatedElem(secondChild.Genes, firstParent.Genes);
                        }
                    }

                    //Console.WriteLine("firstChild:      {0}", firstChild.GetReadableGenes());
                    //Console.WriteLine("secondChild:     {0}\n", secondChild.GetReadableGenes());

                    firstChild.CalculateFitness();
                    secondChild.CalculateFitness();

                    if (firstChild.Fitness > secondChild.Fitness)
                    {
                        child = secondChild;
                    }
                    else
                    {
                        child = firstChild;
                    }

                    isFeasible = child.Schedule.IsOverallFeasible() && child.Fitness <= (firstParent.Fitness + secondParent.Fitness) / 2;

                    //if (isFeasible)
                    //{
                    //    Console.WriteLine("positionProfile: {0}", string.Join(" ", positionProfile));
                    //    Console.WriteLine("firstParent:     {0}", firstParent.GetReadableGenes());
                    //    Console.WriteLine("secondParent:    {0}", secondParent.GetReadableGenes());
                    //    Console.WriteLine("firstChild:      {0}", firstChild.GetReadableGenes());
                    //    Console.WriteLine("secondChild:     {0}", secondChild.GetReadableGenes());
                    //    Console.WriteLine("child.Fitness:   {0}\n", child.Fitness);
                    //    Console.WriteLine("if child Feasible {0}\n", isFeasible);
                    //    Console.WriteLine(counter);
                    //}
                }

                //Console.WriteLine(counter);
            }
            return(child);
        }