示例#1
0
        public void CreateNewGeneration()
        {
            mGenerationCount++;
            mCurrentGeneration.Sort();
            mNewGeneration = new List <IndividualDNA>();
            mReproducers   = new List <IndividualDNA>();

            //Select individuals with best fitness for reproduction
            for (int i = 0; i < NumberOfReproducers; i++)
            {
                mReproducers.Add(mCurrentGeneration[i]);
            }
            mReproducers.Sort();

            //Create Mother and Father sets of individuals
            List <IndividualDNA> Mothers = new List <IndividualDNA>();
            List <IndividualDNA> Fathers = new List <IndividualDNA>();

            CreateNewGeneration1(Mothers, Fathers);

            //Check for new Bestfit individual
            mCurrentGeneration.Sort();
            if (Math.Abs(mCurrentGeneration[0].Fitness) < Math.Abs(mBestFitness.Fitness))
            {
                mBestFitness = mCurrentGeneration[0];
            }

            SaveReproducers();
            Save();
        }
示例#2
0
        public string ToEquation(IndividualDNA individual)
        {
            string equation = String.Empty;

            int    exponent = 0;
            string op       = String.Empty;

            foreach (double gene in individual.Genes)
            {
                if (gene >= 0)
                {
                    op = " + ";
                }
                else
                {
                    op = "";
                }

                if (equation.Equals(String.Empty))
                {
                    op = "";
                }

                equation = equation + op + gene.ToString() + "x^" + exponent.ToString() + "  ";
                exponent++;
            }

            return(equation);
        }
示例#3
0
        private void CreateNewGeneration1(List <IndividualDNA> Mothers, List <IndividualDNA> Fathers)
        {
            Mothers = mReproducers;
            Fathers = mReproducers;

            IndividualDNA child = new IndividualDNA();

            //Add the top n to the new generation
            mNewGeneration.Add(mCurrentGeneration[0]);
            mNewGeneration.Add(mCurrentGeneration[1]);

            //Perform cartesian product of Mothers and Fathers for reproduction
            foreach (IndividualDNA mother in Mothers)
            {
                foreach (IndividualDNA father in Fathers)
                {
                    if (!father.Equals(mother))
                    {
                        child            = Reproduce(mother, father);
                        child.Generation = GenerationCount;
                        mNewGeneration.Add(child);
                    }
                }
            }

            //if mNewGeneration is too small, fill it up with the
            //best from mCurrentGeneration
            int currentcount = 0;

            while (mNewGeneration.Count < mPopulationSize)
            {
                mNewGeneration.Add(mCurrentGeneration[currentcount % 50]);
                currentcount++;
            }

            //Calculate fitness of mNewGeneration
            EvaluateIndividuals(mNewGeneration);
            mNewGeneration.Sort();

            //Make mNewGeneration the mCurrentGeneration
            mCurrentGeneration.Clear();
            for (int i = 0; i < mPopulationSize; i++)
            {
                if (!mCurrentGeneration.Contains(mNewGeneration[i]))
                {
                    mCurrentGeneration.Add(mNewGeneration[i]);
                }
            }
            currentcount = 0;
            while (mCurrentGeneration.Count < mPopulationSize)
            {
                mCurrentGeneration.Add(mNewGeneration[currentcount % 50]);
                currentcount++;
            }
        }
示例#4
0
        public IndividualDNA Crossover1(IndividualDNA _mother, IndividualDNA _father)
        {
            IndividualDNA child = new IndividualDNA(_mother.Terms);

            child = _mother;

            for (int i = 0; i < mCrossoverPoint; i++)
            {
                child.Genes[i] = _father.Genes[i];
            }

            return(child);
        }
示例#5
0
        public int CompareTo(object obj)
        {
            int result = 1;

            if (obj != null && obj is IndividualDNA)
            {
                IndividualDNA w = obj as IndividualDNA;

                double comparex = Math.Abs(this.Fitness);
                double comparey = Math.Abs(w.Fitness);
                result = comparex.CompareTo(comparey);
            }
            return(result);
        }
