Пример #1
0
        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;
        }
Пример #2
0
        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);
        }