private void GenerarArchivo(FitnessPopulationAnalizer fitnessPopulationAnalizer) { string pathGeneraciones = AppDomain.CurrentDomain.BaseDirectory + "generaciones.txt"; string pathFitness = AppDomain.CurrentDomain.BaseDirectory + "fitness.txt"; if (File.Exists(pathGeneraciones)) { File.Delete(pathGeneraciones); } if (File.Exists(pathFitness)) { File.Delete(pathFitness); } try { StreamWriter sw = new StreamWriter(pathGeneraciones); sw.WriteLine("Generación"); for (int i = 0; i < fitnessPopulationAnalizer.LstCromosomas.Count; i++) { sw.WriteLine(i + 1); } sw.Close(); sw = new StreamWriter(pathFitness); sw.WriteLine("Fitness"); for (int i = fitnessPopulationAnalizer.LstCromosomas.Count - 1; i >= 0; i--) { sw.WriteLine(fitnessPopulationAnalizer.LstCromosomas[i].Fitness); } sw.Close(); } catch (Exception) { } }
private void GeneraSolucion(int numGeneraciones, int tamTablero, int poblacionInicial) { bool success = false; Random random = new Random(); List <Cromosoma> lstIndividuos = GeneraPoblacion(poblacionInicial, tamTablero, random); FitnessPopulationAnalizer fitnessAnalizer = new FitnessPopulationAnalizer(lstIndividuos); this.Cursor = Cursors.WaitCursor; int generaciones = 0; List <int> lstGeneraciones = new List <int>(); List <float> lstFitness = new List <float>(); while (generaciones < numGeneraciones && fitnessAnalizer.LstElite.Count.Equals(0)) { generaciones++; fitnessAnalizer.GenerarFitnessPoblacion(); lstFitness.Add(fitnessAnalizer.fitnessPoblacion); lstGeneraciones.Add(generaciones); // de manera aleatoria elegimos 5 individuos de la población actual y obtenemos los mejores 2 de esa selección. List <Cromosoma> lstAux = fitnessAnalizer.ObtenerIndividuosAleatorios(5, random); List <Cromosoma> lstMejores = fitnessAnalizer.ObtenerLosMejores(2, lstAux); // los 2 mejores obtenidos los cruzamos y obtenemos dos hijos resultantes. List <Cromosoma> lstHijos = fitnessAnalizer.CrossOver(lstMejores[0], lstMejores[1], random); // mutamos a los hijos si no son la solución. foreach (Cromosoma cromosoma in lstHijos) { if (fitnessAnalizer.ObtenerFitnessCromosoma(cromosoma) != 0) { fitnessAnalizer.Mutar(cromosoma, cromosoma.Genes.Count - 1, random); } } // estos 2 hijos sustituirán a los dos peores de la población actual. List <Cromosoma> lstPeores = fitnessAnalizer.ObtenerLosPeores(2); fitnessAnalizer.SustituirPoblacion(lstPeores, lstHijos); } ActualizaInformacion(lstIndividuos); GenerarArchivo(fitnessAnalizer); this.Cursor = Cursors.Default; }