Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/main'
Browse files Browse the repository at this point in the history
  • Loading branch information
Davi committed Dec 10, 2024
2 parents 50445c1 + 376aed4 commit fff1968
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 26 deletions.
46 changes: 40 additions & 6 deletions src/python/src/delivery_ag/README.md
Original file line number Diff line number Diff line change
@@ -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)


82 changes: 62 additions & 20 deletions src/python/src/delivery_ag/exemplo_aleatorio.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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()

Expand Down

0 comments on commit fff1968

Please sign in to comment.