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 }
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(); }