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