public Specimen[] Crossover(Specimen[] population)
        {
            var newPopulation = new List <Specimen>();
            var stack         = new Stack <Specimen>(population);

            while (stack.Count > 0)
            {
                var parent1      = stack.Pop();
                var parent2      = stack.Pop();
                var rand         = new Random();
                var randomNumber = rand.NextDouble();
                if (randomNumber <= Config.CrossProb)
                {
//                    var crossover = new CrossoverCX(parent1, parent2, _data);
                    var crossover = new CrossoverPmx(parent1, parent2, _data);

                    var(child1, child2) = crossover.GetChildren();
                    newPopulation.Add(child1);
                    newPopulation.Add(child2);
                }
                else
                {
                    newPopulation.Add(parent1);
                    newPopulation.Add(parent2);
                }
            }

            return(newPopulation.ToArray());
        }
예제 #2
0
        private void btnExecutar_Click(object sender, EventArgs e)
        {
            buttonCriarPop.Enabled = false;

            int torneio = int.Parse(labelTamannhoTorneio.Text);

            evolucoes += int.Parse(labelEvolucao.Text);

            positivoInfinito = double.PositiveInfinity;

            Configuracao.numeroCompetidores = torneio;

            Configuracao.Tipo tipo = Configuracao.Tipo.FIXO;

            if (rbDHM_ILC.Checked)
            {
                tipo = Configuracao.Tipo.DHM_ILC;
            }
            else if (rbILM_DHC.Checked)
            {
                tipo = Configuracao.Tipo.ILM_DHC;
            }

            Configuracao.tipo = tipo;

            AlgoritmoGenetico algoritmoGenetico = new AlgoritmoGenetico();

            algoritmoGenetico.aptidao      = new AptidaoDistancia(mapa);
            algoritmoGenetico.selecao      = new SelecaoTorneio(Configuracao.numeroCompetidores, Configuracao.aleatorio);
            algoritmoGenetico.mutacao      = mutacao = new MutacaoDoisGenes(Configuracao.taxaMutacao, Configuracao.aleatorio);
            algoritmoGenetico.solucao      = new SolucaoLimiteGeracao(evolucoes);
            algoritmoGenetico.crossover    = crossover = new CrossoverPmx(Configuracao.aleatorio, Configuracao.taxaCrossover);
            algoritmoGenetico.substituicao = new SubstituicaoTotal();
            algoritmoGenetico.observadores.Add(this);
            algoritmoGenetico.execute(populacao);

            g.Clear(Color.White);
            desenharLinhas(populacao, Color.Blue);
            desenharPontos();

            botaoExportarMelhorIndiv.Enabled = true;
        }