Articulo de referencia

Algoritmo paralelo de ruta más corta desde un único origen

Un problema central en la teoría algorítmica de grafos es el problema del camino más corto . Una de las generalizaciones del problema del camino más corto se conoce como el prob...

Un problema central en la teoría algorítmica de grafos es el problema del camino más corto . Una de las generalizaciones del problema del camino más corto se conoce como el problema de los caminos más cortos de origen único (SSSP) , que consiste en encontrar los caminos más cortos desde un vértice de origen.s{\displaystyle s}a todos los demás vértices del grafo. Existen algoritmos secuenciales clásicos que resuelven este problema, como el algoritmo de Dijkstra . En este artículo, sin embargo, presentamos dos algoritmos paralelos que lo resuelven.

Otra variación del problema es el problema de los caminos más cortos entre todos los pares (APSP, por sus siglas en inglés), que también tiene enfoques paralelos: Algoritmo paralelo de caminos más cortos entre todos los pares .

Definición del problema

DejarGRAMO=(V,mi){\displaystyle G=(V,E)}ser un grafo dirigido con|V|=norte{\displaystyle |V|=n}nodos y|mi|=metro{\displaystyle |E|=m}bordes. Dejas{\displaystyle s}ser un vértice distinguido (llamado "fuente") ydo{\displaystyle c}sea ​​una función que asigne un peso real no negativo a cada arista. El objetivo del problema de los caminos más cortos desde una única fuente es calcular, para cada vérticev{\displaystyle v}accesible desdes{\displaystyle s}, el peso de una ruta de peso mínimo desdes{\displaystyle s}av{\displaystyle v}, denotado pordistrito(s,v){\displaystyle \operatorname {dist} (s,v)}y abreviadodistrito(v){\displaystyle \operatorname {dist} (v)}El peso de un camino es la suma de los pesos de sus aristas. Establecemosdistrito(,v):={\displaystyle \operatorname {dist} (u,v):=\infty }siv{\displaystyle v}es inaccesible desde{\displaystyle u}. [ 1 ]

Los algoritmos de ruta más corta secuencial suelen aplicar métodos de etiquetado iterativos basados ​​en el mantenimiento de una distancia tentativa para todos los nodos;carpa(v){\displaystyle \operatorname {tent} (v)}siempre es{\displaystyle \infty }o el peso de algún camino desdes{\displaystyle s}av{\displaystyle v}y por lo tanto un límite superior endistrito(v){\displaystyle \operatorname {dist} (v)}Las distancias tentativas se mejoran realizando relajaciones de borde, es decir, para un borde(v,w)mi{\displaystyle (v,w)\in E} el algoritmo establececarpa(w):=min{carpa(w),carpa(v)+do(v,w)}{\displaystyle \operatorname {tent} (w):=\min\{\operatorname {tent} (w),\operatorname {tent} (v)+c(v,w)\}}. [ 1 ]

Para todos los algoritmos paralelos, asumiremos un modelo PRAM con lecturas y escrituras concurrentes.

algoritmo de pasos delta

El algoritmo de pasos delta es un algoritmo de corrección de etiquetas, lo que significa que la distancia tentativa de un vértice se puede corregir varias veces mediante relajaciones de aristas hasta el último paso del algoritmo, cuando todas las distancias tentativas quedan fijas.

El algoritmo mantiene nodos elegibles con distancias tentativas en una matriz de cubetas, cada una de las cuales representa un rango de distancia de tamañoΔ{\displaystyle \Delta }Durante cada fase, el algoritmo elimina todos los nodos del primer cubo no vacío y relaja todos los bordes salientes de peso máximoΔ{\displaystyle \Delta }. Los bordes de mayor peso solo se relajan después de que sus respectivos nodos iniciales estén firmemente establecidos. [ 1 ] El parámetro Δ{\displaystyle \Delta }es un número real positivo que también se denomina "ancho de paso" o "ancho de cubeta". [ 1 ]

El paralelismo se obtiene eliminando simultáneamente todos los nodos del primer cubo no vacío y relajando sus bordes de luz salientes en una sola fase. Si un nodov{\displaystyle v}ha sido eliminado del cubo actualB[i]{\displaystyle B[i]}con un valor de distancia no final entonces, en alguna fase posterior,v{\displaystyle v}eventualmente será reinsertado enB[i]{\displaystyle B[i]}y los bordes de luz salientes dev{\displaystyle v} se volverán a relajar. Los bordes pesados ​​restantes que emanan de todos los nodos que se han eliminado deB[i]{\displaystyle B[i]}hasta ahora se han relajado de una vez por todas cuandoB[i]{\displaystyle B[i]}finalmente queda vacío. Posteriormente, el algoritmo busca el siguiente cubo no vacío y procede como se describió anteriormente. [ 1 ]

El peso máximo de la ruta más corta para el nodo de origens{\displaystyle s}se define comoL(s):=máximo{distrito(s,v):distrito(s,v)<}{\displaystyle L(s):=\max\{\operatorname {dist} (s,v):\operatorname {dist} (s,v)<\infty \}}, abreviadoL{\displaystyle L}. [ 1 ] Además, el tamaño de un camino se define como el número de aristas en el camino.

Distinguimos los bordes ligeros de los bordes pesados, donde los bordes ligeros tienen un peso máximoΔ{\displaystyle \Delta } y los bordes pesados ​​tienen un peso mayor queΔ{\displaystyle \Delta }.

A continuación se presenta el algoritmo de pasos delta en pseudocódigo:

1 por cadavV{\displaystyle v\in V}hacercarpa(v):={\displaystyle \operatorname {tent} (v):=\infty } 2 rmilaincógnita(s,0){\displaystyle relax(s,0)}; (*Insertar nodo de origen con distancia 0*) 3 mientras¬ismimetropagty(B){\displaystyle \lnot isEmpty(B)}hacer (*Fase A: Algunos nodos en cola quedaron (a)*) 4 i:=min{j0:B[j]}{\displaystyle i:=\min\{j\geq 0:B[j]\neq \emptyset \}} (*Cubo no vacío más pequeño (b)*) 5 R:={\displaystyle R:=\emptyset } (*Aún no se han eliminado nodos para el bucket B[i]*) 6 mientrasB[i]{\displaystyle B[i]\neq \emptyset }hacer (*Nueva fase (c)*) 7 Rmiq:=FinortedRmiqmists(B[i],ligramoht){\displaystyle Req:=findRequests(B[i],light)} (*Crear solicitudes para bordes claros (d)*) 8 R:=RB[i]{\displaystyle R:=R\cup B[i]} (*Recuerde los nodos eliminados (e)*) 9 B[i]:={\displaystyle B[i]:=\emptyset } (*Cubo actual vacío*) 10 rmilaincógnitaRmiqmists(Rmiq){\displaystyle relaxRequests(Req)} (*Realice relajaciones, los nodos pueden (re)entrar en B[i] (f)*) 11 Rmiq:=FinortedRmiqmists(R,hmiavy){\displaystyle Req:=findRequests(R,heavy)} (*Crear solicitudes para bordes gruesos (g)*) 12 rmilaincógnitaRmiqmists(Rmiq){\displaystyle relaxRequests(Req)} (*Las relajaciones no recargarán B[i] (h)*) 13 14 funciónFinortedRmiqmists(V,kinorted:{luz,pesado}){\displaystyle findRequests(V',kind:\{{\text{light}},{\text{heavy}}\})}:conjunto de solicitud 15 regresos{(w,carpa(v)+do(v,w)):vV(v,w)miamable}{\displaystyle \{(w,\operatorname {tent} (v)+c(v,w)):v\in V'\land (v,w)\in E_{\text{kind}}\}} 16 17 procedimientormilaincógnitaRmiqmists(Rmiq){\displaystyle relaxRequests(Req)} 18 por cada uno(w,incógnita)Rmiq{\displaystyle (w,x)\in Req}hacerrmilaincógnita(w,incógnita){\displaystyle relax(w,x)} 19 20 procedimientormilaincógnita(w,incógnita){\displaystyle relax(w,x)} (*Insertar o mover w en B siincógnita<carpa(w){\displaystyle x<\operatorname {tent} (w)}*) 21 siincógnita<carpa(w){\displaystyle x<\operatorname {tent} (w)}entonces 22 B[carpa(w)/Δ]:=B[carpa(w)/Δ]{w}{\displaystyle B[\lfloor \operatorname {tent} (w)/\Delta \rfloor ]:=B[\lfloor \operatorname {tent} (w)/\Delta \rfloor ]\setminus \{w\}} (*Si está dentro, retírelo del cubo viejo*) 23 B[incógnita/Δ]:=B[incógnita/Δ]{w}{\displaystyle B[\lfloor x/\Delta \rfloor ]:=B[\lfloor x/\Delta \rfloor ]\cup \{w\}} (*Insertar en un nuevo depósito*) 24 carpa(w):=incógnita{\displaystyle \operatorname {tent} (w):=x}

Ejemplo

Gráfico de ejemplo

A continuación se describe paso a paso la ejecución del algoritmo para un pequeño ejemplo de grafo. El vértice de origen es el vértice A yΔ{\displaystyle \Delta }es igual a 3.

Al inicio del algoritmo, todos los vértices, excepto el vértice de origen A, tienen distancias tentativas infinitas.

BaldeB[0]{\displaystyle B[0]}tiene rango[0,2]{\displaystyle [0,2]}, baldeB[1]{\displaystyle B[1]}tiene rango[3,5]{\displaystyle [3,5]}y cuboB[2]{\displaystyle B[2]}tiene rango[6,8]{\displaystyle [6,8]}.

El cuboB[0]{\displaystyle B[0]}Contiene el vértice A. Todos los demás cubos están vacíos.

El algoritmo relaja todos los bordes de luz incidentes aB[0]{\displaystyle B[0]}, que son las aristas que conectan A con B, G y E.

Los vértices B, G y E se insertan en el cubo.B[1]{\displaystyle B[1]}. DesdeB[0]{\displaystyle B[0]}Todavía está vacío, el borde grueso que conecta A con D también está relajado.

Ahora los bordes de luz incidentes aB[1]{\displaystyle B[1]}están relajados. El vértice C se inserta en el cuboB[2]{\displaystyle B[2]}Desde ahoraB[1]{\displaystyle B[1]}Si está vacío, el borde grueso que conecta E con F puede relajarse.

En el siguiente paso, el cuboB[2]{\displaystyle B[2]}Se examina, pero no conlleva ninguna modificación de las distancias tentativas.

El algoritmo finaliza.

Tiempo de ejecución

Como se mencionó anteriormente,L{\displaystyle L}es el peso máximo del camino más corto.

Llamemos a un camino con un peso total como máximoΔ{\displaystyle \Delta }y sin repeticiones de bordes aΔ{\displaystyle \Delta }-camino.

DejardoΔ{\displaystyle C_{\Delta }}denota el conjunto de todos los pares de nodos,v{\displaystyle \langle u,v\rangle }conectados por algúnΔ{\displaystyle \Delta }-camino(,,v){\displaystyle (u,\dots ,v)} y dejarnorteΔ:=|doΔ|{\displaystyle n_{\Delta }:=|C_{\Delta }|}. De manera similar, definadoΔ+{\displaystyle C_{\Delta +}}como el conjunto de tríos,v,v{\displaystyle \langle u,v',v\rangle }de tal manera que,vdoΔ{\displaystyle \langle u,v'\rangle \in C_{\Delta }}y(v,v){\displaystyle (v',v)}es un borde ligero y dejametroΔ:=|doΔ+|{\displaystyle m_{\Delta }:=|C_{\Delta +}|}.

El algoritmo de pasos delta secuenciales necesita como máximoO(norte+metro+norteΔ+metroΔ+L/Δ){\displaystyle {\mathcal {O}}(n+m+n_{\Delta }+m_{\Delta }+L/\Delta )}operaciones. Una paralelización simple se ejecuta en tiempoO(LΔdΔregistronorte){\displaystyle {\mathcal {O}}\left({\frac {L}{\Delta }}\cdot d\ell _{\Delta }\log n\right)}. [ 1 ]

Si tomamosΔ=Θ(1/d){\displaystyle \Delta =\Theta (1/d)}para gráficos con grado máximod{\displaystyle d}y pesos de borde aleatorios distribuidos uniformemente en[0,1]{\displaystyle [0,1]}, la versión secuencial del algoritmo necesitaO(norte+metro+dL){\displaystyle {\mathcal {O}}(n+m+dL)}tiempo promedio total y una paralelización simple toma en promedioO(d2Lregistro2norte){\displaystyle {\mathcal {O}}(d^{2}L\log ^{2}n)}. [ 1 ]

Gráfico 500

El tercer núcleo computacional del benchmark Graph 500 ejecuta un cálculo de ruta más corta desde un único origen. [ 2 ] La implementación de referencia del benchmark Graph 500 utiliza el algoritmo de pasos delta para este cálculo.

Algoritmo de pasos de radio

Para el algoritmo de pasos de radio, debemos asumir que nuestro gráficoGRAMO{\displaystyle G}no tiene dirección.

La entrada al algoritmo es un grafo no dirigido ponderado, un vértice de origen y un valor de radio de destino para cada vértice, dado como una función.r:VR+{\displaystyle r:V\rightarrow \mathbb {R} _{+}}. [ 3 ] El algoritmo visita los vértices en distancia creciente desde la fuentes{\displaystyle s}En cada pasoi{\displaystyle i}, el incremento de radio aumenta el radio centrado ens{\displaystyle s}dedi1{\displaystyle d_{i-1}}adi{\displaystyle d_{i}}y resuelve todos los vérticesv{\displaystyle v}en el anillodi1<d(s,v)di{\displaystyle d_{i-1}<d(s,v)\leq d_{i}}. [ 3 ]

A continuación se muestra el algoritmo de incremento de radio en pseudocódigo:

Entrada : Un gráficoGRAMO=(V,mi,w){\displaystyle G=(V,E,w)}radios de vérticer(){\displaystyle r(\cdot )}y un nodo fuentes{\displaystyle s}Salida : Las distancias del gráficoδ(){\displaystyle \delta (\cdot )}des{\displaystyle s}. 1 δ()+{\displaystyle \delta (\cdot )\leftarrow +\infty },δ(s)0{\displaystyle \delta (s)\leftarrow 0} 2 por cada unovnorte(s){\displaystyle v\in N(s)}hacerδ(v)w(s,v){\displaystyle \delta (v)\leftarrow w(s,v)},S0{s}{\displaystyle S_{0}\leftarrow \{s\}},i1{\displaystyle i\leftarrow 1} 3 mientras|Si1|<|V|{\displaystyle |S_{i-1}|<|V|}hacer 4 diminvVSi1{δ(v)+r(v)}{\displaystyle d_{i}\leftarrow \min _{v\in V\setminus S_{i-1}}\{\delta (v)+r(v)\}} 5 repetir 6 para cada unoVSi1{\displaystyle u\in V\setminus S_{i-1}}calleδ()di{\displaystyle \delta (u)\leq d_{i}}hacer 7 por cadavnorte()Si1{\displaystyle v\in N(u)\setminus S_{i-1}}hacer 8 δ(v)min{δ(v),δ()+w(,v)}{\displaystyle \delta (v)\leftarrow \min\{\delta (v),\delta (u)+w(u,v)\}} 9 hasta que noδ(v)di{\displaystyle \delta (v)\leq d_{i}}fue actualizado 10 Si={v|δ(v)di}{\displaystyle S_{i}=\{v\;|\;\delta (v)\leq d_{i}\}} 11 i=i+1{\displaystyle i=i+1} 12 regresosδ(){\displaystyle \delta (\cdot )}

A pesar deSV{\displaystyle S\subseteq V}, definirnorte(S)=S{vVd(,v)mi}{\displaystyle N(S)=\bigcup _{u\in S}\{v\in V\mid d(u,v)\in E\}}ser el conjunto de vecinos de S. Durante la ejecución de la búsqueda en anchura estándar o el algoritmo de Dijkstra , la frontera es el conjunto de vecinos de todos los vértices visitados. [ 3 ]

En el algoritmo de pasos de radio, una nueva distancia de rondadi{\displaystyle d_{i}}se decide en cada ronda con el objetivo de limitar el número de subpasos. El algoritmo toma un radior(v){\displaystyle r(v)}para cada vértice y selecciona undi{\displaystyle d_{i}}en el pasoi{\displaystyle i}tomando el mínimoδ(v)+r(v){\displaystyle \delta (v)+r(v)}en generalv{\displaystyle v}en la frontera (Línea 4).

Las líneas 5-9 luego ejecutan los subpasos de Bellman-Ford hasta que todos los vértices con radio menor quedi{\displaystyle d_{i}}están establecidos. Vértices dentrodi{\displaystyle d_{i}}Luego se añaden al conjunto visitado.Si{\displaystyle S_{i}}. [ 3 ]

Ejemplo

Gráfico de ejemplo

A continuación se describe paso a paso la ejecución del algoritmo para un pequeño ejemplo de grafo. El vértice de origen es el vértice A y el radio de cada vértice es igual a 1.

Al comienzo del algoritmo, todos los vértices, excepto el vértice de origen A, tienen distancias tentativas infinitas, denotadas porδ{\displaystyle \delta }en el pseudocódigo.

Todos los vecinos de A están relajados yS0={A}{\displaystyle S_{0}=\{A\}}.

La variabled1{\displaystyle d_{1}}se elige que sea igual a 4 y los vecinos de los vértices B, E y G se relajan.S1={A,B,mi,GRAMO}{\displaystyle S_{1}=\{A,B,E,G\}}

La variabled2{\displaystyle d_{2}}se elige que sea igual a 6 y no se modifican los valores.S2={A,B,do,D,mi,GRAMO}{\displaystyle S_{2}=\{A,B,C,D,E,G\}}.

La variabled3{\displaystyle d_{3}}se elige que sea igual a 9 y no se modifican los valores.S3={A,B,do,D,mi,F,GRAMO}{\displaystyle S_{3}=\{A,B,C,D,E,F,G\}}.

El algoritmo finaliza.

Tiempo de ejecución

Después de una fase de preprocesamiento, el algoritmo de pasos de radio puede resolver el problema SSSP enO(metroregistronorte){\displaystyle {\mathcal {O}}(m\log n)}trabajo y O(nortepagregistronorteregistropagL){\displaystyle {\mathcal {O}}({\frac {n}{p}}\log n\log pL)}profundidad, parapagnorte{\displaystyle p\leq {\sqrt {n}}}. Además, la fase de preprocesamiento lleva O(metroregistronorte+nortepag2){\displaystyle {\mathcal {O}}(m\log n+np^{2})}trabajo y O(pag2){\displaystyle {\mathcal {O}}(p^{2})}profundidad oO(metroregistronorte+nortepag2registronorte){\displaystyle {\mathcal {O}}(m\log n+np^{2}\log n)}trabajo y O(pagregistropag){\displaystyle {\mathcal {O}}(p\log p)}profundidad. [ 3 ]

Referencias

  1. 1 2 3 4 5 6 7 8 Meyer, U.; Sanders, P. (2003-10-01). "Δ-stepping: un algoritmo de ruta más corta paralelizable" . Journal of Algorithms . Simposio Europeo de Algoritmos de 1998. 49 (1): 114– 152. doi : 10.1016/S0196-6774(03)00076-2 . ISSN 0196-6774 . 
  2. "Gráfico 500" . 9 de marzo de 2017.
  3. 1 2 3 4 5 Blelloch, Guy E.; Gu, Yan; Sun, Yihan; Tangwongsan, Kanat (2016). "Parallel Shortest Paths Using Radius Stepping". Actas del 28.º Simposio ACM sobre Paralelismo en Algoritmos y Arquitecturas . Nueva York, Nueva York, EE. UU.: ACM Press. págs. 443–454 . doi : 10.1145/2935764.2935765 . ISBN  978-1-4503-4210-0.