public IPoblacion Mutar(IPoblacion poblacionCruzada)
        {
            var probabilidad = _generador.Next(0, 100);

            if (probabilidad  >= _parametrosMutacion.ProbabilidadMutarPoblacion)
            {
                var individuo = poblacionCruzada.ObtenerIndividuo();
                this.MutarIndividuo(individuo);
            }

            return poblacionCruzada;
        }
示例#2
0
        private void AnalizarPoblacion(IPoblacion poblacionResultante)
        {
            analisis.Analizar(poblacionResultante);
            context.Send(new SendOrPostCallback((s) =>
            {
                this.txtMejor.Text = analisis.MejorFitnessGlobal.ToString();
                this.txtPeor.Text = analisis.PeorFitnessGlobal.ToString();

                this.txtMejorReinas.Text = analisis.MejorReinasGlobal.ToString();
                this.txtPeorReinas.Text = analisis.PeorReinasGlobal.ToString();

                this.txtGeneracion.Text = poblacionResultante.NumeroGeneracion.ToString();

                var reinasMejor = analisis.MejorIndividuoGlobal.Cromosoma.Genes;
                for (int i = 0; i < 8; i++)
                {
                    for (int j = 0; j < 8; j++)
                    {
                        var controlReina = tlpTableroMejor.GetControlFromPosition(i, j);

                        controlReina.BackColor = Color.White; ;
                        controlReina.Text = string.Empty ;
                    }
                }

                foreach (GenReina genReina in reinasMejor)
                {
                    var reina = genReina.Valor as Reina;
                    var controlReina = tlpTableroMejor.GetControlFromPosition(reina.Posicion.X, reina.Posicion.Y);

                    if (controlReina.BackColor == Color.White)
                    {
                        controlReina.BackColor = Color.Red;
                    }
                    else
                    {
                        controlReina.BackColor = Color.Orange;
                    }
                }

                var row = dgvEstadisticas.Rows.Add();
                dgvEstadisticas.Rows[row].Cells["NumeroGeneracion"].Value = poblacionResultante.NumeroGeneracion;
                dgvEstadisticas.Rows[row].Cells["FitnessGlobalMaximo"].Value = analisis.MejorFitnessGlobal;
                dgvEstadisticas.Rows[row].Cells["FitnessGlobalMinimo"].Value = analisis.PeorFitnessGlobal;
                dgvEstadisticas.Rows[row].Cells["FitnessLocalMaximo"].Value = analisis.MejorFitnessVuelta;
                dgvEstadisticas.Rows[row].Cells["FitnessLocalMinimo"].Value = analisis.PeorFitnessVuelta;
                dgvEstadisticas.Rows[row].Cells["PorcentajeGlobalExito"].Value = ((analisis.MejorFitnessGlobal * 100) / (decimal)nudUmbralCorte.Value);
                dgvEstadisticas.Rows[row].Cells["PorcentajeLocalExito"].Value = ((analisis.MejorFitnessVuelta * 100) / (decimal)nudUmbralCorte.Value);

            }), null);
        }
        public IPoblacion Seleccionar(IPoblacion poblacionInicial)
        {
            var poblacionSeleccionada = new Poblacion.Poblacion(poblacionInicial.NumeroGeneracion, new List<IIndividuo>(poblacionInicial.PoblacionActual.Count));
            poblacionSeleccionada.CantidadIndividuos = poblacionInicial.CantidadIndividuos;

            var mejores = poblacionInicial.PoblacionActual.OrderByDescending(p => _parametrosSeleccionPorTorneo.FuncionFitness.Evaluar(p)).Take(_parametrosSeleccionPorTorneo.CantidadIndividuosASeleccionar).ToList();

            foreach (var mejor in mejores)
            {
                poblacionSeleccionada.PoblacionActual.Add(mejor);
            }

            return poblacionSeleccionada;
        }
