예제 #1
0
        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) { }
        }
예제 #2
0
        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;
        }