Localização do caminho mais curto - Algoritmo de Dijkstra

Índice

1. Introdução ao Algoritmo Dijkstra

 2. Abaixo, use C# e PHP para implementar o código de exemplo do algoritmo de Dijkstra:

2.1 Usando C# para implementar o código de exemplo do algoritmo de Dijkstra (algoritmo de Dijkstra)

2.2 Usando PHP para implementar o código de amostra do algoritmo de Dijkstra (algoritmo de Dijkstra)


1. Introdução ao Algoritmo Dijkstra

O algoritmo de Dijkstra é um algoritmo para resolver o problema do caminho mais curto de fonte única em um grafo direcionado ponderado. Ele começa em um nó e calcula o caminho mais curto desse nó para todos os outros nós.

A ideia básica do algoritmo de Dijkstra é começar do ponto inicial, expandir gradualmente novos nós e tentar atualizar a distância dos nós expandidos ao ponto inicial através desses nós. Em cada expansão, selecione o nó não expandido que está atualmente mais próximo do ponto inicial da expansão e use a distância do nó ao ponto inicial para atualizar a distância do nó expandido ao ponto inicial. Este processo é repetido até que todos os nós tenham sido expandidos.

Para implementar este algoritmo, é necessário usar um array para registrar a distância de cada nó ao ponto inicial, um array para registrar se cada nó foi expandido e um array bidimensional para registrar o peso de cada aresta. no gráfico. A complexidade de tempo do algoritmo é O(V^2), onde V representa o número de nós.

O algoritmo de Dijkstra pode ser otimizado por uma fila de prioridade, reduzindo a complexidade do tempo para O(E log V), onde E representa o número de arestas. O nó com a menor distância do ponto inicial é armazenado na fila de prioridade, e o nó com a menor distância na fila de prioridade é selecionado para expansão cada vez que é expandido. Este algoritmo é conhecido como algoritmo de Dijkstra com implementação de fila prioritária.

Resumindo, o algoritmo de Dijkstra é um algoritmo eficiente e comumente usado para resolver o problema do caminho mais curto de fonte única e é amplamente utilizado em roteamento de rede, navegação em mapas e outros campos.

 2. Abaixo, use C# e PHP para implementar o código de exemplo do algoritmo de Dijkstra:

2.1 Usando C# para implementar o código de exemplo do algoritmo de Dijkstra (algoritmo de Dijkstra)

A seguir está um exemplo de código que implementa o algoritmo de Dijkstra usando C#. Neste exemplo, usamos uma matriz bidimensional graphpara representar o grafo ponderado direcionado, onde graph[i][j]representa o peso da aresta do nó i ao nó j; usamos uma matriz unidimensional distpara registrar o menor comprimento do caminho de cada nó até o ponto inicial point; Use um array booleano visitedpara registrar se cada nó foi visitado.

usando o sistema;

class DijkstraAlgorithmDemo
{     static void Main(string[] args)     {         int[][] gráfico = new int[][]         {             new int[] {0, 10, 3, int.MaxValue},             new int[] {int. MaxValue, 0, 1, 2},             novo int[] {int.MaxValue, 4, 0, 8},             novo int[] {int.MaxValue, int.MaxValue, int.MaxValue, 0}         };








        int startNode = 0;
        int[] dist = new int[grafo.Comprimento];
        bool[] visitado = novo bool[graph.Length];

        for (int i = 0; i < gráfico.Comprimento; i++)
        {             dist[i] = int.MaxValue;             visitado[i] = falso;         }


        dist[startNode] = 0;

        for (int contagem = 0; contagem < gráfico.Comprimento - 1; contagem++)
        {             int u = MinDistance(dist, visitado);

            visitado[u] = verdadeiro;

            for (int v = 0; v < gráfico.Comprimento; v++)
            {                 if (!visited[v] && gráfico[u][v] != int.MaxValue && dist[u] != int.MaxValue && dist[u ] + gráfico[u][v] < dist[v])                 {                     dist[v] = dist[u] + gráfico[u][v];                 }         }             }





        Console.WriteLine("O caminho mais curto do nó ao ponto inicial:");

        for (int i = 0; i < graph.Length; i++)
        {             if (dist[i] == int.MaxValue)             {                 Console.WriteLine($"{i} -> 起点: 不可达");             }             else             {                 Console.WriteLine($"{i} -> Exemplo: {dist[i]}");             }     }         }









