Example #1
0
        private void GlobalIntermediateRecombination(ref ESSolution offspring)
        {
            int index1, index2;

            ESSolution parent1 = null;
            ESSolution parent2 = null;

            offspring = new ESSolution(this, this.variableCount);

            Term sum   = null;
            int  index = 0;

            foreach (var variable in base.context.Variables)
            {
                GenerateTwoIndeces(out index1, out index2);
                parent1 = this.parentPopulation[index1];
                parent2 = this.parentPopulation[index2];

                sum = base.termManager.Add(parent1.currentModel.GetValue(variable.Term),
                                           parent2.currentModel.GetValue(variable.Term));

                base.modelBuilder.TryAssign(variable, DivideByTwo(sum));

                double stdDev1 = parent1.GetStdDev(index);
                double stdDev2 = parent2.GetStdDev(index);
                offspring.SetStdDev(index, (0.5 * (stdDev1 + stdDev2)));

                index++;
            }

            offspring.UpdateModel(base.modelBuilder.ToArithmeticModel());
        }
Example #2
0
        private void MultiStdDevMutation(ref ESSolution offspring)
        {
            SafeDebug.AssertNotNull(offspring, "offspring != null");

            base.modelBuilder = base.context.CreateArithmeticModelBuilder(offspring.currentModel);

            double globalLearningRate = (double)1 / Math.Sqrt((double)2 * (double)base.context.Variables.Count <IArithmeticVariable>());
            double localLearningRate  = (double)1 / Math.Sqrt((double)2 * Math.Sqrt((double)base.context.Variables.Count <IArithmeticVariable>()));
            double overallT           = globalLearningRate * Gaussian(0, 1);
            int    index = 0;

            foreach (var variable in base.context.Variables)
            {
                Term   sum         = null;
                double ni          = overallT + localLearningRate * Gaussian(0, 1);
                double scaleFactor = offspring.GetStdDev(index) * Math.Exp(ni);
                offspring.SetStdDev(index, scaleFactor);
                bool success = TryAddDoubleToTerm(variable.Term, scaleFactor * Gaussian(0, 1), out sum);
                if (success)
                {
                    base.modelBuilder.TryAssign(variable, offspring.currentModel.GetValue(sum));
                }
                index++;
            }

            offspring.UpdateModel(base.modelBuilder.ToArithmeticModel());
        }
Example #3
0
        private void GlobalDiscreteRecombination(ref ESSolution offspring)
        {
            int        index1, index2;
            ESSolution parent1 = null;
            ESSolution parent2 = null;
            int        index   = 0;

            offspring = new ESSolution(this, this.variableCount);

            foreach (var variable in base.context.Variables)
            {
                GenerateTwoIndeces(out index1, out index2);
                parent1 = this.parentPopulation[index1];
                parent2 = this.parentPopulation[index2];

                if (base.random.Next(0, 2) == 0)
                {
                    base.modelBuilder.TryAssign(variable, parent1.currentModel.GetValue(variable.Term));
                    offspring.SetStdDev(index, parent1.GetStdDev(index));
                }
                else
                {
                    base.modelBuilder.TryAssign(variable, parent2.currentModel.GetValue(variable.Term));
                    offspring.SetStdDev(index, parent2.GetStdDev(index));
                }

                index++;
            }

            offspring.UpdateModel(base.modelBuilder.ToArithmeticModel());
        }
Example #4
0
        private void Recombine(ref ESSolution offspring)
        {
            switch (this.recombination)
            {
            case RecombinationStrategy.None:
                break;

            case RecombinationStrategy.Discrete:
                DiscreteRecombination(ref offspring);
                break;

            case RecombinationStrategy.GlobalDiscrete:
                GlobalDiscreteRecombination(ref offspring);
                break;

            case RecombinationStrategy.Intermediate:
                IntermediateRecombination(ref offspring);
                break;

            case RecombinationStrategy.GlobalIntermediate:
                GlobalIntermediateRecombination(ref offspring);
                break;

            default: break;
            }
        }
Example #5
0
        private ESSolution CreateRandomSolution()
        {
            RandomizeInputVariablesWithBounds(-100, 100);
            ESSolution candidate = new ESSolution(this, base.modelBuilder.ToArithmeticModel(), this.variableCount);

            candidate.Initialize();
            return(candidate);
        }
Example #6
0
            public ESSolution MakeDeepCopy()
            {
                IArithmeticModelBuilder mb = solver.context.CreateArithmeticModelBuilder(this.currentModel);
                ESSolution clone           = new ESSolution(
                    this.solver,
                    mb.ToArithmeticModel(),
                    this.stdDeviations,
                    this.fitness);

                mb = null;
                return(clone);
            }
