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;
        }
        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._individuo1 = MockRepository.GenerateMock<IIndividuo>();
            this._individuo1.Expect(e => e.Cromosoma).Return(new Cromosoma(genes1)).Repeat.Any();

            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._individuo2 = MockRepository.GenerateMock<IIndividuo>();
            this._individuo2.Expect(e => e.Cromosoma).Return(new Cromosoma(genes2)).Repeat.Any();

            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._individuo3 = MockRepository.GenerateMock<IIndividuo>();
            this._individuo3.Expect(e => e.Cromosoma).Return(new Cromosoma(genes3)).Repeat.Any();

            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._individuo4 = MockRepository.GenerateMock<IIndividuo>();
            this._individuo4.Expect(e => e.Cromosoma).Return(new Cromosoma(genes4)).Repeat.Any();

            this._individuos = new List<IIndividuo>() { this._individuo1, this._individuo2, this._individuo3, this._individuo4 };
            this._poblacion = new Poblacion(_individuos);
        }
        private void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            IPoblacion poblacionInicial = null;
            poblacionInicial = new Poblacion(this.GenerarPoblacionInicial());
            poblacionInicial.CantidadIndividuos = (int)nudCantidadPoblacion.Value;

            IFuncionFitness funcionFitness = null;
            if (rdbFitnessCasillerosAmenazados.Checked)
                funcionFitness = new SumatoriaAmenazasFitness();
            if (rdbFitnessCasillerosLibres.Checked)
                funcionFitness = new CasillerosSinAmenzasFitness();
            if (rdbFitnessReinasVivas.Checked)
                funcionFitness = new TableroFitness();

            IOperadorSeleccion operadorSeleccion = null;
            var parametrosOperadorSeleccion = new ParametrosSeleccion()
            {
                CantidadIndividuosASeleccionar = (int)nudCantidadSeleccionada.Value,
                FuncionFitness = funcionFitness
            };
            if (rdbSeleccionTorneo.Checked)
                operadorSeleccion = new OperadorSeleccionPorTorneo(parametrosOperadorSeleccion);
            if (rdbSeleccionRanking.Checked)
                operadorSeleccion = new OperadorSeleccionRanking(parametrosOperadorSeleccion);

            IOperadorCruzamiento operadorCruzamiento = null;
            var parametrosOperadorCruzamiento = new ParametrosCruzamiento()
            {
                Mascara = txtMascara.Text,
            };
            if (rdbCruzarAzar.Checked)
                operadorCruzamiento = new OperadorCruzamientoAzar(parametrosOperadorCruzamiento);
            if (rdbMascara.Checked)
                operadorCruzamiento = new OperadorCruzamientoMascara(parametrosOperadorCruzamiento);

            IOperadorMutacion operadorMutacion = null;
            var parametrosMutacion = new ParametrosMutacion()
            {
                ProbabilidadMutarPoblacion = (int)nudProbabilidadMutacion.Value,
                IndiceMutacion = (int)nudIndiceMutacion.Value,
            };
            operadorMutacion = new OperadorMutacionConstante(parametrosMutacion);

            IOperadorCorte operadorCorte = null;
            var parametrosCorte = new ParametrosCorte()
            {
                //OJO! Hago que corte siempre por cantidad de reinas, ya que no se puede mejorar mas...
            //              FuncionFitness = funcionFitness,
                FuncionFitness = new TableroFitness(),
                UmbralCorte = (int)nudUmbralCorte.Value,
                LimiteIteraciones = (int)nudLimiteVueltas.Value
            };
            operadorCorte = new OperadorCorteSimple(parametrosCorte);

            this.analisis = new OperadorAnalisisPoblacion(new ParametrosAnalisisPoblacion() { Funcion = funcionFitness, FuncionReinas = new TableroFitness()});

            IAlgoritmoGenetico algoritmo = new AlgoritmoGenetico(poblacionInicial,
                operadorSeleccion,
                operadorCruzamiento,
                operadorMutacion,
                operadorCorte,
                this.IteracionCancelada);

            IParametros parametros = new Parametros()
            {
                IntervaloPorVuelta = (int)nudIntervaloVuelta.Value,
            };

            algoritmo.IteracionTerminada += algoritmo_IteracionTerminada;

            var poblacionFinal = algoritmo.Ejecutar(parametros);
            this.AnalizarPoblacion(poblacionFinal);
        }