private void DesenharCaminhos() { Pen pen = new Pen(Color.Blue, 2); Genes Primeiro = ListaGenes[0]; if (Listacidades.Count > 0) { for (int i = 1; i < iCidades; i++)//Pula o primeiro { grafico.DrawLine(pen, Listacidades[Primeiro.Ordem[i]].X, Listacidades[Primeiro.Ordem[i]].Y, Listacidades[Primeiro.Ordem[i - 1]].X, Listacidades[Primeiro.Ordem[i - 1]].Y); } grafico.DrawLine(pen, Listacidades[Primeiro.Ordem[0]].X, Listacidades[Primeiro.Ordem[0]].Y, Listacidades[Primeiro.Ordem[iCidades - 1]].X, Listacidades[Primeiro.Ordem[iCidades - 1]].Y); } richTextBox1.Text = "Distância: " + Primeiro.Distancia + "\n"; foreach (int item in Primeiro.Ordem) { richTextBox1.Text += item + ","; } richTextBox1.Text += "\nGerações: " + iGeracoes; }
private void Evoluir() { List <Genes> ListaGenesAnterior = new List <Genes>(ListaGenes); List <Genes> Campeoes = new List <Genes>(); Random rnd = new Random(); int distanciaCampeao = ListaGenes[0].Distancia; for (int i = 0; i < iPopulacao / 50; i++) { Campeoes.Add((ListaGenes[i])); Campeoes.Add((ListaGenes[rnd.Next(5, iPopulacao)])); Genes geneReverso = new Genes(); geneReverso.Ordem = new List <int>(); geneReverso.Ordem.Add(0); for (int w = 1; w < iCidades; w++) { geneReverso.Ordem.Add(ListaGenes[i].Ordem[iCidades - w]); } Campeoes.Add(geneReverso); if (checkBox1.CheckState == CheckState.Checked) { Genes geneAleatorio = new Genes(); geneAleatorio.Ordem = new List <int>(); List <int> possibilidades = new List <int>((iCidades - 1)); for (int a = 0; a < iCidades; a++) { possibilidades.Add(a + 1); } geneAleatorio.Ordem.Add(0); for (int a = 1; a < iCidades; a++) { int ivalor = rnd.Next(0, possibilidades.Count - 1); geneAleatorio.Ordem.Add(possibilidades[ivalor]); possibilidades.RemoveAt(ivalor); } Campeoes.Add(geneAleatorio); } } for (int i = 1; i < iPopulacao; i++) { int startIndexClone = rnd.Next(1, iCidades - 1); List <int> CampeaoSorteado = new List <int>(); CampeaoSorteado.AddRange(Campeoes[rnd.Next(0, Campeoes.Count)].Ordem); List <int> GeneAtual = new List <int>(); //GeneAtual.AddRange((ListaGenes[i].Ordem)); GeneAtual.AddRange(Campeoes[rnd.Next(0, Campeoes.Count)].Ordem); List <int> NovoGene = new List <int>(iCidades);// { 0, -1, -1, -1, -1, -1, -1, -1, -1, -1}; NovoGene.Add(0); for (int a = 1; a < iCidades; a++) { NovoGene.Add(-1); } int c = 0; //fator de descendencia int idesc = rnd.Next(0, iCidades); for (int a = 0; c < idesc; a++) { if (startIndexClone + a == iCidades) { startIndexClone = 1; a = 0; } NovoGene[startIndexClone + a] = CampeaoSorteado[startIndexClone + a]; c++; } double iDistancia = 0; //completa o resto dos cromos for (int a = 1; a < iCidades; a++) { if (!NovoGene.Contains(GeneAtual[a])) { if (NovoGene[a] == -1 && (rnd.Next(0, 100) < 80)) { NovoGene[a] = GeneAtual[a]; } else { for (int r = 0; r < iCidades; r++) { if (NovoGene[r] == -1) { NovoGene[r] = GeneAtual[a]; break; } } } } } for (int t = 0; t < iCidades / 20; t++) { if (rnd.Next(0, 100) > 70) { int iPosA = rnd.Next(1, iCidades - 1); int iPosB = rnd.Next(1, iCidades - 1); int iTempA = NovoGene[iPosA]; int iTempB = NovoGene[iPosB]; NovoGene[iPosA] = iTempB; NovoGene[iPosB] = iTempA; } } ListaGenes[i].Ordem = NovoGene; if (Listacidades.Count > 0) { for (int a = 1; a < iCidades; a++)//começa do segundo item { iDistancia += Math.Sqrt(Math.Pow((Listacidades[ListaGenes[i].Ordem[a]].X - Listacidades[ListaGenes[i].Ordem[a - 1]].X), 2) + Math.Pow((Listacidades[ListaGenes[i].Ordem[a]].Y - Listacidades[ListaGenes[i].Ordem[a - 1]].Y), 2)); } ListaGenes[i].Distancia = (int)Math.Round(iDistancia, 0); } } ListaGenes = ListaGenes.OrderBy(Genes => Genes.Distancia).ToList(); chGrafico.Series[0].Points.AddXY(iGeracoes, ListaGenes[0].Distancia); chGrafico.ChartAreas[0].AxisY.Minimum = (ListaGenes[0].Distancia - 50); }