示例#4
0
 public AlgoritmoGenetico(IPoblacion poblacionInicial,
     IOperadorSeleccion _operadorSeleccion,
     IOperadorCruzamiento _operadorCruzamiento,
     IOperadorMutacion _operadorMutacion,
     IOperadorCorte _operadorCorte,
     IteracionCanceladaEventHandler IteracionCancelada)
 {
     this._poblacion = poblacionInicial;
     this._operadorSeleccion = _operadorSeleccion;
     this._operadorCruzamiento = _operadorCruzamiento;
     this._operadorMutacion = _operadorMutacion;
     this._operadorCorte = _operadorCorte;
     IteracionCancelada += AlgoritmoGenetico_IteracionCancelada;
 }
        public bool CortarEjecucion(IPoblacion poblacionMutada)
        {
            bool cortar = poblacionMutada.NumeroGeneracion >= _parametrosCorte.LimiteIteraciones;

            for (int indiceIndividuo = 0; !cortar && indiceIndividuo < poblacionMutada.PoblacionActual.Count; indiceIndividuo++)
            {
                var individuo = poblacionMutada.PoblacionActual[indiceIndividuo];

                var valorFitness = _parametrosCorte.FuncionFitness.Evaluar(individuo);

                cortar = valorFitness >= _parametrosCorte.UmbralCorte;
            }

            return cortar;
        }
        public IPoblacion Cruzar(IPoblacion poblacionSeleccionada)
        {
            var individuos = new List<IIndividuo>(poblacionSeleccionada.PoblacionActual.Count);
            var poblacionFinal = new Poblacion.Poblacion(poblacionSeleccionada.NumeroGeneracion, individuos);
            poblacionFinal.CantidadIndividuos = poblacionSeleccionada.CantidadIndividuos;

            for (int cantidadIndividuos = 0; cantidadIndividuos < poblacionSeleccionada.CantidadIndividuos; cantidadIndividuos+=2)
            {
                var individuo1 = poblacionSeleccionada.ObtenerIndividuo();
                var individuo2 = poblacionSeleccionada.ObtenerIndividuo();

                Tuple<IIndividuo, IIndividuo> hijos = this.CruzarIndividuos(individuo1, individuo2);

                poblacionFinal.PoblacionActual.Add(hijos.Item1);
                poblacionFinal.PoblacionActual.Add(hijos.Item2);
            }

            return poblacionFinal;
        }
        public void TestInitialize()
        {
            this._numeroGeneracion = 0;

            this._operadorSeleccion = MockRepository.GenerateMock<IOperadorSeleccion>();
            this._operadorCruzamiento = MockRepository.GenerateMock<IOperadorCruzamiento>();
            this._operadorMutacion = MockRepository.GenerateMock<IOperadorMutacion>();
            this._operadorCorte = MockRepository.GenerateMock<IOperadorCorte>();
            this._individuos = new List<IIndividuo>();
            this._poblacionInicial = MockRepository.GenerateMock<IPoblacion>();
            this._poblacionInicial.Expect(e => e.NumeroGeneracion).Repeat.Any().Return(_numeroGeneracion);
            this._poblacionInicial.Expect(e => e.PoblacionActual).Return(this._individuos).Repeat.Any();

            this._algoritmoGenetico = new AlgoritmoGenetico(_poblacionInicial,
                _operadorSeleccion,
                _operadorCruzamiento,
                _operadorMutacion,
                _operadorCorte);
        }
        public void Analizar(IPoblacion poblacion)
        {
            this.MejorIndividuoVuelta = null;
            this.PeorIndividuoVuelta = null;
            this.MejorFitnessVuelta = Int32.MinValue;
            this.PeorFitnessVuelta = Int32.MinValue;

            foreach (IIndividuo individuo in poblacion.PoblacionActual)
            {
                var fitness = this._parametrosAnalisisPoblacion.Funcion.Evaluar(individuo);

                // Mayores
                if (MejorIndividuoGlobal == null || fitness > MejorFitnessGlobal)
                {
                    this.MejorIndividuoGlobal = individuo;
                    this.MejorFitnessGlobal = fitness;
                    this.MejorReinasGlobal = this._parametrosAnalisisPoblacion.FuncionReinas.Evaluar(individuo); ;
                }
                if (MejorIndividuoVuelta == null || fitness > MejorFitnessVuelta)
                {
                    this.MejorIndividuoVuelta = individuo;
                    this.MejorFitnessVuelta = fitness;
                    this.MejorReinasGlobal = this._parametrosAnalisisPoblacion.FuncionReinas.Evaluar(individuo); ;
                }

                // Menores
                if (PeorIndividuoGlobal == null || fitness < PeorFitnessGlobal)
                {
                    this.PeorIndividuoGlobal = individuo;
                    this.PeorFitnessGlobal = fitness;
                    this.PeorReinasGlobal = this._parametrosAnalisisPoblacion.FuncionReinas.Evaluar(individuo); ;
                }
                if (PeorIndividuoVuelta == null || fitness < PeorFitnessVuelta)
                {
                    this.PeorIndividuoVuelta = individuo;
                    this.PeorFitnessVuelta = fitness;
                    this.PeorReinasGlobal = this._parametrosAnalisisPoblacion.FuncionReinas.Evaluar(individuo); ;
                }

            }
        }
