예제 #1
0
        public void CanGenerateGenoType()
        {
            var randomGenerator = new UniformRandomGenerator();

            var possibleFunctions = new List <IGenoTypeNode>
            {
                new SquareRoot(),
                new Multiplication(),
                new Plus(),
                new Minus()
            };

            var possibleTerminals = new List <IGenoTypeNode>
            {
                new FeatureTerminal("a"),
                new FeatureTerminal("b"),
                new FeatureTerminal("c"),
                new FeatureTerminal("d")
            };

            var eaGeneExpressionParameters = new EaGeneExpressionParameters(4, possibleFunctions, possibleTerminals);
            var parameterTerminalFactory   = new ParameterTerminalFactory(eaGeneExpressionParameters, randomGenerator);
            var genoTypeFactory            = new GenoTypeFactory(eaGeneExpressionParameters, randomGenerator, parameterTerminalFactory);

            var genoType = genoTypeFactory.GetGenoType();

            Assert.NotNull(genoType);
        }
예제 #2
0
 public UniformRandomSequenceGenerator(uint dimensionality, UniformRandomGenerator rng) : this(NQuantLibcPINVOKE.new_UniformRandomSequenceGenerator(dimensionality, UniformRandomGenerator.getCPtr(rng)), true)
 {
     if (NQuantLibcPINVOKE.SWIGPendingException.Pending)
     {
         throw NQuantLibcPINVOKE.SWIGPendingException.Retrieve();
     }
 }
 public GaussianRandomGenerator(UniformRandomGenerator rng) : this(NQuantLibcPINVOKE.new_GaussianRandomGenerator(UniformRandomGenerator.getCPtr(rng)), true)
 {
     if (NQuantLibcPINVOKE.SWIGPendingException.Pending)
     {
         throw NQuantLibcPINVOKE.SWIGPendingException.Retrieve();
     }
 }
예제 #4
0
        public void todo(IDataSet dataSet)
        {
            var randomGenerator = new UniformRandomGenerator();

            var possibleFunctions = new List <IGenoTypeNode>
            {
                new Multiplication(),
                new Plus(),
                new Minus()
            };

            var possibleTerminals = new List <IGenoTypeNode>();

            foreach (var mappedColumn in dataSet.MappedColumns)
            {
                possibleTerminals.Add(new FeatureTerminal(mappedColumn.Key));
            }

            var eaGeneExpressionParameters = new EaGeneExpressionParameters(10, possibleFunctions, possibleTerminals);
            var parameterTerminalFactory   = new ParameterTerminalFactory(eaGeneExpressionParameters, randomGenerator);
            var genoTypeFactory            = new GenoTypeFactory(eaGeneExpressionParameters, randomGenerator, parameterTerminalFactory);

            var genoType = genoTypeFactory.GetGenoType();

            var phenoTypeTree = new PhenoTypeTree(genoType.GenoTypeNodes);

            var stringExpresssion = phenoTypeTree.ToString();

            // TODO make mapped columns more sophisticated
            var mappedColumnsUsedInExpression = new Dictionary <string, int>();

            foreach (var mappedColumn in dataSet.MappedColumns)
            {
                if (stringExpresssion.Contains(mappedColumn.Key))
                {
                    mappedColumnsUsedInExpression.Add(mappedColumn.Key, mappedColumn.Value);
                }
            }

            var expression = new Expression(stringExpresssion);

            var numberOfRows = dataSet.MappedData.GetLength(0);

            var sum = 0.0;

            for (var row = 0; row < numberOfRows; row++)
            {
                foreach (var usedMappedColumn in mappedColumnsUsedInExpression)
                {
                    expression.Parameters[usedMappedColumn.Key.Replace("]", "").Replace("[", "")] = dataSet.MappedData[row, usedMappedColumn.Value];
                }

                if (!expression.HasErrors())
                {
                    var test = (double)expression.Evaluate();
                    sum = sum + test;
                }
            }
        }
