//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))); }
//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()); } }
//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; } } }