示例#9
0
        public IPoblacion Ejecutar(IParametros parametros)
        {
            do
            {
                // Una nueva generación se procesa:
                this._poblacion.NumeroGeneracion++;

                this._poblacion = this._operadorSeleccion.Seleccionar(this._poblacion);
                this._poblacion = this._operadorCruzamiento.Cruzar(this._poblacion);
                this._poblacion = this._operadorMutacion.Mutar(this._poblacion);

                // Lanzo el evento si alguien lo está escuchando:
                if (IteracionTerminada != null)
                    IteracionTerminada(this, new PoblacionEventArgs(_poblacion));

                // Esperar para la siguiente vuelta
                Thread.Sleep(parametros.IntervaloPorVuelta);

            } while (!_terminar && !this._operadorCorte.CortarEjecucion(this._poblacion));

            return this._poblacion;
        }
        private void CargarPoblacionInicial()
        {
            var genes1 = Array.CreateInstance(typeof(IGen), 3);
            var genBasico1A = MockRepository.GenerateMock<IGen>();
            var genBasico1B = MockRepository.GenerateMock<IGen>();
            var genBasico1C = MockRepository.GenerateMock<IGen>();
            genes1.SetValue(genBasico1A, 0);
            genes1.SetValue(genBasico1A, 1);
            genes1.SetValue(genBasico1A, 2);

            this._individuo1h = MockRepository.GenerateMock<IIndividuo>();
            this._individuo1h.Expect(e => e.Cromosoma).Return(new Cromosoma(Array.CreateInstance(typeof(IGen), 3))).Repeat.Any();
            this._individuo1 = MockRepository.GenerateMock<IIndividuo>();
            this._individuo1.Expect(e => e.Cromosoma).Return(new Cromosoma(genes1)).Repeat.Any();
            this._individuo1.Expect(e => e.GenerarDescendencia(_individuo1)).Return(_individuo1h);

            var genes2 = Array.CreateInstance(typeof(IGen), 3);
            var genBasico2A = MockRepository.GenerateMock<IGen>();
            var genBasico2B = MockRepository.GenerateMock<IGen>();
            var genBasico2C = MockRepository.GenerateMock<IGen>();
            genes2.SetValue(genBasico2A, 0);
            genes2.SetValue(genBasico2A, 1);
            genes2.SetValue(genBasico2A, 2);
            this._individuo2h = MockRepository.GenerateMock<IIndividuo>();
            this._individuo2h.Expect(e => e.Cromosoma).Return(new Cromosoma(Array.CreateInstance(typeof(IGen), 3))).Repeat.Any();
            this._individuo2 = MockRepository.GenerateMock<IIndividuo>();
            this._individuo2.Expect(e => e.Cromosoma).Return(new Cromosoma(genes2)).Repeat.Any();
            this._individuo2.Expect(e => e.GenerarDescendencia(_individuo2)).Return(_individuo2h);

            var genes3 = Array.CreateInstance(typeof(IGen), 3);
            var genBasico3A = MockRepository.GenerateMock<IGen>();
            var genBasico3B = MockRepository.GenerateMock<IGen>();
            var genBasico3C = MockRepository.GenerateMock<IGen>();
            genes3.SetValue(genBasico3A, 0);
            genes3.SetValue(genBasico3A, 1);
            genes3.SetValue(genBasico3A, 2);
            this._individuo3h = MockRepository.GenerateMock<IIndividuo>();
            this._individuo3h.Expect(e => e.Cromosoma).Return(new Cromosoma(Array.CreateInstance(typeof(IGen), 3))).Repeat.Any();
            this._individuo3 = MockRepository.GenerateMock<IIndividuo>();
            this._individuo3.Expect(e => e.Cromosoma).Return(new Cromosoma(genes3)).Repeat.Any();
            this._individuo3.Expect(e => e.GenerarDescendencia(_individuo3)).Return(_individuo3h);

            var genes4 = Array.CreateInstance(typeof(IGen), 3);
            var genBasico4A = MockRepository.GenerateMock<IGen>();
            var genBasico4B = MockRepository.GenerateMock<IGen>();
            var genBasico4C = MockRepository.GenerateMock<IGen>();
            genes4.SetValue(genBasico1A, 0);
            genes4.SetValue(genBasico1A, 1);
            genes4.SetValue(genBasico1A, 2);
            this._individuo4h = MockRepository.GenerateMock<IIndividuo>();
            this._individuo4h.Expect(e => e.Cromosoma).Return(new Cromosoma(Array.CreateInstance(typeof(IGen), 3))).Repeat.Any();
            this._individuo4 = MockRepository.GenerateMock<IIndividuo>();
            this._individuo4.Expect(e => e.Cromosoma).Return(new Cromosoma(genes4)).Repeat.Any();
            this._individuo4.Expect(e => e.GenerarDescendencia(_individuo4)).Return(_individuo4h);

            this._individuos = new List<IIndividuo>() { this._individuo1, this._individuo2, this._individuo3, this._individuo4 };
            this._poblacion = new Poblacion(_individuos);
            this._poblacion.CantidadIndividuos = 4;
        }
示例#11
0
 public PoblacionEventArgs(IPoblacion poblacion)
 {
     this.PoblacionResultante = poblacion;
 }