En teoría de grafos, un árbol de expansión mínima (MST)de un gráficoconyes un subgrafo de árbol deque contiene todos sus vértices y tiene un peso mínimo.
Los MST son herramientas útiles y versátiles que se utilizan en una amplia variedad de campos prácticos y teóricos. Por ejemplo, una empresa que busca abastecer a varias tiendas con un determinado producto desde un único almacén podría usar un MST que se origine en el almacén para calcular las rutas más cortas a cada tienda. En este caso, las tiendas y el almacén se representan como vértices y las conexiones viales entre ellos, como aristas. Cada arista está etiquetada con la longitud de la conexión vial correspondiente.
SiEn el caso sin ponderación de aristas, cada árbol de expansión posee el mismo número de aristas y, por lo tanto, el mismo peso. En el caso con ponderación de aristas , el árbol de expansión, cuya suma de los pesos de las aristas es la más baja entre todos los árboles de expansión de, se denomina árbol de expansión mínima (MST). No es necesariamente único. De manera más general, los grafos que no están necesariamente conectados tienen bosques de expansión mínima , que consisten en una unión de MST para cada componente conectado .
Como encontrar MST es un problema generalizado en la teoría de grafos, existen muchos algoritmos secuenciales para resolverlo. Entre ellos se encuentran los algoritmos de Prim , Kruskal y Borůvka , cada uno utilizando diferentes propiedades de los MST. Todos operan de manera similar: un subconjunto dese desarrolla iterativamente hasta que se descubre un MST válido. Sin embargo, dado que los problemas prácticos suelen ser bastante grandes (las redes de carreteras a veces tienen miles de millones de aristas), el rendimiento es un factor clave. Una opción para mejorarlo es paralelizando los algoritmos MST conocidos . [ 1 ]
El algoritmo de Prim
Este algoritmo utiliza la propiedad de corte de los MST. A continuación se proporciona una implementación sencilla en pseudocódigo de alto nivel :
dóndees un vértice aleatorio enrepetirveces encontrar el borde más ligerocalleperodevolver T
Cada arista se observa exactamente dos veces, es decir, al examinar cada uno de sus extremos. Cada vértice se examina exactamente una vez para un total deoperaciones aparte de la selección del borde más ligero en cada iteración del bucle. Esta selección a menudo se realiza utilizando una cola de prioridad (PQ). Para cada borde como máximo una operación decreaseKey ( amortizada en) se realiza y cada iteración del bucle realiza una operación deleteMin (). Por lo tanto, utilizando montículos de Fibonacci, el tiempo total de ejecución del algoritmo de Prim es asintóticamente en.
Es importante señalar que el bucle es inherentemente secuencial y no se puede paralelizar correctamente. Este es el caso, ya que el borde más ligero con un extremo eny enpodría cambiar con la adición de bordes aPor lo tanto, no se pueden realizar dos selecciones del borde más claro al mismo tiempo. Sin embargo, existen algunos intentos de paralelización .
Una posible idea es utilizarprocesadores para admitir el acceso PQ enen una máquina EREW-PRAM , [ 2 ] reduciendo así el tiempo total de ejecución a.
El algoritmo de Kruskal
El algoritmo MST de Kruskal utiliza la propiedad de ciclo de los MST. A continuación se proporciona una representación en pseudocódigo de alto nivel.
bosque con cada vértice en su propio subárbol para cadaen orden ascendente de peso siyen diferentes subárboles dedevolver T
Los subárboles dese almacenan en estructuras de datos de unión-búsqueda , por lo que es posible comprobar si dos vértices están o no en el mismo subárbol en amortizadodóndees la función inversa de Ackermann . Por lo tanto, el tiempo total de ejecución del algoritmo es de. Aquídenota la función inversa de Ackermann de valor único, para la cual cualquier entrada realista produce un número entero menor que cinco.
Enfoque 1: Paralelización del paso de ordenación
De forma similar al algoritmo de Prim, existen componentes en el enfoque de Kruskal que no pueden paralelizarse en su variante clásica. Por ejemplo, determinar si dos vértices están o no en el mismo subárbol es difícil de paralelizar, ya que dos operaciones de unión podrían intentar unir los mismos subárboles al mismo tiempo. En realidad, la única oportunidad de paralelización reside en el paso de ordenación. Como la ordenación es lineal en el caso óptimo enprocesadores, el tiempo total de ejecución se puede reducir a.
Enfoque 2: Filtro-Kruskal
Otro enfoque sería modificar el algoritmo original aumentandode forma más agresiva. Esta idea fue presentada por Osipov et al. [ 3 ] [ 4 ] La idea básica detrás de Filter-Kruskal es particionar las aristas de forma similar a quicksort y filtrar las aristas que conectan vértices que pertenecen al mismo árbol para reducir el costo de ordenación. A continuación se proporciona una representación en pseudocódigo de alto nivel.
filtroKruskal(): siKruskalThreshold: devolver kruskal() pivote = elegirAleatorio() ,dividir(, pivote) filtroKruskal() filtrar() filtroKruskal() devolver dividir(, pivote): para cada: si peso()pivote: demásdevolver (,) filtrar(): para cada: si find-set(u)encontrar-conjunto(v): devolver
El algoritmo Filter-Kruskal es más adecuado para la paralelización, ya que la ordenación, la partición y el filtrado tienen paralelismos intuitivamente sencillos en los que las aristas simplemente se dividen entre los núcleos.
El algoritmo de Borůvka
La idea principal detrás del algoritmo de Borůvka es la contracción de aristas . Una aristase contrae eliminando primerodesde el gráfico y luego redirigiendo cada aristaaEstas nuevas aristas conservan sus pesos originales. Si el objetivo no es solo determinar el peso de un MST, sino también qué aristas lo componen, debe tenerse en cuenta entre qué pares de vértices se contrajo una arista. Representación en pseudocódigo de alto nivel:
mientrasparamás ligeropara contratodevolver T
Es posible que las contracciones den lugar a múltiples aristas entre un par de vértices. La forma intuitiva de elegir la más ligera de ellas no es posible enSin embargo, si todas las contracciones que comparten un vértice se realizan en paralelo, esto es factible. La recursión se detiene cuando solo queda un único vértice, lo que significa que el algoritmo necesita como máximoiteraciones, lo que lleva a un tiempo de ejecución total en.
Paralelización
Una posible paralelización de este algoritmo [ 5 ] [ 6 ] [ 7 ] produce una complejidad temporal polilogarítmica , es deciry existe una constantede modo que. Aquídenota el tiempo de ejecución para un gráfico conbordes,vértices en una máquina conprocesadores. La idea básica es la siguiente:
mientras encontrar los bordes de incidencia más ligeros // asignar el subgrafo correspondiente a cada vértice // contraer cada subgrafo //
El MST consta entonces de todos los bordes más claros encontrados.
Esta paralelización utiliza la representación gráfica de matriz de adyacencia para. Esto consta de tres matrices:de longitudpara los vértices,de longitudpara los puntos finales de cada uno de losbordes yde longitudpara los pesos de las aristas. Ahora para el vérticeel otro extremo de cada borde incidente ase puede encontrar en las entradas entrey. El peso del-º borde ense puede encontrar en. Entonces el-º borde enestá entre vérticesysi y solo siy.
Encontrar el borde de incidencia más ligero
Primero, los bordes se distribuyen entre cada uno de losprocesadores. ElEl procesador -ésimo recibe los bordes almacenados entrey. Además, cada procesador necesita saber a qué vértice pertenecen estas aristas (ya que(solo almacena uno de los puntos finales del borde) y lo almacena en el array.. Obtener esta información es posible enusandobúsquedas binarias o enutilizando una búsqueda lineal . En la práctica, este último método a veces es más rápido, aunque asintóticamente sea peor.
Ahora, cada procesador determina la arista más tenue incidente en cada uno de sus vértices.
encontrar(,) parasisi
Aquí surge el problema de que algunos vértices son manejados por más de un procesador. Una posible solución a esto es que cada procesador tenga su propiomatriz que luego se combina con las de los demás mediante una reducción. Cada procesador tiene como máximo dos vértices que también son manejados por otros procesadores y cada reducción está en. Por lo tanto, el tiempo total de ejecución de este paso es de.
Asignación de subgrafos a vértices
Observe el grafo que consta únicamente de las aristas recopiladas en el paso anterior. Estas aristas se dirigen alejándose del vértice al que apuntan como la arista incidente más ligera. El grafo resultante se descompone en múltiples componentes débilmente conexas. El objetivo de este paso es asignar a cada vértice el componente del que forma parte. Tenga en cuenta que cada vértice tiene exactamente una arista saliente y, por lo tanto, cada componente es un pseudoárbol: un árbol con una arista adicional que corre en paralelo a la arista más ligera del componente, pero en dirección opuesta. El siguiente código transforma esta arista adicional en un bucle:
paralelo para todossi
Ahora, cada componente débilmente conectado es un árbol dirigido cuya raíz tiene un bucle . Esta raíz se elige como representante de cada componente. El siguiente código utiliza la duplicación para asignar a cada vértice su representante:
mientraspara todos
Ahora cada subgrafo es una estrella . Con algunas técnicas avanzadas, este paso necesitatiempo.
Contraer los subgrafos
En este paso, cada subgrafo se contrae a un solo vértice.
número de subgrafos encontrar una función biyectivaraíz estrellada
Encontrar la función biyectiva es posible enusando una suma de prefijo . Como ahora tenemos un nuevo conjunto de vértices y aristas, se debe reconstruir el arreglo de adyacencia, lo que se puede hacer usando Integersort enentiempo.
Complejidad
Cada iteración ahora necesitatiempo y al igual que en el caso secuencial hayiteraciones, lo que resulta en un tiempo de ejecución total de. SiLa eficiencia del algoritmo está eny es relativamente eficiente. SiEntonces es absolutamente eficiente.
Más algoritmos
Existen otros múltiples algoritmos paralelos que abordan el problema de encontrar un MST. Con un número lineal de procesadores es posible lograr esto en. [ 8 ] [ 9 ] Bader y Cong presentaron un algoritmo MST que era cinco veces más rápido en ocho núcleos que un algoritmo secuencial óptimo. [ 10 ]
Otro desafío es el modelo de memoria externa: existe un algoritmo propuesto por Dementiev et al. que afirma ser solo de dos a cinco veces más lento que un algoritmo que solo utiliza la memoria interna [ 11 ].
Referencias
- ^ Lijadoras; Dietzfelbinger; Martín; Mehlhorn; Kurt; Pedro (10 de junio de 2014). Algoritmos und Datenstrukturen Die Grundwerkzeuge . Springer Vieweg. ISBN 978-3-642-05472-3.
- ↑ Brodal, Gerth Stølting; Träff, Jesper Larsson; Zaroliagis, Christos D. (1998), "A Parallel Priority Queue with Constant Time Operations", Journal of Parallel and Distributed Computing , 49 (1): 4– 21, CiteSeerX 10.1.1.48.3272 , doi : 10.1006/jpdc.1998.1425
- ↑ Osipov, Vitaly; Sanders, Peter; Singler, Johannes (2009), "El algoritmo del árbol de expansión mínima de Kruskal con filtro", Actas del Undécimo Taller sobre Ingeniería y Experimentos de Algoritmos (ALENEX). Sociedad de Matemáticas Industriales y Aplicadas : 52–61 , CiteSeerX 10.1.1.218.2574
- ↑ Sanders, Peter. "Script de ingeniería de algoritmos" (PDF) . Página principal del KIT de ingeniería de algoritmos . Consultado el 25 de febrero de 2019 .
- ↑ Sanders, Peter. "Script de algoritmos paralelos" (PDF) . Página principal del KIT de algoritmos paralelos . Consultado el 25 de febrero de 2019 .
- ↑ Zadeh, Reza. "Algoritmos distribuidos y optimización" (PDF) . Algoritmos distribuidos y optimización. Página principal de la Universidad de Stanford . Consultado el 25 de febrero de 2019 .
- ↑ Chun, Sun; Condon, Anne (1996). «Implementación paralela del algoritmo del árbol de expansión mínima de Bouvka». Actas de la Conferencia Internacional sobre Procesamiento Paralelo . págs. 302–308 . doi : 10.1109/IPPS.1996.508073 . ISBN 0-8186-7255-2. S2CID 12710022 .
- ↑ Chong, Ka Wong; Han, Yijie; Lam, Tak Wah (2001), "Hilos concurrentes y algoritmo óptimo de árboles de expansión mínima en paralelo", Journal of the Association for Computing Machinery , 48 (2): 297–323 , CiteSeerX 10.1.1.32.1554 , doi : 10.1145/375827.375847 , MR 1868718 , S2CID 1778676
- ↑ Pettie, Seth; Ramachandran, Vijaya (2002), "Un algoritmo paralelo óptimo de tiempo y trabajo aleatorio para encontrar un bosque de expansión mínima" (PDF) , SIAM Journal on Computing , 31 (6): 1879–1895 , doi : 10.1137/S0097539700371065 , MR 1954882
- ↑ Bader, David A. ; Cong, Guojing (2006), "Algoritmos rápidos de memoria compartida para calcular el bosque de expansión mínima de grafos dispersos", Journal of Parallel and Distributed Computing , 66 (11): 1366– 1378, doi : 10.1016/j.jpdc.2006.06.001
- ↑ Dementiev, Roman; Sanders, Peter; Schultes, Dominik; Sibeyn, Jop F. (2004), "Ingeniería de un algoritmo de árbol de expansión mínima con memoria externa", Actas del 18.º Congreso Mundial de Informática de la IFIP, 3.ª Conferencia Internacional TC1 sobre Ciencias de la Computación Teórica (TCS2004) (PDF) , págs. 195-208 , archivado del original (PDF) el 9 de agosto de 2011 , consultado el 24 de mayo de 2019. .
- Árbol de expansión
- Computación paralela