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); } } } } } }
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; } } } }
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); }
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); }
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); }