private void BtnExecutar_Click(object sender, EventArgs e)
        {
            count_exec++;

            #region  Desativar os botões enquanto executa

            btnDicas.Enabled        = false;
            btnInformacao.Enabled   = false;
            btnGrafico.Enabled      = false;
            btnDicas.Enabled        = false;
            btnCriarPop.Enabled     = false;
            btnExecutar.Enabled     = false;
            btnSair.Enabled         = false;
            btnConfiguracao.Enabled = false;
            btnLimpar.Enabled       = false;
            btnInserir.Enabled      = false;
            btnImportar.Enabled     = false;
            btnSalvar.Enabled       = false;

            #endregion

            var deuErro = false;

            //Valida se o campo esta nulo
            txtTamPop.Text = txtTamPop.Text.Equals("") ? "1" : txtTamPop.Text;

            //Altera o tamanho da população sem a necessida de pressionar o botão criar pop
            if (popTamAux != int.Parse(txtTamPop.Text))
            {
                ConfigurationGA.tamPopulacao = int.Parse(txtTamPop.Text);
                //Caso a população esteja em 0 ou Nulla é setada como 1
                if (ConfigurationGA.tamPopulacao == 0)
                {
                    ConfigurationGA.tamPopulacao = 1;
                    txtTamPop.Text = "1";
                }
                popTamAux = int.Parse(txtTamPop.Text);
                pop       = new Population();
            }

            #region Configuração do AG // Tratamento de entrada de dados nos campos

            //Configurar AG
            txtTaxaMutacao.Text = txtTaxaMutacao.Text.Equals(" ,") ? "0" : txtTaxaMutacao.Text;
            float taxaMutacao = float.Parse(txtTaxaMutacao.Text);

            txtTaxaCrossover.Text = txtTaxaCrossover.Text.Equals(" ,") ? "0" : txtTaxaCrossover.Text;
            float taxaCrossover = float.Parse(txtTaxaCrossover.Text);

            txtQtdeTorneio.Text = txtQtdeTorneio.Text.Equals("") ? "0" : txtQtdeTorneio.Text;
            int torneio = int.Parse(txtQtdeTorneio.Text);

            txtEvolucao.Text = txtEvolucao.Text.Equals("") ? "1" : txtEvolucao.Text;
            evolucoes       += int.Parse(txtEvolucao.Text);

            ConfigurationGA.taxaCruzamento = taxaCrossover;
            ConfigurationGA.taxaMutacao    = taxaMutacao;
            ConfigurationGA.numCompetidor  = torneio;
            ConfigurationGA.Mutation mutacao = ConfigurationGA.Mutation.NovoInd;

            #endregion


            //Verifica o tipo de mutação selecionado
            if (rbNovoIndividuo.Checked)
            {
                mutacao = ConfigurationGA.Mutation.NovoInd;
            }
            else if (rbPopulacao.Checked)
            {
                mutacao = ConfigurationGA.Mutation.NaPopulacao;
            }
            ConfigurationGA.mutationType = mutacao;

            //Verifica se o elitismo foi checkado
            if (checkElitismoo.Checked)
            {
                ConfigurationGA.elitismo = true;

                txtQtdeelitismoo.Text       = txtQtdeelitismoo.Text.Equals("") ? "0" : txtQtdeelitismoo.Text;
                ConfigurationGA.tamElitismo = int.Parse(txtQtdeelitismoo.Text);
            }
            else
            {
                ConfigurationGA.elitismo = false;
            }

            //Inicia uma instancia do AG (Metodo responsavel por aplicar o ciclo de evolução)
            AlgoritmoGenetico AG = new AlgoritmoGenetico();

            for (i = iTemp; i < evolucoes; i++)
            {
                iTemp++;
                lbEvolucoes.Text = i.ToString();
                lbEvolucoes.Refresh();

                try
                {
                    //Recebe a população evoluida
                    pop = AG.ExecuteGA(pop);
                }
                catch (IndexOutOfRangeException)
                {
                    //Mostra a mensagem de erro apenas uma vez
                    if (deuErro == false)
                    {
                        MessageBox.Show("Favor, adicionar mais que uma cidade", "AG - TSP");
                        deuErro = true;
                    }
                    //Limpa o necessario para recomeçar
                    ForcarLimpeza();
                    break;
                }

                //Pega o individuo com o melhor fitness
                pop.GetBest().CalcFitness();

                //Verifica se o usario optou pelo 2opt
                if (twoOptCheck.Checked)
                {
                    Utils.TwoOpt(pop.GetBest());
                }

                //Ápos o 2opt pega o melhor individuo novamente, pois o 2opt fez uma nova melhoria
                pop.GetBest().CalcFitness();

                //Limpa o grafico da media da população
                zedMedia.GraphPane.CurveList.Clear();
                zedMedia.GraphPane.GraphObjList.Clear();

                //Fazemos o calcula da media do fitness da população e jogamos no grafico
                double mediaPop = pop.GetMediaPop();
                mediaPopulacao.Add(i, mediaPop);

                //Pegamos o fitness do melhor individuo
                double bestFitness = pop.GetBest().GetFitness();

                //Desenha no grafico
                LineItem media = paneMedia.AddCurve("Média", mediaPopulacao, Color.Red, SymbolType.None);

                //Print linhas a cada 6 evolucoes, entra no if apenas quando o individuo da evolução corrente for melhor do que os individuos das evoluções anteriores
                if (bestFitness < bestAux)
                {
                    bestAux = bestFitness;
                    g.Clear(Color.White);
                    PlotLines(pop, Color.Blue);
                    PlotPoints();

                    //Atualiza laber com a distancia do melhor individuo
                    lbMenorDistancia.Text = bestFitness.ToString("0.0");
                    lbMenorDistancia.Refresh();

                    lbMenorDistancia2.Text = bestFitness.ToString("0.0");
                    lbMenorDistancia2.Refresh();
                }

                //Redesenhamos o grafico
                zedMedia.AxisChange();
                zedMedia.Invalidate();
                zedMedia.Refresh();
            }

            #region Ativa os botoes novamente

            btnDicas.Enabled        = true;
            btnInformacao.Enabled   = true;
            btnGrafico.Enabled      = true;
            btnDicas.Enabled        = true;
            btnExecutar.Enabled     = true;
            btnSair.Enabled         = true;
            btnConfiguracao.Enabled = true;
            btnLimpar.Enabled       = true;
            btnInserir.Enabled      = true;
            btnImportar.Enabled     = true;
            btnSalvar.Enabled       = true;

            #endregion
        }
