Búsqueda del camino más corto: algoritmo de Dijkstra

Tabla de contenido

1. Introducción al algoritmo de Dijkstra

 2. A continuación, utilice C# y PHP para implementar el código de muestra del algoritmo de Dijkstra:

2.1 Uso de C# para implementar el código de muestra del algoritmo de Dijkstra (algoritmo de Dijkstra)

2.2 Usar PHP para implementar el código de muestra del algoritmo de Dijkstra (algoritmo de Dijkstra)


1. Introducción al algoritmo de Dijkstra

El algoritmo de Dijkstra es un algoritmo para resolver el problema del camino más corto de una sola fuente en un gráfico dirigido ponderado. Comienza desde un nodo y calcula la ruta más corta desde ese nodo a todos los demás nodos.

La idea básica del algoritmo de Dijkstra es comenzar desde el punto de partida, expandir gradualmente nuevos nodos e intentar actualizar la distancia desde los nodos expandidos hasta el punto de partida a través de estos nodos. En cada expansión, seleccione el nodo no expandido que esté actualmente más cercano al punto inicial de la expansión y use la distancia desde el nodo hasta el punto inicial para actualizar la distancia desde el nodo expandido hasta el punto inicial. Este proceso se repite hasta que se hayan expandido todos los nodos.

Para implementar este algoritmo, es necesario utilizar una matriz para registrar la distancia desde cada nodo hasta el punto inicial, una matriz para registrar si cada nodo se ha expandido y una matriz bidimensional para registrar el peso de cada borde. en el gráfico. La complejidad temporal del algoritmo es O (V ^ 2), donde V representa el número de nodos.

El algoritmo de Dijkstra se puede optimizar mediante una cola de prioridad, reduciendo la complejidad del tiempo a O (E log V), donde E representa el número de aristas. El nodo con la distancia más pequeña desde el punto de inicio se almacena en la cola de prioridad, y el nodo con la distancia más pequeña en la cola de prioridad se selecciona para expandirse cada vez que se expande. Este algoritmo se conoce como algoritmo de Dijkstra con implementación de cola prioritaria.

En resumen, el algoritmo de Dijkstra es un algoritmo eficiente y de uso común para resolver el problema de la ruta más corta de una sola fuente, y se usa ampliamente en enrutamiento de redes, navegación de mapas y otros campos.

 2. A continuación, utilice C# y PHP para implementar el código de muestra del algoritmo de Dijkstra:

2.1 Uso de C# para implementar el código de muestra del algoritmo de Dijkstra (algoritmo de Dijkstra)

El siguiente es un código de muestra que implementa el algoritmo de Dijkstra usando C#. En este ejemplo, usamos una matriz bidimensional graphpara representar el gráfico ponderado dirigido, donde graph[i][j]representa el peso del borde desde el nodo i al nodo j; usamos una matriz unidimensional distpara registrar la longitud del camino más corto desde cada nodo hasta el punto inicial. punto; Utilice una matriz booleana visitedpara registrar si se ha visitado cada nodo.

usando Sistema;

clase DijkstraAlgorithmDemo
{     static void Main(cadena[] args)     {         int[][] gráfico = nuevo int[][]         {             nuevo int[] {0, 10, 3, int.MaxValue},             nuevo int[] {int. MaxValue, 0, 1, 2},             nuevo int[] {int.MaxValue, 4, 0, 8},             nuevo int[] {int.MaxValue, int.MaxValue, int.MaxValue, 0}         };








        int nodoinicio = 0;
        int[] dist = nuevo int[graph.Length];
        bool[] visitado = nuevo bool[graph.Length];

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


        dist[startNode] = 0;

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

            visitado[u] = verdadero;

            for (int v = 0; v < graph.Length; v++)
            {                 if (!visited[v] && graph[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("La ruta más corta desde el nodo hasta el punto de partida:");

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









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

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





        devolver índice mínimo;
    }
}
 

En este código de ejemplo, primero definimos una matriz bidimensional graphque representa un gráfico ponderado dirigido. Luego, se definen una matriz unidimensional disty una matriz booleana para registrar la longitud de la ruta más corta desde cada nodo hasta el punto de partida y si el nodo ha sido visitado. visitedA continuación, inicializamos distla matriz y visitedla matriz, y establecemos la distancia desde el punto inicial en 0.

A continuación, utilizamos un bucle para expandir cada nodo por turno y actualizar su distancia desde el origen. En cada expansión, seleccionamos el nodo no expandido que actualmente está más cerca del punto inicial de la expansión y usamos la distancia desde el nodo al punto inicial para actualizar la distancia desde el nodo expandido al punto inicial. Cuando se han expandido todos los nodos, distla longitud de la ruta más corta desde cada nodo hasta el punto inicial se registra en la matriz.

Finalmente, generamos la ruta más corta desde cada nodo hasta el origen en la consola.

2.2 Usar PHP para implementar el código de muestra del algoritmo de Dijkstra (algoritmo de Dijkstra)

La siguiente es una implementación de código de muestra del algoritmo de Dijkstra usando PHP. En este ejemplo, usamos una matriz bidimensional $graphpara representar el gráfico ponderado dirigido, donde $graph[$i][$j]representa el peso del borde desde el nodo i al nodo j; usamos una matriz unidimensional $distpara registrar la longitud del camino más corto desde cada nodo hasta el punto inicial. punto; Utilice una matriz booleana $visitedpara registrar si se ha visitado cada nodo.

<?php

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

$NodoInicio = 0;
$dist = matriz();
$visitado = matriz();

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


$dist[$startNode] = 0;

for ($cuenta = 0; $cuenta < cuenta($gráfico) - 1; $cuenta++) {     $u = minDistance($dist, $visitado);

    $visitado[$u] = verdadero;

    for ($v = 0; $v < count($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 "El camino más corto desde el nodo hasta el punto inicial:\n";

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





function distanciamin($dist, $visitado) {     $distanciamin = INF;     $índicemínimo = -1;

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




    devolver $minIndex;
}

?>
 

En este código de ejemplo, primero definimos una matriz bidimensional $graphque representa un gráfico ponderado dirigido. Luego, se definen una matriz unidimensional $disty una matriz booleana para registrar la longitud de la ruta más corta desde cada nodo hasta el punto de partida y si el nodo ha sido visitado. $visitedA continuación, inicializamos $distla matriz y $visitedla matriz, y establecemos la distancia desde el punto inicial en 0.

A continuación, utilizamos un bucle para expandir cada nodo por turno y actualizar su distancia desde el origen. En cada expansión, seleccionamos el nodo no expandido que actualmente está más cerca del punto inicial de la expansión y usamos la distancia desde el nodo al punto inicial para actualizar la distancia desde el nodo expandido al punto inicial. Cuando se han expandido todos los nodos, $distla longitud de la ruta más corta desde cada nodo hasta el punto inicial se registra en la matriz.

Finalmente, generamos la ruta más corta desde cada nodo hasta el origen en la consola.

Supongo que te gusta

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