diff --git a/src/python/src/delivery_ag/README.md b/src/python/src/delivery_ag/README.md index e46c18d..4fb9e81 100644 --- a/src/python/src/delivery_ag/README.md +++ b/src/python/src/delivery_ag/README.md @@ -1,13 +1,47 @@ -## Solução da Atividade +## Solução da atividade -Esta é a documentação referente à solução da atividade [Atividade sobre caixeiro viajante - Delivery AG](../../../../doc/classroom-tasks/01-delivery-ag.md). Trata-se de uma implementação simples, desenvolvida utilizando a linguagem de programação Python. -O principal objetivo dessa solução é apresentar um esboço inicial de como será o desenvolvimento. -À medida que a solução for sendo consolidada, avançaremos para abordagens mais complexas, incluindo o uso de interfaces gráficas em vez de exibir as informações no console. +Esta é a documentação referente à solução da atividade [Atividade sobre caixeiro viajante - Delivery AG](../../../../doc/classroom-tasks/01-delivery-ag.md). Trata-se de uma implementação simples desenvolvida em Python. O principal objetivo dessa solução é apresentar um esboço inicial do desenvolvimento. À medida que a solução for sendo consolidada, avançaremos para abordagens mais complexas, incluindo o uso de interfaces gráficas em vez de exibir as informações no console. + +## Pré-requisitos + +Para executar a solução, é altamente recomendado que o ambiente esteja configurado corretamente para este projeto, com o Python e suas devidas configurações, conforme mencionado na documentação deste repositório. Por isso, antes de executar os comandos abaixo, leia a documentação para verificar se o ambiente está configurado corretamente. + +- [Link para a documentação de configuração do ambiente](../../README.md) ## Execução -Para realizar a execução desta tarefa, utilize o seguinte comando em seu computador, dentro do nosso ambiente: +Para rodar os testes relacionados a esta atividade, utilize o comando abaixo: ```shell -python3 src/python/caixeiro_viajante_simple/__init__.py +pytest src/python/tests/delivery_ag ``` + +Esse comando executa a sequência de testes predefinidos dentro do projeto, validando um cenário específico abordado em sala de aula. Por meio desses testes, é possível verificar a eficiência do algoritmo para o cenário base. Veja o exemplo de execução na imagem abaixo: + +![image](https://github.com/user-attachments/assets/5706e7d8-1068-45de-831f-0b0e8706e8af) + +Você também pode visualizar os resultados dos testes por meio das ferramentas de CI/CD: + +- [Clique aqui para visualizar a execução no CI/CD](https://github.com/ReinanHS/algoritmo-genetico-ifs/actions/runs/12245077113/job/34158195809) + +### Execução do cenário pré-definido + +Para executar o cenário pré-definido sem usar testes, utilize o comando abaixo. Ele executa um cenário padrão usado em sala de aula: + +```shell +python src/python/src/delivery_ag/exemplo_simples.py +``` + +### Execução do cenário aleatório + +Conforme solicitado na atividade, foi criado um cenário onde as informações são definidas de maneira aleatória. Para executar esse cenário, em que as cidades e rotas de entrega são geradas aleatoriamente, utilize o comando abaixo: + +```shell +python src/python/src/delivery_ag/exemplo_aleatorio.py +``` + +Veja o exemplo de execução: + +![image](https://github.com/user-attachments/assets/badd9073-9655-44fa-a7ce-6fb4c6383ce5) + + diff --git a/src/python/src/delivery_ag/exemplo_aleatorio.py b/src/python/src/delivery_ag/exemplo_aleatorio.py index f35d76a..322aadd 100644 --- a/src/python/src/delivery_ag/exemplo_aleatorio.py +++ b/src/python/src/delivery_ag/exemplo_aleatorio.py @@ -4,36 +4,72 @@ from ag import AlgoritmoGenetico from view import Estatistica -cidades = [] -rotas = [] -for i in range(10): - cidades.append(Cidade(nome='Cidade {}'.format(i))) +def gerar_cidades(numero_cidades: int = 10): + cidades_array = [] -for i in cidades: - rota = [] + for i in range(numero_cidades): + cidades_array.append(Cidade(nome='{}'.format(i))) - for j in cidades: - if random() < 0.3: - rota.append(-1) - else: - rota.append(round(random() * 200) + 1) + return cidades_array - rotas.append(rota) -rotas_entrega = [] +def gerar_rotas(cidades_rota: list[Cidade]): + rotas_array = [] -for i in range(round(len(cidades) / 2)): - rotas_entrega.append( - round( - random() * (len(cidades) - 1) - ) + 1 - ) + for _ in cidades_rota: + rota = [] + for j in cidades_rota: + if random() < 0.4: + rota.append(-1) + else: + rota.append(round(random() * 200) + 1) + + rotas_array.append(rota) + return rotas_array + + +def gerar_rotas_entrega(numero_rotas: int, + rotas_busca: list[list[int]], + index: int = 0, + rotas_array: list[int] = None): + if rotas_array is None: + rotas_array = [] + + if numero_rotas == index: + return rotas_array + + rota_valida = False + index_busca = round(random() * (len(rotas_busca) - 1)) + + while not rota_valida: + index_busca = round(random() * (len(rotas_busca) - 1)) + if len(rotas_array) == 0 and rotas_busca[0][index_busca] != -1: + rota_valida = True + + if len( + rotas_array) > 0 and rotas_busca[rotas_array[index - 1]][index_busca] != -1: + rota_valida = True + + rotas_array.append(index_busca) + + return gerar_rotas_entrega( + numero_rotas, + rotas_busca, + index + 1, + rotas_array) + + +cidades = gerar_cidades(10) +rotas = gerar_rotas(cidades) centro_distribuicao = 0 +numero_cidades_entrega = round(random() * (len(cidades) / 3)) + 1 +rotas_entrega = gerar_rotas_entrega(numero_cidades_entrega, rotas) + taxa_mutacao = 0.05 -numero_geracoes = 400 +numero_geracoes = 500 tamanho_populacao = 20 debug_mode = False @@ -51,6 +87,12 @@ centro_distribuicao=centro_distribuicao, ) +print( + f" ***** (Informações do percurso) *****\n" + f" Cidade de distribuição: {cidades[centro_distribuicao].nome}\n" + f" Rota de entrega: {str(rotas_entrega)}\n" + f" ***** ================ *****\n" +) print("\n\n O melhor resultado: \n") ag.melhor_solucao.print()