예제 #5
0
        void Initialize(int regionSize, int gaussianMin, int gaussianMax, bool loading = false)
        {
            CreatureList = creatureList.AsReadOnly();
            EntityList   = entityList.AsReadOnly();

            CreateRegions(regionSize, loading);

            Random         = new UniformRandomGenerator();
            GaussianRandom = new NormalRandomGenerator(gaussianMin, gaussianMax, Random);
        }
예제 #6
0
        void Initialize(int regionSize, UniformRandomGenerator random, NormalRandomGenerator gaussianRandom, bool loading = false)
        {
            CreatureList = creatureList.AsReadOnly();
            EntityList   = entityList.AsReadOnly();

            CreateRegions(regionSize, loading);

            Random         = random;
            GaussianRandom = gaussianRandom;
        }
예제 #7
0
        public IGenoTypeNode GetTerminalNode()
        {
            if (UniformRandomGenerator.GetContinousRandomNumber(0, 1.0) <
                EaGeneExpressionParameters.ParameterProbability)
            {
                return(ParameterTerminalFactory.GetParameterTerminal());
            }

            return(EaGeneExpressionParameters.PossibleTerminals[
                       UniformRandomGenerator.GetIntegerRandomNumber(0, NumberOfPossibleTerminals)]);
        }
 public RandomNumbersGenerator()
 {
     //random = new Random();
     arrivalTimeUniformRandom                 = new UniformRandomGenerator();
     regularDrugsServiceTimeNormalRandom      = new NormalRandomGenerator(600, 1300);
     regularDrugsServiceTimeNormalRandom.Mean = 900;
     hardDrugsServiceTimeNormalRandom         = new NormalRandomGenerator(900, 1830);
     hardDrugsServiceTimeNormalRandom.Mean    = 1400;
     typeOfRecipeNormalRandom                 = new NormalRandomGenerator(0, 10);
     typeOfRecipeNormalRandom.Mean            = 3;
 }
예제 #9
0
        public IGenoTypeNode GetParameterTerminal()
        {
            if (UniformRandomGenerator.GetContinousRandomNumber(0, 1.0) <=
                EaGeneExpressionParameters.ConstantProbability)
            {
                return(new ParameterTerminal(EaGeneExpressionParameters.PossibleConstants[UniformRandomGenerator.GetIntegerRandomNumber(0, PossibleConstantsCountMinusOne)].Value));
            }

            return(EaGeneExpressionParameters.ParameterTypeInteger
                ? new ParameterTerminal(UniformRandomGenerator.GetIntegerRandomNumber((int)EaGeneExpressionParameters.ParameterMinimum, (int)EaGeneExpressionParameters.ParameterMaximum))
                : new ParameterTerminal(UniformRandomGenerator.GetContinousRandomNumber(EaGeneExpressionParameters.ParameterMinimum, EaGeneExpressionParameters.ParameterMaximum)));
        }