    static int MinDistance(int[] dist, bool[] visitado)
    {         int minDist = int.MaxValue;         int minIndex = -1;

        for (int v = 0; v < dist.Length; v++)
        {             if (!visited[v] && dist[v] <= minDist)             {                 minDist = dist[v];                 índicemin = v;             }         }





        return minIndex;
    }
}
 

Neste código de exemplo, primeiro definimos uma matriz bidimensional graphque representa um gráfico ponderado direcionado. Em seguida, um array unidimensional diste um array booleano visitedsão definidos para registrar o comprimento do caminho mais curto de cada nó até o ponto inicial e se o nó foi visitado. A seguir, inicializamos disto array e visitedo array e definimos a distância do ponto inicial como 0.

A seguir, usamos um loop para expandir cada nó por vez e atualizar sua distância da origem. Em cada expansão, selecionamos o nó não expandido que está atualmente mais próximo do ponto inicial da expansão e usamos a distância do nó ao ponto inicial para atualizar a distância do nó expandido ao ponto inicial. Quando todos os nós foram expandidos, disto comprimento do caminho mais curto de cada nó até o ponto inicial é registrado na matriz.

Finalmente, geramos o comprimento do caminho mais curto de cada nó até a origem no console.

2.2 Usando PHP para implementar o código de amostra do algoritmo de Dijkstra (algoritmo de Dijkstra)

A seguir está um exemplo de implementação de código do algoritmo de Dijkstra usando PHP. Neste exemplo, usamos uma matriz bidimensional $graphpara representar o grafo ponderado direcionado, onde $graph[$i][$j]representa o peso da aresta do nó i ao nó j; usamos uma matriz unidimensional $distpara registrar o menor comprimento do caminho de cada nó até o ponto inicial point; Use um array booleano $visitedpara registrar se cada nó foi visitado.

<?php

$gráfico = array(
    array(0, 10, 3, INF),
    array(INF, 0, 1, 2),
    array(INF, 4, 0, 8),
    array(INF, INF, INF, 0)
);

$startNode = 0;
$dist = array();
$visitado = array();

for ($i = 0; $i < contagem($gráfico); $i++) {     $dist[$i] = INF;     $visitado[$i] = falso; }


$dist[$startNode] = 0;

for ($count = 0; $count < count($graph) - 1; $count++) {     $u = minDistance($dist, $visited);

    $visitado[$u] = verdadeiro;

    for ($v = 0; $v < contagem($graph); $v++) {         if (!$visited[$v] && $graph[$u][$v] != INF && $dist[$u] != INF && $dist[$u] + $graph[$u][$v] < $dist[$v]) { $dist[$v] = $             dist[$u] + $graph[$u] [$v];         } }     }




echo "O caminho mais curto do nó até o ponto inicial:\n";

for ($i = 0; $i < count($graph); $i++) {     if ($dist[$i] == INF) {         echo "$i -> 起点: 不可达\n";     } else {         echo "$i -> 起点: {$dist[$i]}\n";     } }





function minDistance($dist, $visitado) {     $minDist = INF;     $minIndex = -1;

    for ($v = 0; $v < contagem($dist); $v++) {         if (!$visited[$v] && $dist[$v] <= $minDist) {             $minDist = $dist[$v ];             $minIndex = $v;         }     }




    return $minIndex;
}

?>
 

Neste código de exemplo, primeiro definimos uma matriz bidimensional $graphque representa um gráfico ponderado direcionado. Em seguida, um array unidimensional $diste um array booleano $visitedsão definidos para registrar o comprimento do caminho mais curto de cada nó até o ponto inicial e se o nó foi visitado. A seguir, inicializamos $disto array e $visitedo array e definimos a distância do ponto inicial como 0.

A seguir, usamos um loop para expandir cada nó por vez e atualizar sua distância da origem. Em cada expansão, selecionamos o nó não expandido que está atualmente mais próximo do ponto inicial da expansão e usamos a distância do nó ao ponto inicial para atualizar a distância do nó expandido ao ponto inicial. Quando todos os nós foram expandidos, $disto comprimento do caminho mais curto de cada nó até o ponto inicial é registrado na matriz.

Finalmente, geramos o comprimento do caminho mais curto de cada nó até a origem no console.

Acho que você gosta

Origin blog.csdn.net/beenles/article/details/121487982
Recomendado
Clasificación