Skip to content

Commit

Permalink
fix: correção da formatação
Browse files Browse the repository at this point in the history
  • Loading branch information
ReinanHS committed Dec 5, 2024
1 parent 16d562a commit a229302
Show file tree
Hide file tree
Showing 10 changed files with 124 additions and 30 deletions.
10 changes: 8 additions & 2 deletions .github/workflows/python.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,13 @@ jobs:
- name: Instalar dependências
run: |
python -m pip install --upgrade pip
pip install pylint
pip install -r src/python/requirements.txt
- name: Analisando o código com pylint
run: |
pylint $(git ls-files '*.py')
pylint src/python/**/*.py
- name: Execução dos testes
run: |
pytest src/python
- name: Verificação automática do formato do código
run: |
autopep8 --recursive --diff --aggressive --aggressive src/python
5 changes: 4 additions & 1 deletion src/python/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,12 @@ Para executar os testes disponíveis neste projeto, siga os passos abaixo:

1. Instale o pacote no modo de desenvolvimento:
```bash
pip install -r src/python/requirements.txt
pip install -e .
```
2. Após a instalação, execute os testes com o seguinte comando:
```bash
pytest # OU pytest src/python
pytest src/python
pylint src/python/**/*.py
autopep8 --recursive --in-place --aggressive --aggressive src/python
```
Binary file modified src/python/requirements.txt
Binary file not shown.
2 changes: 1 addition & 1 deletion src/python/src/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from . import delivery_ag
from . import delivery_ag
33 changes: 28 additions & 5 deletions src/python/src/delivery_ag/ag.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from random import random

from src.delivery_ag.individuo import Individuo


Expand All @@ -17,7 +18,11 @@ class AlgoritmoGenetico:
- debug_mode (bool): Ativa/desativa mensagens de depuração.
"""

def __init__(self, tamanho_populacao=20, taxa_mutacao=0.5, debug_mode=False):
def __init__(
self,
tamanho_populacao=20,
taxa_mutacao=0.5,
debug_mode=False):
"""
Inicializa a classe com os parâmetros fornecidos.
Expand All @@ -34,7 +39,12 @@ def __init__(self, tamanho_populacao=20, taxa_mutacao=0.5, debug_mode=False):
self.melhores_solucoes_geracao = []
self.melhor_solucao = None

def inicializa_populacao(self, cidades, rotas, caminho, centro_distribuicao):
def inicializa_populacao(
self,
cidades,
rotas,
caminho,
centro_distribuicao):
"""
Inicializa a população com indivíduos gerados aleatoriamente.
Expand All @@ -45,14 +55,21 @@ def inicializa_populacao(self, cidades, rotas, caminho, centro_distribuicao):
- centro_distribuicao (list): Localização do centro de distribuição.
"""
for _ in range(self.tamanho_populacao):
self.populacao.append(Individuo(cidades, rotas, caminho, centro_distribuicao))
self.populacao.append(
Individuo(
cidades,
rotas,
caminho,
centro_distribuicao))
self.melhor_solucao = self.populacao[0]

def ordena_populacao(self):
"""
Ordena a população com base na nota de avaliação de cada indivíduo.
"""
self.populacao.sort(key=lambda individuo: individuo.nota_avaliacao, reverse=False)
self.populacao.sort(
key=lambda individuo: individuo.nota_avaliacao,
reverse=False)

def melhor_individuo(self, individuo):
"""
Expand Down Expand Up @@ -151,7 +168,13 @@ def seleciona_pai(self):
return i
return self.seleciona_pai()

def resolver(self, numero_geracoes, cidades, rotas, caminho, centro_distribuicao):
def resolver(
self,
numero_geracoes,
cidades,
rotas,
caminho,
centro_distribuicao):
"""
Executa o algoritmo genético para resolver o problema.
Expand Down
2 changes: 1 addition & 1 deletion src/python/src/delivery_ag/cidade.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class Cidade:
- nome (str): O nome da cidade.
"""

def __init__(self, nome : str):
def __init__(self, nome: str):
"""
Inicializa uma nova instância da classe Cidade.
Expand Down
28 changes: 24 additions & 4 deletions src/python/src/delivery_ag/individuo.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from random import random


class Individuo:
"""
Representa um indivíduo no algoritmo genético.
Expand All @@ -20,7 +21,15 @@ class Individuo:
- cidades_percorridas (int): Número de cidades diferentes visitadas.
- nota_avaliacao (float): Avaliação da qualidade da rota.
"""
def __init__(self, cidades, rotas, caminho, centro_distribuicao, geracao=0, cromossomo=None):

def __init__(
self,
cidades,
rotas,
caminho,
centro_distribuicao,
geracao=0,
cromossomo=None):
"""
Inicializa o indivíduo com os parâmetros fornecidos.
Expand Down Expand Up @@ -107,9 +116,20 @@ def crossover(self, outro_individuo):
filho2 = self.cromossomo[:corte] + outro_individuo.cromossomo[corte:]

return [
Individuo(self.cidades, self.rotas, self.caminho, self.centro_distribuicao, self.geracao + 1, filho1),
Individuo(self.cidades, self.rotas, self.caminho, self.centro_distribuicao, self.geracao + 1, filho2)
]
Individuo(
self.cidades,
self.rotas,
self.caminho,
self.centro_distribuicao,
self.geracao + 1,
filho1),
Individuo(
self.cidades,
self.rotas,
self.caminho,
self.centro_distribuicao,
self.geracao + 1,
filho2)]

def mutacao(self, taxa_mutacao):
"""
Expand Down
58 changes: 46 additions & 12 deletions src/python/src/delivery_ag/view.py
Original file line number Diff line number Diff line change
@@ -1,24 +1,37 @@
import os

import matplotlib.pyplot as plt
import networkx as nx
import os
from PIL import Image


class Estatistica:
@staticmethod
def mostrar_estatistica(algoritmo_genetico, cidades, rotas, gerar_gif = False):
plt.plot([individuo.nota_avaliacao for individuo in algoritmo_genetico.melhores_solucoes_geracao])
def mostrar_estatistica(
algoritmo_genetico,
cidades,
rotas,
gerar_gif=False):
plt.plot(
[individuo.nota_avaliacao for individuo in algoritmo_genetico.melhores_solucoes_geracao])
plt.title("Acompanhamento dos valores")
plt.show()

pos = ViewGraphEvolution.criar_estrutura_desenho(cidades, rotas)
view = ViewGraph(cidades, rotas, algoritmo_genetico.melhor_solucao, pos)
view = ViewGraph(
cidades,
rotas,
algoritmo_genetico.melhor_solucao,
pos)
view.desenhar(algoritmo_genetico.melhor_solucao.geracao).show()

if gerar_gif:
ViewGraphEvolution(cidades, rotas, algoritmo_genetico.melhores_solucoes_geracao)
ViewGraphEvolution(
cidades, rotas, algoritmo_genetico.melhores_solucoes_geracao)

pass


class ViewGraph:
"""
Classe responsável por visualizar o grafo de cidades e rotas de um indivíduo.
Expand All @@ -32,6 +45,7 @@ class ViewGraph:
- pos: Posições das cidades no grafo para exibição gráfica.
- graph: Objeto `networkx.Graph` representando o grafo.
"""

def __init__(self, cidades, rotas, individuo, pos):
"""
Inicializa o grafo com as cidades, rotas e o indivíduo a ser visualizado.
Expand All @@ -45,7 +59,8 @@ def __init__(self, cidades, rotas, individuo, pos):
self.cidades = cidades
self.rotas = rotas
self.individuo = individuo
self.caminho_percorrido = [cidades[i].nome for i in individuo.cromossomo]
self.caminho_percorrido = [
cidades[i].nome for i in individuo.cromossomo]
self.pos = pos

self.graph = nx.Graph()
Expand All @@ -61,7 +76,10 @@ def adicionar_cidade(self):
for i in range(len(self.rotas)):
for j in range(len(self.rotas)):
if self.rotas[i][j] > 0:
self.graph.add_edge(self.cidades[i].nome, self.cidades[j].nome, weight=self.rotas[i][j])
self.graph.add_edge(
self.cidades[i].nome,
self.cidades[j].nome,
weight=self.rotas[i][j])

def desenhar(self, index):
"""
Expand Down Expand Up @@ -92,11 +110,23 @@ def desenhar(self, index):

plt.figure(figsize=(10, 8))

nx.draw_networkx_edges(self.graph, self.pos, edgelist=normal_edges, alpha=0.7, edge_color='gray')
nx.draw_networkx_edges(self.graph, self.pos, edgelist=highlighted_edges, width=2.5, edge_color='red')
nx.draw_networkx_edges(
self.graph,
self.pos,
edgelist=normal_edges,
alpha=0.7,
edge_color='gray')
nx.draw_networkx_edges(
self.graph,
self.pos,
edgelist=highlighted_edges,
width=2.5,
edge_color='red')

edge_labels = {(u, v): d['weight'] for u, v, d in self.graph.edges(data=True)}
nx.draw_networkx_edge_labels(self.graph, self.pos, edge_labels=edge_labels)
edge_labels = {(u, v): d['weight']
for u, v, d in self.graph.edges(data=True)}
nx.draw_networkx_edge_labels(
self.graph, self.pos, edge_labels=edge_labels)

nx.draw(
self.graph,
Expand Down Expand Up @@ -140,6 +170,7 @@ class ViewGraphEvolution:
- rotas: Matriz de adjacência representando as distâncias entre as cidades.
- melhores_resultados: Lista de indivíduos com as melhores avaliações ao longo das gerações.
"""

def __init__(self, cidades, rotas, melhores_resultados):
"""
Inicializa a classe e gera a evolução gráfica.
Expand Down Expand Up @@ -215,7 +246,10 @@ def remover_repeticoes(resultados):
Returns:
- (list): Lista de indivíduos únicos.
"""
resultados = sorted(resultados, key=lambda individuo: individuo.nota_avaliacao, reverse=True)
resultados = sorted(
resultados,
key=lambda individuo: individuo.nota_avaliacao,
reverse=True)

resultados_filtrados = []
contador_repeticoes = 0
Expand Down
3 changes: 1 addition & 2 deletions src/python/src/main.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from src.package_1.awesome_module import hello

def main():
print(hello[0])
print("Teste")
13 changes: 11 additions & 2 deletions src/python/tests/delivery_ag/cidade_test.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,25 @@
import unittest

from src.delivery_ag.cidade import Cidade


class TestCidade(unittest.TestCase):
def test_inicializacao_cidade(self):
nome_cidade = "São Paulo"
cidade = Cidade(nome_cidade)
self.assertEqual(cidade.nome, nome_cidade, "O nome da cidade não foi inicializado corretamente")
self.assertEqual(
cidade.nome,
nome_cidade,
"O nome da cidade não foi inicializado corretamente")

def test_nome_cidade_vazio(self):
nome_cidade = ""
cidade = Cidade(nome_cidade)
self.assertEqual(cidade.nome, nome_cidade, "A cidade deve permitir nomes vazios")
self.assertEqual(
cidade.nome,
nome_cidade,
"A cidade deve permitir nomes vazios")


if __name__ == '__main__':
unittest.main()

0 comments on commit a229302

Please sign in to comment.