예제 #10
0
        public void PerformCrossover(ref IGenoType genoTypeLeft, ref IGenoType genoTypeRight)
        {
            if ((new PhenoTypeTree(genoTypeLeft.GenoTypeNodes)).ToString().Equals((new PhenoTypeTree(genoTypeRight.GenoTypeNodes)).ToString()))
            {
                return;
            }

//            var left1 = new PhenoTypeTree(genoTypeLeft.GenoTypeNodes).ToString();
//            var right1 = new PhenoTypeTree(genoTypeRight.GenoTypeNodes).ToString();

            if (!(UniformRandomGenerator.GetContinousRandomNumber(0, 1.0) <= EaGeneExpressionParameters.CrossoverProbability))
            {
                return;
            }

            if (UniformRandomGenerator.GetContinousRandomNumber(0, 1.0) < 0.5)
            {
                var numberOfNodes      = PhenoTypeTree.GetNumberOfNodes(genoTypeLeft.GenoTypeNodes);
                var crossOverPosition1 = UniformRandomGenerator.GetIntegerRandomNumber(0, numberOfNodes - 1);

                if (UniformRandomGenerator.GetContinousRandomNumber(0, 1.0) < 0.1)
                {
                    for (var index = crossOverPosition1; index < genoTypeLeft.GenoTypeNodes.Count; index++)
                    {
                        Swap(genoTypeLeft.GenoTypeNodes, genoTypeRight.GenoTypeNodes, index);
                    }
                }
                else
                {
                    for (var index = 0; index <= crossOverPosition1; index++)
                    {
                        Swap(genoTypeLeft.GenoTypeNodes, genoTypeRight.GenoTypeNodes, index);
                    }
                }
            }
            else
            {
                var crossOverPosition1 = UniformRandomGenerator.GetIntegerRandomNumber(1, genoTypeLeft.GenoTypeNodes.Count - 2);
                var crossOverPosition2 = UniformRandomGenerator.GetIntegerRandomNumber(crossOverPosition1, genoTypeLeft.GenoTypeNodes.Count - 2);

                for (var index = crossOverPosition1; index < crossOverPosition2; index++)
                {
                    Swap(genoTypeLeft.GenoTypeNodes, genoTypeRight.GenoTypeNodes, index);
                }
            }

//            var left2 = new PhenoTypeTree(genoTypeLeft.GenoTypeNodes).ToString();
//            var right2 = new PhenoTypeTree(genoTypeRight.GenoTypeNodes).ToString();
        }
예제 #11
0
        public void PerformMutation(ref IGenoType genoType)
        {
            if (!(UniformRandomGenerator.GetContinousRandomNumber(0, 1.0) <= EaGeneExpressionParameters.MutationProbability))
            {
                return;
            }

            var randomNumber = UniformRandomGenerator.GetContinousRandomNumber(0, 1.0);

            if (randomNumber <= 0.3)
            {
                genoType = GenoTypeFactory.GetGenoType();
            }
            else
            {
                //var index = UniformRandomGenerator.GetIntegerRandomNumber(0, genoType.GenoTypeNodes.Count - 1);
                var numberOfNodes = PhenoTypeTree.GetNumberOfNodes(genoType.GenoTypeNodes);
                var index         = UniformRandomGenerator.GetIntegerRandomNumber(0, numberOfNodes - 1);

                if (randomNumber <= 0.6)
                {
                    var node = genoType.GenoTypeNodes[index];
                    genoType.GenoTypeNodes.RemoveAt(index);
                    index = UniformRandomGenerator.GetIntegerRandomNumber(0, genoType.GenoTypeNodes.Count - 1);
                    genoType.GenoTypeNodes.Insert(index, node);
                }
                else
                {
                    if (genoType.GenoTypeNodes[index].GetType() == typeof(ParameterTerminal))
                    {
                        ((ParameterTerminal)genoType.GenoTypeNodes[index]).Value =
                            ((ParameterTerminal)genoType.GenoTypeNodes[index]).Value +
                            UniformRandomGenerator.GetContinousRandomNumber(-3.0, 3.0);
                    }
                    else
                    {
                        if (index < EaGeneExpressionParameters.MaximumNumberOfHeadNodes)
                        {
                            genoType.GenoTypeNodes[index] = GenoTypeFactory.GetFunctionOrTerminalNode();
                        }
                        else
                        {
                            genoType.GenoTypeNodes[index] = GenoTypeFactory.GetTerminalNode();
                        }
                    }
                }
            }
        }