Beispiel #2
0
        private void btnExecutar_Click(object sender, EventArgs e)
        {
            btnCriarPop.Enabled = false;

            float taxaMutacao   = float.Parse(txtTaxaMutacao.Text);
            float taxaCrossover = float.Parse(txtTaxaCrossover.Text);
            int   torneio       = int.Parse(txtQtdeTorneio.Text);

            Evolucoes += int.Parse(txtEvolucao.Text);
            BestAux    = double.PositiveInfinity;

            //configurar AG
            ConfigurationGA.RateCrossover       = taxaCrossover;
            ConfigurationGA.RateMutation        = taxaMutacao;
            ConfigurationGA.NumberOfCompetitors = torneio;
            ConfigurationGA.Mutation mutacao = ConfigurationGA.Mutation.NewIndividual;

            if (rbNovoIndividuo.Checked)
            {
                mutacao = ConfigurationGA.Mutation.NewIndividual;
            }
            else if (rbPopulacao.Checked)
            {
                mutacao = ConfigurationGA.Mutation.InPopulation;
            }
            else if (rbGenesPop.Checked)
            {
                mutacao = ConfigurationGA.Mutation.InGenesPopulation;
            }

            ConfigurationGA.MutationType = mutacao;

            //elitismo
            if (chElitismo.Checked)
            {
                ConfigurationGA.Elitism     = true;
                ConfigurationGA.SizeElitism = int.Parse(txtQtdeElitismo.Text);
            }
            else
            {
                ConfigurationGA.Elitism = false;
            }

            //Console.WriteLine("---------------------------------------------------------------------------------------");
            //Console.WriteLine("TIPO CROSSOVER: PMX");
            //Console.WriteLine("TIPO MUTACAO: " + ConfigurationGA.MutationType);
            //Console.WriteLine("TIPO SELECAO: Torneio");
            //Console.WriteLine("ELITISMO: " + ConfigurationGA.Elitism +", QTD: "+ConfigurationGA.SizeElitism);
            //Console.WriteLine("TAXA MUTACAO: " + ConfigurationGA.RateMutation);
            //Console.WriteLine("TAXA CROSSOVER: " + ConfigurationGA.RateCrossover);
            //Console.WriteLine("EVOLUCOES: " + Evolucoes.ToString());
            //Console.WriteLine("---------------------------------------------------------------------------------------");


            GeneticAlgorithm AG = new GeneticAlgorithm();

            for (int i = ITemp; i < Evolucoes; i++)
            {
                ITemp++;
                lbEvolucoes.Text = (i + 1).ToString();
                lbEvolucoes.Refresh();

                //evolucao do algoritmo genetico
                Pop = AG.ExecuteGA(Pop);

                zedMedia.GraphPane.CurveList.Clear();
                zedMedia.GraphPane.GraphObjList.Clear();

                double mediaPop = Pop.GetAveragePopulation();
                MediaPopulacao.Add(i, mediaPop);
                double bestFitness = Pop.GetBest().GetFitness();
                lbMenorDistancia.Text = bestFitness.ToString();
                lbMenorDistancia.Refresh();

                LineItem media = PaneMedia.AddCurve("Média", MediaPopulacao, Color.Red, SymbolType.None);

                //mostrar a rota a cada 6 evolucoes, se o fitness for menor que o atual
                if (i % 6 == 0 && bestFitness < BestAux)
                {
                    BestAux = bestFitness;
                    G.Clear(Color.White);
                    PlotLines(Pop, Color.Blue);
                    PlotPoints();
                    lbUltimaEvolucao.Text = (i + 1).ToString();
                    lbUltimaEvolucao.Refresh();
                }

                zedMedia.AxisChange();
                zedMedia.Invalidate();
                zedMedia.Refresh();
            }

            G.Clear(Color.White);
            PlotLines(Pop, Color.Blue);
            PlotPoints();
        }
        private void btnExecutar_Click(object sender, EventArgs e)
        {
            btnCriarPop.Enabled = false;

            float taxaMutacao   = float.Parse(txtTaxaMutacao.Text);
            float taxaCrossover = float.Parse(txtTaxaCrossover.Text);
            int   torneio       = int.Parse(txtQtdeTorneio.Text);

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

            bestAux = double.PositiveInfinity;

            // Configurar AG
            ConfigurationGA.rateCrossover     = taxaCrossover;
            ConfigurationGA.rateMutation      = taxaMutacao;
            ConfigurationGA.numbOfCompetitors = torneio;
            ConfigurationGA.Mutation mutacao = ConfigurationGA.Mutation.NewIndividual;

            if (rbNovoIndividuo.Checked)
            {
                mutacao = ConfigurationGA.Mutation.NewIndividual;
            }
            else if (rbPopGeral.Checked)
            {
                mutacao = ConfigurationGA.Mutation.InPopulation;
            }
            else if (rbGenesPop.Checked)
            {
                mutacao = ConfigurationGA.Mutation.InGenesPopulation;
            }

            ConfigurationGA.mutationType = mutacao;

            if (chElitismo.Checked)
            {
                ConfigurationGA.elitism     = true;
                ConfigurationGA.sizeElitism = int.Parse(txtQtdeElitismo.Text);
            }
            else
            {
                ConfigurationGA.elitism = false;
                //ConfigurationGA.sizeElitism = 0;
            }

            Console.Write("-----------------------------------------------------------------------------\n");
            Console.Write("TIPO CROSSOVER: " + "PMX" + "\n");
            Console.Write("TIPO MUTAÇÃO: " + ConfigurationGA.mutationType + "\n");
            Console.Write("TIPO SELEÇÃO: " + "Torneio" + "\n");
            Console.Write("ELITISMO: " + ConfigurationGA.elitism + " - QTDE: " + ConfigurationGA.sizeElitism + "\n");
            Console.Write("TAXA MUTAÇÃO: " + ConfigurationGA.rateMutation + "\n");
            Console.Write("TAXA CROSSOVER: " + ConfigurationGA.rateCrossover + "\n");
            Console.Write("EVOLUÇÕES: " + evolucoes.ToString() + "\n");
            Console.Write("-----------------------------------------------------------------------------\n");

            GeneticAlgorithm ag = new GeneticAlgorithm();

            for (int i = iTemp; i < evolucoes; i++)
            {
                iTemp++;
                lbEvolucoes.Text = i.ToString();
                lbEvolucoes.Refresh();

                // Execução do algoritmo genético
                pop = ag.executaGA(pop);

                // Limpar o gráfico
                zedMedia.GraphPane.CurveList.Clear();
                zedMedia.GraphPane.GraphObjList.Clear();

                double mediaPop = pop.getAveragePopulation();

                mediaPopulacao.Add(i, mediaPop);

                // Busca o Fitness do melhor indivíduo
                double bestFitness = pop.getBest().getFitness();
                lbMenorDistancia.Text = Math.Round(bestFitness, 0).ToString();
                lbMenorDistancia.Refresh();
                testaMaiorDistancia(bestFitness);
                lbMaiorDistancia.Text = Math.Round(maiorDistancia, 2).ToString();
                lbMaiorDistancia.Refresh();

                // Adiciona a média da população no gráfico
                LineItem media = paneMedia.AddCurve("Média", mediaPopulacao, Color.Red, SymbolType.None);

                // Print linhas a cada 6 evoluções
                if (i % 6 == 0 && bestFitness < bestAux)
                {
                    bestAux = bestFitness;
                    g.Clear(Color.White);
                    plotLines(pop, Color.Blue);
                    plotPoints();
                }

                zedMedia.AxisChange();
                zedMedia.Invalidate();
                zedMedia.Refresh();
            }

            g.Clear(Color.White);
            // Chama o método para melhorar a população
            pop.twoOptSwap(pop.getBest());
            plotLines(pop, Color.Blue);
            plotPoints();
        }