//construtor do ACO
 //recebe os parâmetros a serem utilizados nas funções de movimento da formiga e de atualização de feromônio
 public ACO(TravellingSalesmanMap TSP, int numAnts)
 {
     //inicializar variáveis
     problem = new AntProblem(TSP);
     bestSolutionFound = new TSPSolution();
     taxaEvaporacao = 0.9;
     //cria as formigas e coloca cada uma em um vértice aleatório do grafo
     System.Random random = new Random();
     ants = new List<Ant>();
     for (int i = 0; i < numAnts; i++)
         //ants.Add(new Ant(random.Next(problem.CityCount) + 1));
         ants.Add(new Ant((i + 1)%(TSP.CityCount + 1)));
 }
Beispiel #2
0
 //construtor do ACO
 //recebe os parâmetros a serem utilizados nas funções de movimento da formiga e de atualização de feromônio
 public ACO(TravellingSalesmanMap TSP, int numAnts)
 {
     //inicializar variáveis
     problem           = new AntProblem(TSP);
     bestSolutionFound = new TSPSolution();
     taxaEvaporacao    = 0.9;
     //cria as formigas e coloca cada uma em um vértice aleatório do grafo
     System.Random random = new Random();
     ants = new List <Ant>();
     for (int i = 0; i < numAnts; i++)
     {
         //ants.Add(new Ant(random.Next(problem.CityCount) + 1));
         ants.Add(new Ant((i + 1) % (TSP.CityCount + 1)));
     }
 }
        //cria uma solução parcial
        public void Move(AntProblem problem)
        {
            //inicializa solução parcial
            tabooList.Clear();
            tabooList.Add(startCity);

            int visit = 0;
            /* move a formiga até que todas as cidades sejam visitadas */
            //enquanto não atender à condição final da solução parcial
            while (visit++ < problem.CityCount - 1)
            {
                //se mover para o próximo vértice
                //levando em conta heurística e lista tabu
                tabooList.Add(Decide());
            }
        }
        //cria uma solução parcial
        public void Move(AntProblem problem)
        {
            //inicializa solução parcial
            tabooList.Clear();
            tabooList.Add(startCity);

            int visit = 0;

            /* move a formiga até que todas as cidades sejam visitadas */
            //enquanto não atender à condição final da solução parcial
            while (visit++ < problem.CityCount - 1)
            {
                //se mover para o próximo vértice
                //levando em conta heurística e lista tabu
                tabooList.Add(Decide());
            }
        }
        //calcula os valores para a chance de cada aresta ser escolhida para fazer parte da solução final
        public static void PrepareMove(AntProblem problem)
        {
            //vetor que guarda as notas individuais de cada aresta
            double[,] notaTrilhas = new double[problem.CityCount, problem.CityCount];
            //vetor que guarda a soma das notas das arestas visíveis de cada cidade
            double[] somaNotas = new double[problem.CityCount];

            /* calcula a nota de cada aresta separadamente */
            //para cada aresta no grafo
            for (int cityA = 1; cityA <= problem.CityCount; cityA++)
            {
                for (int cityB = cityA + 1; cityB <= problem.CityCount; cityB++)
                {
                    // Otimizar Atribuição pelo Corte pela Metade

                    /*if (cityA == cityB) {
                     *  notaTrilhas[cityA - 1, cityB - 1] = 0;
                     *  continue;
                     * }*/
                    //calcula o valor p de acordo com a trilha de feromonios e a distancia
                    notaTrilhas[cityA - 1, cityB - 1] = System.Math.Pow(problem.GetPheromoneBetween(cityA, cityB), problem.pheromoneWeight) * System.Math.Pow(1 / problem.GetDistanceBetween(cityA, cityB), problem.distanceWeight);
                    //e atualiza a soma das notas daquela cidade
                    somaNotas[cityA - 1] += notaTrilhas[cityA - 1, cityB - 1];
                }
            }

            ProbabilityMatrix = new double[problem.CityCount, problem.CityCount];
            /* calcula o vetor de densidade de probabilidade para cada cidade */
            //para cada cidade cityA no grafo
            for (int cityA = 1; cityA <= problem.CityCount; cityA++)
            {
                double acumulado = 0;
                //calcula a chance de visitar a cidade cityB
                for (int cityB = cityA + 1; cityB <= problem.CityCount; cityB++)
                {
                    // Otimizar Atribuição pelo Corte pela Metade
                    //como sendo a nota da aresta [cityA, cityB] dividido pela soma de todas as arestas visíveis de cityA (todas)
                    acumulado += notaTrilhas[cityA - 1, cityB - 1] / somaNotas[cityA - 1];
                    ProbabilityMatrix[cityA - 1, cityB - 1] = acumulado;
                    ProbabilityMatrix[cityB - 1, cityA - 1] = acumulado;
                }
            }
        }
        //calcula os valores para a chance de cada aresta ser escolhida para fazer parte da solução final
        public static void PrepareMove(AntProblem problem)
        {
            //vetor que guarda as notas individuais de cada aresta
            double[,] notaTrilhas = new double[problem.CityCount, problem.CityCount];
            //vetor que guarda a soma das notas das arestas visíveis de cada cidade
            double[] somaNotas = new double[problem.CityCount];

            /* calcula a nota de cada aresta separadamente */
            //para cada aresta no grafo
            for (int cityA = 1; cityA <= problem.CityCount; cityA++) {
                for (int cityB = cityA + 1; cityB <= problem.CityCount; cityB++) {
                    // Otimizar Atribuição pelo Corte pela Metade
                    /*if (cityA == cityB) {
                        notaTrilhas[cityA - 1, cityB - 1] = 0;
                        continue;
                    }*/
                    //calcula o valor p de acordo com a trilha de feromonios e a distancia
                    notaTrilhas[cityA - 1, cityB - 1] = System.Math.Pow(problem.GetPheromoneBetween(cityA, cityB), problem.pheromoneWeight) * System.Math.Pow(1 / problem.GetDistanceBetween(cityA, cityB), problem.distanceWeight);
                    //e atualiza a soma das notas daquela cidade
                    somaNotas[cityA - 1] += notaTrilhas[cityA - 1, cityB - 1];
                }
            }

            ProbabilityMatrix = new double[problem.CityCount, problem.CityCount];
            /* calcula o vetor de densidade de probabilidade para cada cidade */
            //para cada cidade cityA no grafo
            for (int cityA = 1; cityA <= problem.CityCount; cityA++) {
                double acumulado = 0;
                //calcula a chance de visitar a cidade cityB
                for (int cityB = cityA + 1; cityB <= problem.CityCount; cityB++) {
                    // Otimizar Atribuição pelo Corte pela Metade
                    //como sendo a nota da aresta [cityA, cityB] dividido pela soma de todas as arestas visíveis de cityA (todas)
                    acumulado += notaTrilhas[cityA - 1, cityB - 1] / somaNotas[cityA - 1];
                    ProbabilityMatrix[cityA - 1, cityB - 1] = acumulado;
                    ProbabilityMatrix[cityB - 1, cityA - 1] = acumulado;
                }
            }
        }