예제 #12
0
        public void CanTranslateTest3()
        {
            var randomGenerator = new UniformRandomGenerator();

            var possibleFunctions = new List <IGenoTypeNode>
            {
                new SquareRoot(),
                new Multiplication(),
                new Division(),
                new Plus(),
                new Minus(),
                new Minimum(),
                new Maximum(),
                new Not(),
                new Exp(),
                new Sinus(),
                new Cosinus()
            };

            var possibleTerminals = new List <IGenoTypeNode>
            {
                new FeatureTerminal("a"),
                new FeatureTerminal("b"),
                new FeatureTerminal("c"),
                new FeatureTerminal("d")
            };

            var eaGeneExpressionParameters = new EaGeneExpressionParameters(20, possibleFunctions, possibleTerminals);
            var parameterTerminalFactory   = new ParameterTerminalFactory(eaGeneExpressionParameters, randomGenerator);
            var genoTypeFactory            = new GenoTypeFactory(eaGeneExpressionParameters, randomGenerator, parameterTerminalFactory);

            eaGeneExpressionParameters.ParameterTypeInteger = true;
            eaGeneExpressionParameters.ConstantProbability  = 0;

            var genoType      = genoTypeFactory.GetGenoType();
            var phenoTypeTree = new GeneExpression.PhenoTypeTree(genoType.GenoTypeNodes);

            var expresssion = phenoTypeTree.ToString();
        }
예제 #13
0
 public IGenoTypeNode GetFunctionNode()
 {
     return(EaGeneExpressionParameters.PossibleFunctions[
                UniformRandomGenerator.GetIntegerRandomNumber(0, NumberOfPossibleFunctions)]);
 }
예제 #14
0
 public World(int regionSize, UniformRandomGenerator random, NormalRandomGenerator gaussianRandom)
     : base("World")
 {
     SpawnPointList = new List <SpawnPoint>();
     Initialize(regionSize, random, gaussianRandom);
 }
예제 #15
0
 public FoodWorld(int regionSize, UniformRandomGenerator random, NormalRandomGenerator gaussianRandom)
     : base(regionSize, random, gaussianRandom)
 {
     FoodToClone = new Food();
 }
예제 #16
0
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(UniformRandomGenerator obj) {
   return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
 }
예제 #17
0
 public GaussianRandomGenerator(UniformRandomGenerator rng) : this(NQuantLibcPINVOKE.new_GaussianRandomGenerator(UniformRandomGenerator.getCPtr(rng)), true) {
   if (NQuantLibcPINVOKE.SWIGPendingException.Pending) throw NQuantLibcPINVOKE.SWIGPendingException.Retrieve();
 }
예제 #18
0
        public void CanCrossover()
        {
            var listLeft = new List <IGenoTypeNode>
            {
                new SquareRoot(),
                new Multiplication(),
                new Plus(),
                new Minus(),
                new FeatureTerminal("a"),
                new FeatureTerminal("b"),
                new FeatureTerminal("c"),
                new FeatureTerminal("d")
            };

            var listRight = new List <IGenoTypeNode>
            {
                new Sinus(),
                new Multiplication(),
                new Division(),
                new Minus(),
                new FeatureTerminal("a1"),
                new FeatureTerminal("b1"),
                new FeatureTerminal("c1"),
                new FeatureTerminal("d1")
            };

            var possibleFunctions = new List <IGenoTypeNode>
            {
                new SquareRoot(),
                new Multiplication(),
                new Plus(),
                new Minus()
            };

            var possibleTerminals = new List <IGenoTypeNode>
            {
                new FeatureTerminal("a"),
                new FeatureTerminal("b"),
                new FeatureTerminal("c"),
                new FeatureTerminal("d")
            };

            var eaGeneExpressionParameters =
                new EaGeneExpressionParameters(4, possibleFunctions, possibleTerminals)
            {
                CrossoverProbability = 1.0
            };

            IGenoType left = new GeneExpression.GenoType {
                GenoTypeNodes = listLeft
            };
            IGenoType right = new GeneExpression.GenoType {
                GenoTypeNodes = listRight
            };
            var randomGenerator        = new UniformRandomGenerator();
            var genotypeCrossoverator1 = new GenoTypeCrossoveratorBasic1(randomGenerator, eaGeneExpressionParameters);

            var phenoTypeTreeLeft1  = new GeneExpression.PhenoTypeTree(left.GenoTypeNodes);
            var phenoTypeTreeRight1 = new GeneExpression.PhenoTypeTree(right.GenoTypeNodes);

            genotypeCrossoverator1.PerformCrossover(ref left, ref right);

            var phenoTypeTreeLeft2  = new GeneExpression.PhenoTypeTree(left.GenoTypeNodes);
            var phenoTypeTreeRight2 = new GeneExpression.PhenoTypeTree(right.GenoTypeNodes);

            Assert.NotEqual(phenoTypeTreeLeft1, phenoTypeTreeLeft2);
            Assert.NotEqual(phenoTypeTreeRight1, phenoTypeTreeRight2);
        }
