📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Cap. 16 (Dijkstra) do Módulo 09: Estruturas de Dados. Recomendado revisar antes de começar.
v1.0 — Engenharia de Software & Práticas Profissionais
Trilha de Especialização Pedagógica
- Tecnologias: Python 3.12, Grafos, Algoritmo de Dijkstra, Heapq, Menor Caminho, Logística
- Arquivo Principal:
dijkstra.py
Modelagem de redes de transporte e roteamento logístico com Grafos Ponderados, representação por Listas de Adjacência e Algoritmo de Dijkstra com Fila de Prioridade (Heap Binário) para busca do menor caminho.
import heapq
def calcular_menor_caminho(grafo, inicio, destino):
distancias = {vertice: float('infinity') for vertice in grafo}
distancias[inicio] = 0
fila_prioridade = [(0, inicio)]
while fila_prioridade:
dist_atual, vertice_atual = heapq.heappop(fila_prioridade)
if dist_atual > distancias[vertice_atual]:
continue
for vizinho, peso in grafo[vertice_atual].items():
distancia = dist_atual + peso
if distancia < distancias[vizinho]:
distancias[vizinho] = distancia
heapq.heappush(fila_prioridade, (distancia, vizinho))
return distancias[destino]
if __name__ == "__main__":
rede_logistica = {
'Centro': {'Filial_Norte': 4, 'Filial_Sul': 2},
'Filial_Norte': {'Centro': 4, 'Filial_Leste': 5},
'Filial_Sul': {'Centro': 2, 'Filial_Leste': 8, 'Destino_Final': 10},
'Filial_Leste': {'Filial_Norte': 5, 'Filial_Sul': 8, 'Destino_Final': 2},
'Destino_Final': {}
}
custo = calcular_menor_caminho(rede_logistica, 'Centro', 'Destino_Final')
print(f"Menor custo de rota ate o Destino Final: R$ {custo:.2f}")
No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:
cd algoritmos_03_grafos_rotas_dijkstra
go run main.go
# ou python main.py
[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd catalogo_projetos/algoritmos_03_grafos_rotas_dijkstra
A visualização arquitetural abaixo detalha a separação de responsabilidades e o fluxo de dados implementado na subpasta cli-python/:
flowchart TD
subgraph Entrada["Camada de Entrada & CLI"]
IN1["Interface de Comando / API"] --> IN2["Parser & Sanitização"]
end
subgraph Dominio["Camada de Domínio & Regras"]
DM1["Modelos de Domínio"] --> DM2["Processamento Algorítmico"]
end
subgraph Armazenamento["Persistência & Recursos"]
ST1["Banco de Dados / Arquivo"] --> ST2["Transações ACID & Logs"]
end
subgraph Qualidade["Validação & Qualidade"]
QA1["Testes Automatizados"] --> QA2["Checkpoints CP-01..05 PASS"]
end
Entrada --> Dominio
Dominio --> Armazenamento
Armazenamento --> Qualidade
style Entrada fill:#e3f2fd,stroke:#1976d2,stroke-width:1.5px
style Dominio fill:#fffde7,stroke:#fbc02d,stroke-width:1.5px
style Armazenamento fill:#e8f5e9,stroke:#388e3c,stroke-width:1.5px
style Qualidade fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1.5px
| ID | Persona | História de Usuário | Critério de Aceite | Prioridade |
|---|---|---|---|---|
| US-01 | Engenheiro de Logística | Desejo modelar malha viária como grafo ponderado direcionado | Representação por listas de adjacência com pesos positivos | Alta |
| US-02 | Especialista em Rotas | Desejo calcular menor trajeto entre dois nós usando Dijkstra | Fila de prioridade com min-heap heapq para complexidade O((V+E) log V) | Alta |
| US-03 | Operador de Frotas | Desejo reconstruir o caminho completo com lista ordenada de nós | Rastreamento por mapa de predecessores com distância total calculada | Alta |
| US-04 | Planejador Urbano | Desejo exportar topologia de rede em formato JSON e DOT (Graphviz) | Exportação compatível com renderizadores de grafos externos | Média |
| US-05 | Auditor de Qualidade | Desejo testes com grafos desconexos e detecção de arestas negativas | Validações e exceções claras para pesos negativos | Média |
| ID | Descrição do Requisito | Criticidade |
|---|---|---|
| RF-01 | Classe Graph com suporte a adição de vértices, arestas e pesos | Alta |
| RF-02 | Algoritmo de Dijkstra implementado com Min-Heap eficiente | Alta |
| RF-03 | Reconstrução do menor trajeto e cálculo de custo acumulado | Alta |
| RF-04 | Simulador CLI com malha pré-carregada de cidades brasileiras | Média |
| RF-05 | Suíte de testes de corretude e casos de desconexão de vértices | Média |
| ID | Especificação Arquitetural | Criticidade |
|---|---|---|
| RNF-01 | Complexidade temporal O((V + E) log V) rigorosamente respeitada | Alta |
| RNF-02 | Tempo de resposta inferior a 50ms para grafos de até 10.000 nós | Alta |
| RNF-03 | Memória proporcional ao número de arestas O(V + E) | Média |
| RNF-04 | Uso exclusivo da biblioteca padrão do Python (heapq, collections) | Alta |
| RNF-05 | Isolamento da aplicação na subpasta cli-python/ | Alta |
| User Story | Requisito Funcional | Requisito Não-Funcional | Módulo / Artefato de Código | Status de Homologação |
|---|---|---|---|---|
| US-01 | RF-01 |
RNF-01, RNF-03 |
cli-python/dijkstra.py |
Testado |
| US-02 | RF-02 |
RNF-01, RNF-02 |
cli-python/dijkstra.py |
Testado |
| US-03 | RF-03 |
RNF-01, RNF-04 |
cli-python/dijkstra.py |
Testado |
| US-04 | RF-04 |
RNF-04, RNF-05 |
cli-python/dijkstra.py |
Testado |
| US-05 | RF-05 |
RNF-01, RNF-04 |
cli-python/dijkstra.py |
Testado |
| Checkpoint | Escopo da Validação | Artefato Verificado | Status |
|---|---|---|---|
| CP-01 | Inicialização & Estrutura de Pastas | cli-python/ |
PASS ✅ |
| CP-02 | Modelagem de Domínio & Regras Centrais | Domain Models |
PASS ✅ |
| CP-03 | Persistência & Operações de I/O | Storage / Data |
PASS ✅ |
| CP-04 | Interface de Operação & Usabilidade | CLI / GUI / API |
PASS ✅ |
| CP-05 | Homologação com Suíte de Testes | Test Suite |
PASS ✅ |