public Population(
            int length,
            int crossOverPoint,
            int initialPop,
            int popLimit,
            float mutationFreq,
            float deathParam,
            float reproductionParam,
            float[] weights)
        {
            this.m_length                 = length;
            this.m_crossoverPoint         = crossOverPoint;
            this.m_initialPopulationCount = initialPop;
            this.m_populationLimit        = popLimit;
            this.m_mutationFreq           = mutationFreq;
            this.m_deathParam             = deathParam;
            this.m_reproduceParam         = reproductionParam;

            this.m_genomes = new List <BasketListGenome>();

            for (int i = 0; i < this.m_initialPopulationCount; i++)
            {
                BasketListGenome newGenome = new BasketListGenome(this.m_length);
                newGenome.CrossoverPoint = this.m_crossoverPoint;
                newGenome.FitnessFunction();
                newGenome.SetWeights(weights);

                this.m_genomes.Add(newGenome);
            }
        }
        private void DoCrossover(List <BasketListGenome> genes) // OREN
        {
            List <BasketListGenome> NewGeneration = new List <BasketListGenome>();
            int originalCount = genes.Count;
            int TotalScore    = 0;

            // Sum total scores
            foreach (BasketListGenome CurrElement in genes)
            {
                TotalScore += (int)CurrElement.CurrentFitness;
            }

            // Take 50% of the genes and use
            while (NewGeneration.Count != (originalCount / 2))
            {
                Random r        = new Random();
                int    rInt     = r.Next(0, TotalScore + 1);
                int    SumScore = 0;

                // Sum curr score
                foreach (BasketListGenome CurrElement in genes)
                {
                    SumScore += (int)CurrElement.CurrentFitness;

                    // Check if we can add it.
                    if ((SumScore >= rInt) && (!NewGeneration.Contains(CurrElement)))
                    {
                        NewGeneration.Add(CurrElement);
                    }

                    break;
                }
            }

            // Crossover couples
            while (NewGeneration.Count != originalCount)
            {
                // Search first
                foreach (BasketListGenome CurrElement1 in genes)
                {
                    // Check if we already have it.
                    if (!NewGeneration.Contains(CurrElement1))
                    {
                        // Search second
                        foreach (BasketListGenome CurrElement2 in genes)
                        {
                            // Check if we already have or if it is the same as the first.
                            if ((!NewGeneration.Contains(CurrElement2)) && (!CurrElement1.Equals(CurrElement2)))
                            {
                                // Crossover in order to create new genome.
                                BasketListGenome NewGenome = (BasketListGenome)CurrElement1.Crossover(CurrElement2);
                                NewGeneration.Add(NewGenome);
                            }
                        }
                    }
                }
            }
        }
Exemple #3
0
 private void SaveBestBasket()
 {
     foreach (BasketListGenome basketGenome in this.m_genomes)
     {
         if (IdialBaskets == null)
         {
             IdialBaskets = basketGenome;
         }
         else if (basketGenome != null)
         {
             if (IdialBaskets.CurrentFitness < basketGenome.CurrentFitness)
             {
                 IdialBaskets = basketGenome;
             }
         }
     }
 }
Exemple #4
0
        private BasketListGenome MutateBasket(BasketListGenome BasketToMutate)
        {
            BasketListGenome  MutatedBasket = BasketToMutate;
            ConnectionMongoDB db            = ConnectionMongoDB.GetInstance();

            if (this.GetRandomNumber(0, 1) <= this.m_mutationFreq)
            {
                for (int i = 0; i < MutatedBasket.BasketObject.basketItems.Count; i++)
                {
                    if (this.GetRandomNumber(0, 1) <= this.m_mutationFreq)
                    {
                        // TODO: DB access
                        MutatedBasket.BasketObject.basketItems[i] = db.GetRandomProduct();
                        //MutatedBasket.BasketObject.basketItems[i] = Program.GetRandomProduct();
                    }
                }
            }

            return(MutatedBasket);
        }
Exemple #5
0
        public BasketListGenome BasketCrossover(BasketListGenome other)
        {
            long MinLength = Math.Min(this.m_basket.basketItems.Count, other.m_basket.basketItems.Count);

            int CrossPoint = Seed.Next((int)MinLength);

            BasketListGenome MinGen = this;
            BasketListGenome MaxGen = other;

            if (other.m_basket.basketItems.Count == MinLength)
            {
                MinGen = other;
                MaxGen = this;
            }

            for (int i = 0; i < CrossPoint; i++)
            {
                MinGen.m_basket.basketItems[i] = MaxGen.m_basket.basketItems[i];
            }


            return(MinGen);
        }
Exemple #6
0
        private List <BasketListGenome> DoCrossover(List <BasketListGenome> genes) // OREN
        {
            List <BasketListGenome> NewGeneration = new List <BasketListGenome>();
            int originalCount = genes.Count;
            int TotalScore    = 0;

            // Sum total scores
            foreach (BasketListGenome CurrElement in genes)
            {
                TotalScore += (int)CurrElement.CurrentFitness;
            }

            int GoCrossOver = (originalCount / 2);

            if (GoCrossOver % 2 != 0)
            {
                GoCrossOver--;
            }

            int GoAsIs = originalCount - GoCrossOver;

            // Take 50% of the genes and use
            // TODO: Need to check this loop
            while (NewGeneration.Count != GoAsIs)
            {
                Random r        = new Random();
                int    rInt     = r.Next(0, TotalScore + 1);
                int    SumScore = 0;

                // Sum curr score
                foreach (BasketListGenome CurrElement in genes)
                {
                    SumScore += (int)CurrElement.CurrentFitness;

                    // Check if we can add it.
                    if ((SumScore >= rInt) && (!NewGeneration.Contains(CurrElement)))
                    {
                        NewGeneration.Add(CurrElement);

                        break;
                    }
                }
            }

            foreach (BasketListGenome CurrToRemove in NewGeneration)
            {
                genes.Remove(CurrToRemove);
            }



            for (int i = 0; i < genes.Count - 1; i += 2)
            {
                BasketListGenome CurrElement1 = genes[i];
                BasketListGenome CurrElement2 = genes[i + 1];

                BasketListGenome NewBasketGenome1 = CurrElement1.BasketCrossover(CurrElement2);
                BasketListGenome NewBasketGenome2 = CurrElement1.BasketCrossover(CurrElement2);

                NewGeneration.Add(NewBasketGenome1);
                NewGeneration.Add(NewBasketGenome2);
            }


            return(NewGeneration);
        }