示例#6
0
        static public int Compare(IndividualDNA x, IndividualDNA y)
        {
            int result = 1;

            double comparex = 0;
            double comparey = 0;

            if (x != null && y != null)
            {
                comparex = Math.Abs(x.Fitness);
                comparey = Math.Abs(y.Fitness);
                result   = comparex.CompareTo(comparey);
            }
            return(result);
        }
示例#7
0
        public IndividualDNA RandomMutation(IndividualDNA _individual)
        {
            IndividualDNA MutatedDNA = new IndividualDNA();

            MutatedDNA = _individual;

            Random rand  = new Random(DateTime.Now.Millisecond);
            Random rand2 = new Random(Convert.ToInt32(10000 * rand.Next(-100, 100)));

            if (rand2.NextDouble() <= mChanceOfMutation)
            {
                MutatedDNA.Genes[rand2.Next(Terms / 2, Terms - 1)] = rand2.Next(-100, 100);
            }

            return(MutatedDNA);
        }
示例#8
0
        public void CreateInitialRandomGeneration()
        {
            IndividualDNA individual;

            for (int i = 0; i < mPopulationSize; i++)
            {
                individual = new IndividualDNA(mTerms, MinMaxFunctionValueY(FunctionValues));
                individual.CreateInitialRandomGeneration(mCurrentGeneration.Count);
                mCurrentGeneration.Add(individual);
            }
            EvaluateIndividuals(mCurrentGeneration);
            mCurrentGeneration.Sort();

            mBestFitness = mCurrentGeneration[0];
            Save();
        }
示例#9
0
        public IndividualDNA Crossover3(IndividualDNA _mother, IndividualDNA _father)
        {
            IndividualDNA child = new IndividualDNA(_mother.Terms);

            for (int i = 0; i < Terms; i++)
            {
                if (i % 2 == 0)
                {
                    child.Genes[i] = _mother.Genes[i];
                }
                else
                {
                    child.Genes[i] = _father.Genes[i];
                }
            }

            return(RandomMutation(child));
        }
示例#10
0
        public void CreateInitialRandomGeneration()
        {
            IndividualDNA individual;

            for (int i = 0; i < mPopulationSize; i++)
            {
                individual = new IndividualDNA(mTerms, MinMaxFunctionValueY(FunctionValues));
                individual.CreateInitialRandomGeneration(mCurrentGeneration.Count);
                mCurrentGeneration.Add(individual);
            }
            EvaluateIndividuals(mCurrentGeneration);
            mCurrentGeneration.Sort();

            mBestFitness = mCurrentGeneration[0];
            Save();
        }
示例#11
0
        public IndividualDNA Crossover1(IndividualDNA _mother, IndividualDNA _father)
        {
            IndividualDNA child = new IndividualDNA(_mother.Terms);
            child = _mother;

            for (int i = 0; i < mCrossoverPoint; i++)
            {
                child.Genes[i] = _father.Genes[i];
            }

            return child;
        }
示例#12
0
        public IndividualDNA Crossover3(IndividualDNA _mother, IndividualDNA _father)
        {
            IndividualDNA child = new IndividualDNA(_mother.Terms);

            for (int i = 0; i < Terms; i++)
            {
                if (i % 2 == 0)
                {
                    child.Genes[i] = _mother.Genes[i];
                }
                else
                {
                    child.Genes[i] = _father.Genes[i];
                }
            }

            return RandomMutation(child);
        }
示例#13
0
 public IndividualDNA Reproduce(IndividualDNA _mother, IndividualDNA _father)
 {
     return(Crossover3(_mother, _father));
 }
示例#14
0
        public IndividualDNA RandomMutation(IndividualDNA _individual)
        {
            IndividualDNA MutatedDNA = new IndividualDNA();
            MutatedDNA = _individual;

            Random rand = new Random(DateTime.Now.Millisecond);
            Random rand2 = new Random(Convert.ToInt32(10000 * rand.Next(-100, 100)));

            if (rand2.NextDouble() <= mChanceOfMutation)
            {
                MutatedDNA.Genes[rand2.Next(Terms/2, Terms - 1)] = rand2.Next(-100, 100);
            }

            return MutatedDNA;
        }
