예제 #1
0
        private Percurso PercursoRandom()
        {
            var      lista   = new List <int>();
            Percurso retorno = null;
            var      random  = new Random();

            do
            {
                retorno = new Percurso(Help.cidades.Count + 1);
                lista.Clear();
                retorno.InsereRotaArr(0);

                for (int i = 1; i < Help.cidades.Count; i++)
                {
                    var posicao = -1;
                    do
                    {
                        posicao = random.Next(1, Help.cidades.Count);
                        if (lista.IndexOf(posicao) >= 0)
                        {
                            posicao = -1;
                        }
                        else
                        {
                            retorno.AdicionaRotasArr((sbyte)posicao);
                            lista.Add(posicao);
                        }
                    } while (posicao == -1);
                }
                retorno.AdicionaRotasArr(0);
            } while (RotasUtilizadasGenetico.IndexOf(retorno.MontaRotasNumArr()) >= 0);

            RotasUtilizadasGenetico.Add(retorno.MontaRotasNumArr());
            return(retorno);
        }
예제 #2
0
        private void CalculaForcaBruta()
        {
            MelhoresResultados = new List <Percurso>();

            var fatorial = MathNet.Numerics.SpecialFunctions.Factorial(Help.cidades.Count - 1);
            var cidades  = new sbyte[Help.cidades.Count - 1];
            var aux      = 1;

            for (int i = 0; i < cidades.Length; i++)
            {
                cidades[i] = (sbyte)aux;
                aux++;
            }

            var menorDistancia = int.MaxValue;

            if (Inicial == 0)
            {
                Inicial = 1;
            }
            if (Final == 0)
            {
                Final = int.Parse(fatorial.ToString());
            }

            var varAuxilio = 0;

            for (int i = Inicial; i <= Final; i++)
            {
                var percurso = new Percurso(Help.cidades.Count + 1);

                var comb = new sbyte[cidades.Length];

                var disponiveis = cidades;
                var repanterior = int.Parse(fatorial.ToString());

                //niveis
                for (int j = 0; j < cidades.Length; j++)
                {
                    decimal rep = repanterior / (cidades.Length - j);

                    var modPosicao = i % repanterior;

                    if (modPosicao == 0)
                    {
                        modPosicao = i;
                        while (modPosicao > repanterior)
                        {
                            modPosicao -= int.Parse(repanterior.ToString());
                        }
                    }

                    repanterior = int.Parse(rep.ToString());

                    if ((rep == 1) && (j == (cidades.Length - 2)))
                    {
                        modPosicao = varAuxilio;
                        varAuxilio++;
                        if (varAuxilio > 1)
                        {
                            varAuxilio = 0;
                        }

                        comb[j] = disponiveis[modPosicao];
                    }
                    else
                    {
                        if (TotalDisponivel(ref disponiveis) == 1)
                        {
                            comb[j] = disponiveis[0];
                        }
                        else
                        {
                            comb[j] = disponiveis[decimal.ToInt16(Math.Ceiling(modPosicao / rep)) - 1];
                        }
                    }

                    AtualizaDisponiveis(ref disponiveis, comb[j]);
                }

                percurso.AdicionaRotasArr(comb);
                percurso.InsereRotaArr(0);
                percurso.AdicionaRotasArr(0);

                if (percurso.distancia < menorDistancia)
                {
                    menorDistancia = percurso.distancia;

                    if (MelhoresResultados.Count() >= QuantidadeResultados)
                    {
                        MelhoresResultados.Remove(MelhoresResultados.ElementAt(QuantidadeResultados - 1));
                    }

                    MelhoresResultados.Insert(0, percurso);
                }
                percurso = null;
            }
        }
예제 #3
0
        private Percurso PercursoAleatorio()
        {
            var fatorial = MathNet.Numerics.SpecialFunctions.Factorial(Help.cidades.Count - 1);
            var cidades  = new sbyte[Help.cidades.Count - 1];
            var aux      = 1;

            for (int i = 0; i < cidades.Length; i++)
            {
                cidades[i] = (sbyte)aux;
                aux++;
            }

            var random = -1;

            do
            {
                random = new Random().Next(1, int.Parse(fatorial.ToString()));
            } while (NumerosUtilizadosGenetico.IndexOf(random) >= 0);

            NumerosUtilizadosGenetico.Add(random);

            var varAuxilio = 0;

            var percurso = new Percurso(Help.cidades.Count + 1);

            var comb = new sbyte[cidades.Length];

            var disponiveis = cidades;
            var repanterior = int.Parse(fatorial.ToString());

            //niveis
            for (int j = 0; j < cidades.Length; j++)
            {
                decimal rep = repanterior / (cidades.Length - j);

                var modPosicao = random % repanterior;

                if (modPosicao == 0)
                {
                    modPosicao = random;
                    while (modPosicao > repanterior)
                    {
                        modPosicao -= int.Parse(repanterior.ToString());
                    }
                }

                repanterior = int.Parse(rep.ToString());

                if ((rep == 1) && (j == (cidades.Length - 2)))
                {
                    modPosicao = varAuxilio;
                    varAuxilio++;
                    if (varAuxilio > 1)
                    {
                        varAuxilio = 0;
                    }

                    comb[j] = disponiveis[modPosicao];
                }
                else
                {
                    if (TotalDisponivel(ref disponiveis) == 1)
                    {
                        comb[j] = disponiveis[0];
                    }
                    else
                    {
                        comb[j] = disponiveis[decimal.ToInt16(Math.Ceiling(modPosicao / rep)) - 1];
                    }
                }

                AtualizaDisponiveis(ref disponiveis, comb[j]);
            }

            percurso.AdicionaRotasArr(comb);
            percurso.InsereRotaArr(0);
            percurso.AdicionaRotasArr(0);
            return(percurso);
        }