CodeGym /Curso Java /Python SELF PT /Algoritmos de busca de caminho mais curto

Algoritmos de busca de caminho mais curto

Python SELF PT
Nível 56 , Lição 3
Disponível

9.1 Princípios de funcionamento do algoritmo de Dijkstra

O algoritmo de Dijkstra é um algoritmo para encontrar os caminhos mais curtos de um vértice inicial para todos os outros vértices em um grafo com pesos de arestas não negativos. O algoritmo usa uma abordagem gulosa, escolhendo em cada passo o vértice com a menor distância conhecida do vértice inicial e atualizando as distâncias para os vértices vizinhos.

Passos do algoritmo:

1. Inicialização:

  • Defina a distância até o vértice inicial como 0.
  • Defina a distância para todos os outros vértices como infinito.
  • Crie um conjunto de vértices não visitados.

2. Escolha do vértice atual:

  • Escolha um vértice não visitado com a menor distância (vértice inicial no primeiro passo).

3. Atualização de distâncias:

  • Para cada vértice vizinho do vértice atual, se o novo caminho através do vértice atual for mais curto que o caminho conhecido, atualize a distância até esse vértice.

4. Marque o vértice atual como visitado:

  • Remova o vértice atual do conjunto de vértices não visitados.

5. Repita os passos 2-4 até que todos os vértices sejam visitados ou que o vértice de destino seja alcançado.

Complexidade de tempo e espaço do algoritmo de Dijkstra:

Complexidade de tempo:

O((V + E) log V) ao usar uma fila de prioridade (por exemplo, heap de Fibonacci), onde V é o número de vértices e E é o número de arestas.

O(V^2) ao usar uma lista simples para armazenar distâncias.

Complexidade de espaço:

O(V) para armazenar distâncias e predecessores (para reconstruir o caminho).

9.2 Implementação do algoritmo de Dijkstra

A implementação do algoritmo de Dijkstra é longa, mas bem simples. Recomendo que você tente entendê-la. Se não compreender, volte um pouco acima e releia os passos principais do algoritmo.

Exemplo de implementação do algoritmo de Dijkstra usando uma fila de prioridade (heap):


import heapq

def dijkstra(graph, start):
    # Inicialização
    distances = {vertex: float('infinity') for vertex in graph}
    distances[start] = 0
    priority_queue = [(0, start)]
    parents = {vertex: None for vertex in graph}
            
    while priority_queue:
        current_distance, current_vertex = heapq.heappop(priority_queue)
            
        # Se a distância atual for maior que a registrada, ignore o vértice
        if current_distance > distances[current_vertex]:
            continue
            
        # Atualização das distâncias dos vértices vizinhos
        for neighbor, weight in graph[current_vertex].items():
            distance = current_distance + weight
            
            # Se for encontrado um caminho mais curto para o vértice vizinho
            if distance < distances[neighbor]:
                distances[neighbor] = distance
                parents[neighbor] = current_vertex
                heapq.heappush(priority_queue, (distance, neighbor))
            
    return distances, parents
            
# Exemplo de uso:
graph = {
    'A': {'B': 1, 'C': 4},
    'B': {'A': 1, 'C': 2, 'D': 5},
    'C': {'A': 4, 'B': 2, 'D': 1},
    'D': {'B': 5, 'C': 1}
}
start_vertex = 'A'
distances, parents = dijkstra(graph, start_vertex)
print("Menores distâncias do vértice inicial:", distances)
print("Predecessores para reconstrução do caminho:", parents)

Saída:


Menores distâncias do vértice inicial: {'A': 0, 'B': 1, 'C': 3, 'D': 4}
Predecessores para reconstrução do caminho: {'A': None, 'B': 'A', 'C': 'B', 'D': 'C'}

9.3 Exemplos de problemas resolvidos com o algoritmo de Dijkstra

Exemplos clássicos de problemas resolvidos com o algoritmo de Dijkstra:

1. Otimização de rotas em redes de transporte

Encontrar o caminho mais curto entre pontos em uma rede de transporte (por exemplo, entre cidades).

Aplicação:

Sistemas de navegação, como o Google Maps, usam o algoritmo de Dijkstra para calcular rotas otimizadas.

2. Planejamento de rotas de entrega

Otimização de rotas para serviços de entrega de mercadorias, a fim de minimizar custos e tempo de entrega.

Aplicação:

Empresas de logística usam o algoritmo de Dijkstra para planejar rotas de entrega e reduzir os custos operacionais.

3. Gerenciamento de redes

Otimização do roteamento de pacotes de dados em redes de computadores para minimizar atrasos e aumentar a capacidade de transmissão.

Aplicação:

Protocolos de roteamento, como OSPF (Open Shortest Path First), usam o algoritmo de Dijkstra para encontrar os caminhos mais curtos nas redes.

4. Análise de redes sociais

Encontrar os caminhos mais curtos e medir a centralidade em grafos sociais (por exemplo, para encontrar os usuários mais influentes).

Aplicação:

Plataformas sociais analisam as conexões entre usuários para fornecer recomendações e análise de atividade de rede.

5. Jogos e mundos virtuais

Encontrar o caminho para personagens em mundos de jogos com obstáculos e níveis diferentes de dificuldade.

Aplicação:

Motores de jogos usam o algoritmo de Dijkstra para calcular o movimento de personagens e objetos em mundos virtuais.

6. Sistemas de gerenciamento de energia

Otimização da distribuição de energia em redes elétricas para minimizar perdas e garantir a confiabilidade dos fornecimentos.

Aplicação:

Empresas de energia elétrica usam o algoritmo de Dijkstra para otimizar rotas de transmissão de energia nas redes, visando minimizar perdas de energia e evitar sobrecargas.

Exemplo:

Em redes elétricas, cada nó representa uma subestação e as arestas são linhas de transmissão com diferentes níveis de resistência. O algoritmo de Dijkstra ajuda a encontrar o caminho com a menor resistência do ponto de origem de energia ao consumidor.

7. Sistemas de evacuação e planejamento de rotas

Otimização de rotas de evacuação em edifícios ou cidades para a rápida e segura saída de pessoas em casos de emergência.

Aplicação:

Arquitetos e engenheiros usam o algoritmo de Dijkstra para planejar rotas de evacuação, garantindo uma saída segura e rápida das pessoas de zonas perigosas.

Exemplo:

Em um prédio de apartamentos ou edifício de escritórios, nós do grafo representam salas e corredores, enquanto arestas representam os caminhos entre eles. O algoritmo de Dijkstra pode ser usado para encontrar o caminho mais curto de qualquer ponto do edifício até a saída mais próxima.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION