public Individuo Ejecuta() { Random rand = new Random(); int indA = 0, indB = 0; Cromosoma recombinado; Individuo nuevoIndividuo; // Repetir 'pasos' veces: for (int i = 0; i < pasos; i++) { // Seleccionar dos individuos aleatoriamente. indA=rand.Next(poblacion.NumIndividuos); do { indB = rand.Next(poblacion.NumIndividuos); } while (indA == indB); // Tomar sus cromosomas y recombinarlos usando void Recombinar(cr1,cr2) recombinado = Recombinar(poblacion[indA].Cromosoma, poblacion[indB].Cromosoma); // Mutar el resultado con la probabilidad indicada. recombinado.Mutar(probMutacion); // Crear un individuo con el cromosoma resultante que se insertará en la población reemplazando al peor individuo nuevoIndividuo = new Individuo(recombinado, problema); poblacion.Reemplaza(nuevoIndividuo); } // Devolver el mejor individuo de la población después de la terminación del bucle return poblacion.MejorIndividuo(); }
/// <summary> /// Crea un array de Individuos de tamano tP. /// </summary> /// <param name="tP">Numero de individuos de la publiacion</param> /// <param name="tI">Longitud del cromosoma de los individuos</param> /// <param name="pr">Metodo a usar para calcular el fitness de cada individuo</param> public Poblacion(int tP, int tI, IProblema pr) { individuos = new Individuo[tP]; for (int i = 0; i < individuos.Length; i++) { individuos[i] = new Individuo(tI, pr); } }
/// <summary> /// Busca el peor individuo de la poblacion y lo reemplaza por el individuo /// pasado como parametro. /// </summary> /// <param name="individuo">Individuo reemplazante</param> public void Reemplaza(Individuo individuo) { int menorFitness = individuo.Cromosoma.Longitud; for (int i = 0; i < individuos.Length; i++) { if (individuos[i].Fitness < menorFitness) { menorFitness = i; } } if (individuos[menorFitness].Fitness < individuo.Fitness) { individuos[menorFitness] = individuo; } }