Neste artigo, vamos explorar uma solução para um problema clássico de otimização combinatória: o Problema do Caixeiro Viajante (PCV). Utilizaremos um algoritmo genético, uma técnica de otimização inspirada no processo de seleção natural, para encontrar uma solução aproximada para o PCV. Em Python, implementaremos o algoritmo genético e o aplicaremos a um conjunto de cidades com coordenadas cartesianas, encontrando assim o percurso que visita todas as cidades uma única vez, minimizando a distância total percorrida.
**Código em Python:**
“`
<?php // Início do código Python py_code = """ import random import numpy as np # Função para calcular a distância euclidiana entre dois pontos def distancia(p1, p2): return np.linalg.norm(np.array(p1) - np.array(p2)) # Função para calcular a distância total do percurso def distancia_total(percurso, distancias): total = 0 for i in range(len(percurso) - 1): total += distancias[percurso[i]][percurso[i + 1]] total += distancias[percurso[-1]][percurso[0]] # Voltando ao ponto inicial return total # Função para gerar um percurso inicial aleatório def percurso_inicial(cidades): percurso = list(range(len(cidades))) random.shuffle(percurso) return percurso # Algoritmo genético para resolver o problema do caixeiro viajante def algoritmo_genetico(cidades, distancias, populacao_size=50, geracoes=1000): populacao = [percurso_inicial(cidades) for _ in range(populacao_size)] for geracao in range(geracoes): populacao = sorted(populacao, key=lambda x: distancia_total(x, distancias)) nova_populacao = [] # Elitismo: mantém os melhores indivíduos nova_populacao.extend(populacao[:int(0.2 * populacao_size)]) # Cruzamento for _ in range(int(0.8 * populacao_size)): pais = random.sample(populacao[:int(0.5 * populacao_size)], 2) ponto_corte = random.randint(0, len(cidades) - 1) filho = pais[0][:ponto_corte] + [cidade for cidade in pais[1] if cidade not in pais[0][:ponto_corte]] nova_populacao.append(filho) populacao = nova_populacao melhor_percurso = min(populacao, key=lambda x: distancia_total(x, distancias)) melhor_distancia = distancia_total(melhor_percurso, distancias) return melhor_percurso, melhor_distancia # Exemplo de utilização do algoritmo genético cidades = [(0, 0), (1, 2), (3, 1), (5, 3)] # Coordenadas das cidades distancias = [[distancia(c1, c2) for c2 in cidades] for c1 in cidades] # Matriz de distâncias melhor_percurso, melhor_distancia = algoritmo_genetico(cidades, distancias) print("Melhor percurso:", melhor_percurso) print("Melhor distância:", melhor_distancia) """ // Fim do código Python ?>
“`
Este código implementa um algoritmo genético para resolver o PCV. Primeiro, definimos funções para calcular a distância entre cidades, a distância total de um percurso e gerar um percurso inicial aleatório. Em seguida, definimos o algoritmo genético propriamente dito, que evolui uma população de percursos ao longo de várias gerações, realizando seleção, cruzamento e mutação. Finalmente, aplicamos o algoritmo a um exemplo de cidades com coordenadas cartesianas e exibimos o melhor percurso encontrado, juntamente com a distância total percorrida. Essa abordagem demonstra como os algoritmos genéticos podem ser aplicados com sucesso a problemas complexos de otimização, como o PCV.