예제 #19
0
파일: Program.cs 프로젝트: csetzkorn/GeMoea
        static void Main()
        {
            var randomGenerator            = new UniformRandomGenerator();
            var dataSet                    = GetDataSet();
            var target                     = GetTarget();
            var eaGeneExpressionParameters = GetEaGeneExpressionParameters(dataSet);
            var parameterTerminalFactory   = new ParameterTerminalFactory(eaGeneExpressionParameters, randomGenerator);
            var genoTypeFactory            = new GenoTypeFactory(eaGeneExpressionParameters, randomGenerator, parameterTerminalFactory);
            var mutator                    = new GenoTypeMutatorBasic1(randomGenerator, eaGeneExpressionParameters, genoTypeFactory);
            var crossOverator              = new GenoTypeCrossoveratorBasic1(randomGenerator, eaGeneExpressionParameters);

            var populationP            = GetFirstPopulation(eaGeneExpressionParameters, parameterTerminalFactory, genoTypeFactory);
            var listOfObjectiveValuesP = new List <IObjectiveValues>();

            for (var c = 0; c < populationP.Count; c++)
            {
                var objectiveValues = GetObjectiveValues(target, dataSet, populationP[c]);
                listOfObjectiveValuesP.Add(objectiveValues);
            }
            listOfObjectiveValuesP = Nsga2TournamentSelector.PerformSelection(eaGeneExpressionParameters.TournamentSize, listOfObjectiveValuesP, randomGenerator);

            var tempPopulation = new List <Individual>();

            foreach (var objectiveValues in listOfObjectiveValuesP)
            {
                var indy = populationP.FirstOrDefault(x => x.Guid == objectiveValues.IndividualGuid);
                tempPopulation.Add((Individual)indy.Clone());
            }
            populationP = tempPopulation;

            for (var generation = 0; generation < eaGeneExpressionParameters.NumberOfGeneration; generation++)
            {
                var populationQ = new List <Individual>();
                foreach (var individual in populationP)
                {
                    populationQ.Add((Individual)individual.Clone());
                }

                populationQ = PerformCrossOver(populationQ, randomGenerator, crossOverator);

                foreach (var individual in populationQ)
                {
                    mutator.PerformMutation(ref individual.GenoType);
                }

                var combinedPopulation            = new List <Individual>();
                var combinedlistOfObjectiveValues = new List <IObjectiveValues>();
                foreach (var individual in populationP)
                {
                    var clone = (Individual)individual.Clone();
                    combinedPopulation.Add(clone);
                    var objectiveValues = GetObjectiveValues(target, dataSet, clone);
                    combinedlistOfObjectiveValues.Add(objectiveValues);
                }
                foreach (var individual in populationQ)
                {
                    var clone = (Individual)individual.Clone();
                    combinedPopulation.Add(clone);
                    var objectiveValues = GetObjectiveValues(target, dataSet, clone);
                    combinedlistOfObjectiveValues.Add(objectiveValues);
                }

                combinedlistOfObjectiveValues = Nsga2Ranker.Rank(combinedlistOfObjectiveValues);
                combinedlistOfObjectiveValues = Nsga2Crowder.CalculateCrowdingDistances(combinedlistOfObjectiveValues);

                combinedlistOfObjectiveValues = combinedlistOfObjectiveValues.OrderBy(i => i.Rank).ThenByDescending(i => i.CrowdingDistance).ToList();

                tempPopulation = new List <Individual>();
                var     counter          = 0;
                var     smallestMse      = decimal.MaxValue;
                decimal largestMse       = 0;
                var     smallestPosition = -1;
                foreach (var objectiveValues in combinedlistOfObjectiveValues)
                {
                    var indy = combinedPopulation.FirstOrDefault(x => x.Guid == objectiveValues.IndividualGuid);
                    tempPopulation.Add((Individual)indy.Clone());

                    var ovs = GetObjectiveValues(target, dataSet, combinedPopulation.FirstOrDefault(x => x.Guid == objectiveValues.IndividualGuid));
                    if (ovs.Values[0] < smallestMse)
                    {
                        smallestMse      = ovs.Values[0];
                        smallestPosition = counter;
                    }

                    if (ovs.Values[0] > largestMse)
                    {
                        largestMse = ovs.Values[0];
                    }

                    counter++;
                    if (counter == eaGeneExpressionParameters.PopulationSize)
                    {
                        break;
                    }
                }
                populationP = tempPopulation;

                Console.WriteLine(generation + " " + smallestMse + " " + largestMse);
                Console.WriteLine(new PhenoTypeTree(populationP[smallestPosition].GenoType.GenoTypeNodes));
            }
        }
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(UniformRandomGenerator obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }
예제 #21
0
 public IGenoTypeNode GetFunctionOrTerminalNode()
 {
     return(UniformRandomGenerator.GetContinousRandomNumber(0, 1.0) <
            EaGeneExpressionParameters.FunctionProbability ? GetFunctionNode() : GetTerminalNode());
 }
