Notícias

Resolvendo o Problema do Caixeiro Viajante com Algoritmo Genético em Python

 

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.


		

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *