Resolviendo el camino más corto en la teoría de grafos - enseñándote modelos matemáticos


Muchos amigos se encontrarán con el problema del camino más corto al aprender la teoría de grafos o el modelado matemático. Esta lección comenzará con cómo construir un gráfico y le enseñará el problema del camino más corto en la teoría de gráficos. Dependiendo del gráfico, presentaremos dos algoritmos diferentes: el algoritmo de Dijkstra y el algoritmo de Bellman-Ford.

¿Cómo hacer un dibujo?

  1. Gráficos en línea: https://csacademy.com/app/graph_editor/

  2. Trazado de MatLab:

    % 函数graph(s,t):可在 s 和 t 中的对应节点之间创建边,并生成一个图
    G1 = graph(s1, t1);
    plot(G1)  % plot函数用于MatLab中图的展示
    
    % 函数graph(s,t,w):可在 s 和 t 中的对应节点之间以w的权重创建边,并生成一个图
    G2 = graph(s2, t2);
    plot(G2, 'linewidth', 2)  % 设置线的宽度
    
    % 下面的命令是在画图后不显示坐标
    set( gca, 'XTick', [], 'YTick', [] ); 
    
    % 有权重的图(如 s = [1,2,3,4]; t = [2,3,1,1]; w = [3,8,9,2]; )
    G3 = graph(s3, t3, w)
    plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2)  % 同时展示权重
    set( gca, 'XTick', [], 'YTick', [] );  
    

Todos los gráficos anteriores son gráficos no dirigidos. Para hacer un gráfico dirigido, solo necesita cambiar el gráfico a un dígrafo.

Nota: El gráfico hecho por Matlab no es muy bonito, si hay pocos nodos, se recomienda usar gráficos en línea

algoritmo de ruta más corta

Algoritmo de Dijkstra - Algoritmo codicioso

  • Principio : divida los nodos en si son visitados o no, y aumente la ruta más corta entre los nodos visitados y los nodos no visitados cada vez.

  • Ámbito de aplicación : gráfico dirigido, gráfico no dirigido.

  • Contras : no puede manejar pesos negativos.

Algoritmo de Bellman‐Ford

  • Principio : El ciclo se utiliza para actualizar el peso, y cada ciclo, el algoritmo Bellman-Ford actualizará la información de todos los nodos. (Ya no se distinguen los nodos como visitados o no)

  • Ámbito de aplicación : se admiten gráficos dirigidos con pesos negativos , pero no se admiten gráficos con circuitos de peso negativo.

  • Contras : tiempo de ejecución más lento

solucionador de funciones matlab

Calcular el camino más corto

[P,d] = shortestpath(G,start,end [,'Method',algorithm] )  %注意:该函数matlab2015b之后才有哦

Función: Devuelve la ruta más corta desde el nodo inicial hasta el nodo final en el gráfico G

Parámetros de entrada:
(1) G - gráfico de entrada (objeto de gráfico - gráfico no dirigido | objeto de dígrafo - gráfico dirigido)
(2) nodo de inicio
(3) nodo de destino final
(4) [,'Método', algoritmo] es un parámetro opcional, indicando el algoritmo para calcular el camino más corto. Generalmente, no necesitamos configurarlo manualmente, el valor predeterminado es "automático". MatLab hará coincidir automáticamente el algoritmo correspondiente para nosotros

Parámetros de salida:
(1) P - el nodo por el que pasa el camino más corto
(2) d - la distancia más corta

Nota: Los nodos de gráficos en Matlab deben numerarse desde 1, por lo que todos los 0 deben cambiarse a 9

Devuelve la matriz de distancia entre dos puntos

d = distances(G [,'Method',algorithm])  %注意:该函数matlab2015b之后才有哦

Encuentra todos los puntos dentro de un rango dado

[nodeIDs,dist] = nearest(G,s,d [,'Method',algorithm])  %注意:该函数matlab2016a之后才有哦

Devuelve todos los nodos en el gráfico G que están dentro de la distancia d del nodo s.
nodeIDs son los nodos elegibles
Dist es la distancia de estos nodos desde s

Ven al ejemplo

tema

La siguiente figura muestra una red de tráfico de un solo sentido y los números al lado de cada arco indican el costo de pasar esta línea. Ahora, alguien quiere comenzar desde v1, pasar a v8 a través de esta red de tráfico y buscar la ruta de viaje que minimice el costo total.
Red de tráfico unidireccional

respuesta

  • código:
s = [1 1 1 2 3 3 4 5 5 5 5 6 6 7 9 9]; % 在 s 和 t 中的对应节点之间创建边
t = [2 3 4 5 2 4 6 4 6 7 8 5 7 8 5 8];
w = [6 3 1 1 2 2 10 6 4 3 6 10 2 4 2 3]; % 线路费用 —— 边的权重

G = digraph(s, t, w);  % 生成有向图
myplot = plot(G, 'EdgeLabel', G.Edges.Weight, 'linewidth', 2) % 通过MatLab画图
set( gca, 'XTick', [], 'YTick', [] );  % 画图后不显示坐标

[P,d] = shortestpath(G, 1, 8) % 求出最短路径(P)及其距离(d)
highlight(myplot, P, 'EdgeColor', 'r') % 高亮最短路径
  • Respuesta:
P 	=	1     3     2     5     8

d 	=	12
  • MatLab genera resultados gráficos:
    resultado de salida

Supongo que te gusta

Origin blog.csdn.net/qq_61539914/article/details/126330348
Recomendado
Clasificación