예제 #22
0
        public override void Work(Microsoft.Xna.Framework.GameTime gameTime)
        {
            base.Work(gameTime);

            int foodCount = 0;

            foreach (Entity entity in EntityList)
            {
                if (entity.EntityName == "Food")
                {
                    foodCount += 1;
                }
            }

            if (foodCount < MinimumFood)
            {
                var rand = new UniformRandomGenerator();

                for (int i = foodCount; i < MinimumFood; i++)
                {
                    Food food = new Food();
                    AddEntity(food);

                    food.Position = new EntityPosition(rand.Next(Width), rand.Next(Height));
                }
            }

            int creatureCount = 0;

            foreach (Entity entity in EntityList)
            {
                if (entity.EntityName == "Creature")
                {
                    creatureCount += 1;
                }
            }

            //if (creatureCount < MinimumCreatures)
            //{
            //    for (int i = creatureCount; i < MinimumCreatures; i++)
            //    {
            //        var creature1 = CreatureList[Pseudo.Random.Next(0, CreatureList.Count)];

            //        Creature creature2;
            //        do
            //        {
            //            creature2 = CreatureList[Pseudo.Random.Next(0, CreatureList.Count)];
            //        } while (creature1 == creature2);

            //        double posX = Pseudo.Random.Next(Width);
            //        double posY = Pseudo.Random.Next(Height);

            //        var child = creature1.CreateOffspring(creature2, posX, posY);
            //        child.Rotation = Math.PI * 2 * Pseudo.Random.NextDouble();

            //        child.Energy.SetToMax();

            //        AddEntity(child);
            //    }
            //}

            if (runTime)
            {
                newGenerationTick += 1;
            }

            if (newGenerationTick >= newGenerationPeriod)
            {
                newGenerationTick = 0;
                spawnNewGeneration();
            }
        }
예제 #23
0
 public UniformRandomSequenceGenerator(uint dimensionality, UniformRandomGenerator rng) : this(NQuantLibcPINVOKE.new_UniformRandomSequenceGenerator(dimensionality, UniformRandomGenerator.getCPtr(rng)), true) {
   if (NQuantLibcPINVOKE.SWIGPendingException.Pending) throw NQuantLibcPINVOKE.SWIGPendingException.Retrieve();
 }
예제 #24
0
 public FitnessWorld(int regionSize, UniformRandomGenerator random, NormalRandomGenerator gaussianRandom)
     : base(regionSize, random, gaussianRandom)
 {
 }