From e195a67ab82a770667f6a44a830aa1497ac6572b Mon Sep 17 00:00:00 2001 From: Reinan Souza Date: Mon, 9 Dec 2024 19:01:06 -0300 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20melhorias=20na=20estrutura=20do=20c?= =?UTF-8?q?=C3=B3digo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/delivery_ag/exemplo_aleatorio.py | 82 ++++++++++++++----- 1 file changed, 62 insertions(+), 20 deletions(-) diff --git a/src/python/src/delivery_ag/exemplo_aleatorio.py b/src/python/src/delivery_ag/exemplo_aleatorio.py index 05b67ff..37b8621 100644 --- a/src/python/src/delivery_ag/exemplo_aleatorio.py +++ b/src/python/src/delivery_ag/exemplo_aleatorio.py @@ -4,36 +4,72 @@ from src.delivery_ag.ag import AlgoritmoGenetico from src.delivery_ag.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() From ce4efe228b14446ddf3060ccfe129f1a3c5d9811 Mon Sep 17 00:00:00 2001 From: Reinan Gabriel Date: Mon, 9 Dec 2024 19:17:33 -0300 Subject: [PATCH 2/3] refactor: update README.md --- src/python/src/delivery_ag/README.md | 40 +++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/python/src/delivery_ag/README.md b/src/python/src/delivery_ag/README.md index e46c18d..20673da 100644 --- a/src/python/src/delivery_ag/README.md +++ b/src/python/src/delivery_ag/README.md @@ -1,13 +1,41 @@ -## 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 +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 -python3 src/python/caixeiro_viajante_simple/__init__.py +python src/python/src/delivery_ag/exemplo_aleatorio.py ``` From 376aed43200acf883047380adb386ffa741dd80e Mon Sep 17 00:00:00 2001 From: Reinan Gabriel Date: Mon, 9 Dec 2024 19:25:13 -0300 Subject: [PATCH 3/3] refactor: update README.md --- src/python/src/delivery_ag/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/python/src/delivery_ag/README.md b/src/python/src/delivery_ag/README.md index 20673da..4fb9e81 100644 --- a/src/python/src/delivery_ag/README.md +++ b/src/python/src/delivery_ag/README.md @@ -39,3 +39,9 @@ Conforme solicitado na atividade, foi criado um cenário onde as informações s ```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) + +