static void Main()
        {
            double   minValorX   = -3;
            double   maxValorX   = 2;
            Ecuacion objEcuacion = new Ecuacion();

            objEcuacion.Rango(minValorX, maxValorX);

            Poblacion objPoblacion    = new Poblacion();
            int       TamanoIndividuo = 30;
            int       TotalIndividuos = 50;
            int       TotalCiclos     = 150000;
            double    MejorIndiv      = objPoblacion.Proceso(objEcuacion, TamanoIndividuo, TotalIndividuos, TotalCiclos);

            //Muestra el individuo mejor adaptado
            Console.WriteLine(MejorIndiv);
            Console.ReadKey();
        }
Пример #2
0
        public double Proceso(Ecuacion objEcuacion, int TamanoIndividuo, int numIndividuos, int numCiclos)
        {
            //Crea la población con individuos generados al azar
            for (int cont = 1; cont <= numIndividuos; cont++)
            {
                Individuos.Add(BooleanoAzar(TamanoIndividuo));
            }

            //Proceso de algoritmo genético
            for (int ciclo = 1; ciclo <= numCiclos; ciclo++)
            {
                //Toma dos individuos al azar
                int indivA = azar.Next(Individuos.Count);
                int indivB;
                do
                {
                    indivB = azar.Next(Individuos.Count);
                } while (indivA == indivB); //Asegura que sean dos individuos distintos

                //Usa el operador cruce
                int    posAzar = azar.Next(Individuos[indivA].Length);
                string parteA  = Individuos[indivA].Substring(0, posAzar);
                string parteB  = Individuos[indivB].Substring(posAzar);
                string HijoA   = parteA + parteB;

                //Además muta el hijo
                char[] numeros = HijoA.ToCharArray();
                int    pos     = azar.Next(HijoA.Length);
                if (numeros[pos] == '0')
                {
                    numeros[pos] = '1';
                }
                else
                {
                    numeros[pos] = '0';
                }
                HijoA = new string(numeros);

                //Evalúa la adaptación de los dos individuos
                double valorIndivA = objEcuacion.ValorY(Individuos[indivA]);
                double valorIndivB = objEcuacion.ValorY(Individuos[indivB]);
                double valorHijoA  = objEcuacion.ValorY(HijoA);

                //Si los hijos son mejores que los padres, entonces los reemplaza
                if (valorHijoA < valorIndivA)
                {
                    Individuos[indivA] = HijoA;
                }
                if (valorHijoA < valorIndivB)
                {
                    Individuos[indivB] = HijoA;
                }
            }

            //Después del ciclo, busca el mejor individuo adaptado de la población
            int    individuoMejor = 0;
            double MenorValorY    = double.MaxValue;

            for (int cont = 0; cont < Individuos.Count; cont++)
            {
                double valorIndiv = objEcuacion.ValorY(Individuos[cont]);
                if (valorIndiv < MenorValorY)
                {
                    individuoMejor = cont;
                    MenorValorY    = valorIndiv;
                }
            }
            return(objEcuacion.ValorX(Individuos[individuoMejor]));
        }