Example #7
0
        private void Mutate(ref ESSolution offspring)
        {
            switch (this.mutation)
            {
            case MutationStrategy.Multi:
                MultiStdDevMutation(ref offspring);
                break;

            case MutationStrategy.Single:
                SingleStdDevMutation(ref offspring);
                break;

            default: break;
            }
        }
Example #8
0
            public int CompareTo(object obj)
            {
                ESSolution s = (ESSolution)obj;

                if (this.fitness > s.fitness)
                {
                    return(1);
                }
                else if (this.fitness < s.fitness)
                {
                    return(-1);
                }
                else
                {
                    return(0);
                }
            }
Example #9
0
        private void SingleStdDevMutation(ref ESSolution offspring)
        {
            SafeDebug.AssertNotNull(offspring, "offspring != null");

            base.modelBuilder = base.context.CreateArithmeticModelBuilder(offspring.currentModel);

            double learningRate = (double)1 / Math.Sqrt((double)base.context.Variables.Count <IArithmeticVariable>());

            double stdDev = offspring.GetStdDev(0) * Math.Exp(learningRate * Gaussian(0, 1));

            offspring.SetStdDev(0, stdDev);
            foreach (var variable in base.context.Variables)
            {
                Term sum     = null;
                bool success = TryAddDoubleToTerm(variable.Term, stdDev * Gaussian(0, 1), out sum);
                if (success)
                {
                    base.modelBuilder.TryAssign(variable, offspring.currentModel.GetValue(sum));
                }
            }

            offspring.UpdateModel(base.modelBuilder.ToArithmeticModel());
        }
Example #10
0
        private void DiscreteRecombination(ref ESSolution offspring)
        {
            int index1, index2;
            int index = 0;

            GenerateTwoIndeces(out index1, out index2);

            ESSolution parent1 = this.parentPopulation[index1];
            ESSolution parent2 = this.parentPopulation[index2];

            offspring = parent1.MakeDeepCopy();

            foreach (var variable in base.context.Variables)
            {
                if (base.random.Next(0, 2) != 0)
                {
                    base.modelBuilder.TryAssign(variable, parent2.currentModel.GetValue(variable.Term));
                    offspring.SetStdDev(index, parent2.GetStdDev(index));
                }
                index++;
            }

            offspring.UpdateModel(base.modelBuilder.ToArithmeticModel());
        }
Example #11
0
        private TryGetModelResult Evolve(out IArithmeticModel model)
        {
            TryGetModelResult result = TryGetModelResult.None;

            //SafeDebugger.Break();

            CreateInitialPopulation();

            EvaluateIntermediatePopulation();

            for (int i = 0; i < this.populationSize; i++)
            {
                this.parentPopulation[i] = this.intermediatePopulation[i].MakeDeepCopy();
            }

            while (!Terminate(out result, out model))
            {
                ClearIntermediatePopulation();

                if (this.populationSize > 1 && this.recombination != RecombinationStrategy.None &&
                    this.parentPopulation.Length > 1)
                {
                    ESSolution offspring = null;

                    for (int i = 0; i < this.offspringPopulationSize; i++)
                    {
                        Recombine(ref offspring);

                        if (offspring != null)
                        {
                            Mutate(ref offspring);

                            this.intermediatePopulation.Add(offspring.MakeDeepCopy());
                            offspring.Dispose();
                            offspring = null;
                        }
                    }
                }
                else
                {
                    ESSolution offspring = null;
                    int        poolIndex = 0;
                    for (int i = 0; i < this.offspringPopulationSize; i++)
                    {
                        if (poolIndex >= this.parentPopulation.Length)
                        {
                            poolIndex = 0;
                        }

                        offspring = this.parentPopulation[poolIndex].MakeDeepCopy();
                        Mutate(ref offspring);
                        this.intermediatePopulation.Add(offspring.MakeDeepCopy());
                        offspring.Dispose();
                        offspring = null;
                        poolIndex++;
                    }
                }

                EvaluateIntermediatePopulation();

                //selection
                if (!this.selectFromOffspringOnly)
                {
                    for (int i = 0; i < this.populationSize; i++)
                    {
                        this.intermediatePopulation.Add(this.parentPopulation[i].MakeDeepCopy());
                    }
                }

                this.intermediatePopulation.Sort();

                for (int i = 0; i < this.populationSize && i < this.intermediatePopulation.Count; i++)
                {
                    this.parentPopulation[i].Dispose();
                    this.parentPopulation[i] = this.intermediatePopulation[i].MakeDeepCopy();
                }
            }

            return(result);
        }