示例#15
0
 public IndividualDNA Reproduce(IndividualDNA _mother, IndividualDNA _father)
 {
     return Crossover3(_mother, _father);
 }
示例#16
0
        public void CreateNewGeneration()
        {
            mGenerationCount++;
            mCurrentGeneration.Sort();
            mNewGeneration = new List<IndividualDNA>();
            mReproducers = new List<IndividualDNA>();

            //Select individuals with best fitness for reproduction
            for (int i = 0; i < NumberOfReproducers; i++)
            {
                mReproducers.Add(mCurrentGeneration[i]);
            }
            mReproducers.Sort();

            //Create Mother and Father sets of individuals
            List<IndividualDNA> Mothers = new List<IndividualDNA>();
            List<IndividualDNA> Fathers = new List<IndividualDNA>();

            CreateNewGeneration1(Mothers, Fathers);

            //Check for new Bestfit individual
            mCurrentGeneration.Sort();
            if (Math.Abs(mCurrentGeneration[0].Fitness) < Math.Abs(mBestFitness.Fitness)) mBestFitness = mCurrentGeneration[0];

            SaveReproducers();
            Save();
        }
示例#17
0
 public IndividualDNAEnum(IndividualDNA[] list)
 {
     _DNA = list;
 }
示例#18
0
        public static int Compare(IndividualDNA x, IndividualDNA y)
        {
            int result = 1;

            double comparex = 0;
            double comparey = 0;

            if (x != null && y != null)
            {
                comparex = Math.Abs(x.Fitness);
                comparey = Math.Abs(y.Fitness);
                result = comparex.CompareTo(comparey);
            }
            return result;
        }
示例#19
0
        private void CreateNewGeneration1(List<IndividualDNA> Mothers, List<IndividualDNA> Fathers)
        {
            Mothers = mReproducers;
            Fathers = mReproducers;

            IndividualDNA child = new IndividualDNA();

            //Add the top n to the new generation
            mNewGeneration.Add(mCurrentGeneration[0]);
            mNewGeneration.Add(mCurrentGeneration[1]);

            //Perform cartesian product of Mothers and Fathers for reproduction
            foreach (IndividualDNA mother in Mothers)
            {
                foreach (IndividualDNA father in Fathers)
                {
                    if (!father.Equals(mother))
                    {
                        child = Reproduce(mother, father);
                        child.Generation = GenerationCount;
                        mNewGeneration.Add(child);
                    }
                }
            }

            //if mNewGeneration is too small, fill it up with the
            //best from mCurrentGeneration
            int currentcount = 0;
            while (mNewGeneration.Count < mPopulationSize)
            {
                mNewGeneration.Add(mCurrentGeneration[currentcount%50]);
                currentcount++;
            }

            //Calculate fitness of mNewGeneration
            EvaluateIndividuals(mNewGeneration);
            mNewGeneration.Sort();

            //Make mNewGeneration the mCurrentGeneration
            mCurrentGeneration.Clear();
            for (int i = 0; i < mPopulationSize; i++)
            {
                if (!mCurrentGeneration.Contains(mNewGeneration[i]))
                {
                    mCurrentGeneration.Add(mNewGeneration[i]);
                }
            }
            currentcount = 0;
            while (mCurrentGeneration.Count < mPopulationSize)
            {
                mCurrentGeneration.Add(mNewGeneration[currentcount%50]);
                currentcount++;
            }
        }
示例#20
0
        public string ToEquation(IndividualDNA individual)
        {
            string equation = String.Empty;

            int exponent = 0;
            string op = String.Empty;
            foreach (double gene in individual.Genes)
            {
                if (gene >= 0)
                {
                    op = " + ";
                }
                else
                {
                    op = "";
                }

                if (equation.Equals(String.Empty)) op = "";

                equation = equation + op + gene.ToString() + "x^" + exponent.ToString() + "  ";
                exponent++;
            }

            return equation;
        }