📚 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.

🌲 Modelagem de Grafos & Menor Caminho com Dijkstra

v1.0 — Engenharia de Software & Práticas Profissionais

Trilha de Especialização Pedagógica


🎯 Objetivo & Escopo do Projeto

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.


🛠️ Código de Exemplo da Implementação

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}")


🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd algoritmos_03_grafos_rotas_dijkstra

2. Execute a aplicação ou testes

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


🏛️ Arquitetura Visual & Engenharia do Sistema

A visualização arquitetural abaixo detalha a separação de responsabilidades e o fluxo de dados implementado na subpasta cli-python/:

Arquitetura da Aplicação

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

🎯 Engenharia de Requisitos & Modelagem Formal

👤 User Stories (Histórias de Usuário)

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

⚙️ Requisitos Funcionais (RF)

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

🛡️ Requisitos Não-Funcionais (RNF)

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

🔗 Matriz de Rastreabilidade (RTM)

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

🏁 Checkpoints de Qualidade & Homologação

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 ✅