Beispiel #1
0
        protected override void Roda()
        {
            int stagCount = 0;

            for (int i = 0; i < Iteracoes; i++)
            {
                List <int> indexes = SolucaoAleatoria();

                var    menor         = indexes;
                var    custoOriginal = Problema.Custo(indexes);
                var    custo         = custoOriginal;
                double?novoCusto     = null;

                while (!(novoCusto < custo))
                {
                    for (int p = 0; p < indexes.Count; p++)
                    {
                        for (int q = 0; q < indexes.Count; q++)
                        {
                            var copia = indexes.ToList();
                            var n     = copia[q];
                            copia.RemoveAt(q);
                            copia.Insert(p, n);

                            novoCusto = Problema.Custo(copia);
                            if (novoCusto < custo)
                            {
                                indexes = copia;
                                custo   = novoCusto.Value;
                                break;
                            }
                        }
                        if (novoCusto < custo)
                        {
                            break;
                        }
                    }

                    Solucao = Problema.Solucao(indexes);
                    if (novoCusto >= custo)
                    {
                        break;
                    }
                }
                if (custo < custoOriginal)
                {
                    menor     = indexes;
                    stagCount = 0;
                }
                else
                {
                    if (++stagCount > Stagnacao)
                    {
                        break;
                    }
                }
            }
        }