El principio del algoritmo de Dijkstra de ruta más corta es popular y detallado y el análisis de código de Matlab

1. Algoritmo de Dijkstra: una ruta corta entre dos vértices especificados

      La matriz de adyacencia entre diferentes puntos es un gráfico no dirigido, a (i, j) representa la distancia del punto i al punto j, si dos puntos no están conectados, se representa por infinito. El ejemplo específico se muestra en la siguiente tabla

       

       Según tengo entendido, el principio del algoritmo es convertir la búsqueda (complejidad n \ veces n \ veces n \ veces n \ cdots n = n ^ {n}) entre n nodos en la búsqueda (complejidad ) entre dos conjuntos de n nodos (conjunto de búsqueda y conjunto no buscado). El n \ veces nproceso específico: desde el punto de partida Al principio se adopta la estrategia del algoritmo codicioso, y cada vez que se atraviesa hasta el nodo adyacente del vértice más cercano al punto de partida y no ha sido visitado, hasta que se extiende hasta el punto final.

       Para ser más específico, como se muestra a continuación (diferente del caso del programa), encuentre todas las rutas más cortas desde el nodo 1 al nodo 6

         El algoritmo de Dijkstra ejecuta el proceso de animación.

       1. Empiece a buscar desde el nodo 1, coloque el nodo 1 en el conjunto de búsqueda P y coloque los nodos restantes 2, 3, 4, 5, 6 en el conjunto no buscado W

         

       2. Encuentre el conjunto de W que no se encuentra en el conjunto P 1 adyacente al conjunto desde el nodo más cercano (la distancia se puede ver en la figura, seis nodos correspondientes a 7,9 \ infty, \ infty14 7 es el más pequeño, une el nodo 2, actualiza los nodos 3, 4), agrega el nodo 2 más cercano a P y actualiza la distancia del nodo 1 a cada nodo. Aquí, actualiza la distancia más corta entre los nodos 3 y 4 conectados a 2:

         Dado que la distancia más corta del nodo 3: 1 → 2 es 7. A partir del nodo 2, la distancia más corta de 2 → 3 es 10. Por lo tanto, la ruta más corta entre los nodos 1 a 3 es una comparación de las rutas antiguas y nuevas.

          1 → 2 → 3: la distancia más corta original , 1 → 3: 9; el paso 2 genera la distancia más corta de la nueva ruta 7 + 10 = 17; por lo tanto, el valor mínimo es 9

         Dado que la distancia más corta del nodo 4: 1 → 2 es 7. A partir del nodo 2, la distancia más corta de 2 → 4 es 15. Por lo tanto, la ruta más corta entre los nodos 1 a 4 es una comparación de las rutas antiguas y nuevas.

          1 → 2 → 3: la distancia más corta original , 1 → 4 \ infty:; El paso 2 genera la distancia más corta de la nueva ruta 7 + 15 = 22; por lo tanto, el valor mínimo es 22

         

        3. Repita el paso 2 hasta el final (de la figura anterior, puede ver que las distancias correspondientes \ inftya los nodos 3, 4, 5 y 6 son las más pequeñas de 9, 22 y 14, agregue el nodo 3, actualice 4 y 6)

          

         (De la figura anterior, podemos ver \ inftyque 14 de 20, 14 es el más pequeño, agregue el nodo 6, actualice 5)

          

         (De la figura anterior, podemos ver que 20 es el más pequeño entre 20 y 23. Agregue el nodo 4 y actualice 5)

         

          Finalmente, se agrega 5. En este momento, el elemento de colección no encontrado es 0, ¡y el final!

Dos, código y análisis de Matlab

      Función principal:

        La función principal construye la matriz de adyacencia. Primero, encuentre la distancia del nodo 1 al 2, 3, 4, 5 y 6, luego encuentre la distancia del nodo 2 al 3, 4, 5, 6, y luego al nodo 6. Ejecute la subfunción dijkstra para encontrar la ruta más corta desde el nodo 1 al nodo 4 y la salida

clc;
close all
clear all
a=zeros(6); a(1,2)=50;a(1,4)=40;a(1,5)=25;a(1,6)=10; a(2,3)=15;
a(2,4)=20;a(2,6)=25; a(3,4)=10;a(3,5)=20; a(4,5)=10;a(4,6)=25; 
a(5,6)=55; 
a=a+a'; 
a(a==0)=inf; 
[distance,path]=dijkstra(a,1,4);
p=num2str(path);
sprintf('最短距离为%d\n具体路线为%s。',distance,p)

        Sub función:

function [mydistance,mypath]=dijkstra(a,sb,db);
% 输入:a—邻接矩阵(aij)是指i到j之间的距离,无向矩阵
% sb—起点的标号, db—终点的标号
% 输出:mydistance—短路的距离, mypath—短路的路径
n=size(a,1);         %找出节点个数n
visited(1:n)=0;      %构建初步的查找矩阵visited,0代表未查找,1代表查找过
distance(1:n)=inf;   %保存起点到各顶点的短距离
distance(sb)=0;      %从起点sb到起点的距离为0
parent(1:n)=0;       
for i=1:n-1                   %循环查找n-1次   
    temp=distance;            %将distance中的值赋给temp,避免运算时丢失原值
    id1=find(visited==1);     %查找已经标号的点
    temp(id1)=inf;            %已标号点的距离换成无穷
    [t,u]=min(temp);          %找标号值小的顶点
    visited(u)=1;             %标记已经标号的顶点
    id2=find(visited==0);     %查找未标号的顶点
    for v=id2                 
        if  a(u,v)+distance(u)<distance(v)
            distance(v)=distance(u)+a(u,v);  %修改标号值
            parent(v)=u;
        end
    end
end
mypath=[];
if parent(db)~=0   %如果存在路!
    t=db;
    mypath=[db];
    while t~=sb
        p=parent(t);
        mypath=[p mypath];
        t=p;
    end
end
mydistance=distance(db);
return

El código es un caso en el libro, ver Jiang Qiyuan para más detalles. Modelo matemático (Segunda edición) [M] // Modelo matemático (Segunda edición). Prensa de educación superior, 1987.

Supongo que te gusta

Origin blog.csdn.net/weixin_41971010/article/details/107666810
Recomendado
Clasificación