// Generacional public static (ValoresFunciones valores, float fitness) AlgoritmoGeneticoGeneracional( int tamañoPoblacion, int dimension, int iteraciones, int maxEvaluaciones, FuncionFitness fitness, FuncionSeleccion funcionSeleccion, FuncionCruzamiento funcionCruzamiento, double probCruzamiento, FuncionMutacion funcionMutacion, double probMutacion) { List <ValoresFunciones> poblacion; List <ValoresFunciones> nuevaPoblacion; List <ValoresFunciones> padres, hijos; List <float> fitnessSoluciones; double probabilidad; int evaluacion = 0; poblacion = generarPoblacionAleatoria(tamañoPoblacion, dimension); fitnessSoluciones = fitnessDePoblacion(poblacion, fitness); evaluacion += tamañoPoblacion; for (int i = 0; i < iteraciones && evaluacion < maxEvaluaciones; i++) { nuevaPoblacion = new List <ValoresFunciones>(); while (nuevaPoblacion.Count < tamañoPoblacion) { // Seleccion padres = funcionSeleccion(poblacion, fitnessSoluciones); // Cruzamiento probabilidad = rand.NextDouble(); if (probabilidad > probCruzamiento) { continue; } hijos = funcionCruzamiento(padres); // Mutacion hijos = funcionMutacion(hijos, probMutacion); nuevaPoblacion.AddRange(hijos); } poblacion = nuevaPoblacion; fitnessSoluciones = fitnessDePoblacion(poblacion, fitness); evaluacion += tamañoPoblacion; } //Ordena las soluciones por su funcion fitness var indexOrdenadaPorFitness = from f in fitnessSoluciones orderby f select fitnessSoluciones.IndexOf(f); int pos = indexOrdenadaPorFitness.ElementAt(0); return(poblacion[pos], fitnessSoluciones[pos]); }
public static List <float> fitnessDePoblacion(List <ValoresFunciones> poblacion, FuncionFitness funcionFitness) { List <float> fitnessPoblacion = new List <float>(); fitnessPoblacion.Capacity = poblacion.Count; float fitness; for (int i = 0; i < poblacion.Count; i++) { fitness = funcionFitness(poblacion[i]); fitnessPoblacion.Add(fitness); } return(fitnessPoblacion); }