Está en la página 1de 6

Facultad de Ingeniería Informática

Universidad Tecnológica de La Habana

José Antonio Echeverría

Programación Paralela

Corte 2
Tema:

Algoritmo de Dijkstra.

AUTORES:
Daniel Orestes León Dueñas

Alexis Diaz Millán

Elbert Mesa Encinosa

AÑO ACADÉMICO: 3ero

2020-2021
El algoritmo de ruta más corto de Dijkstra

En el algoritmo de Dijkstra generamos un árbol de ruta más corto con una


fuente dada como raíz. Mantenemos dos conjuntos, un conjunto contiene
vértices incluidos en el árbol de ruta más corta, otro conjunto incluye vértices
que aún no se incluyen en el árbol de ruta más corta. En cada paso del
algoritmo, encontramos un vértice que está en el otro conjunto (conjunto de aún
no incluido) y tiene una distancia mínima de la fuente. El objetivo es: dado un
grafo y un vértice de origen en el grafo, encontrar los caminos más cortos
desde la fuente hasta todos los vértices en el grafo dado.

A continuación, se muestran los pasos detallados utilizados en el algoritmo de


Dijkstra para encontrar la ruta más corta desde un vértice de fuente única a
todos los demás vértices en el gráfico dado.

1. Crear un conjunto de árbol de ruta más corta, que realice un seguimiento


de los vértices incluidos en el árbol de ruta más corta, es decir, cuya
distancia mínima desde la fuente se calcula y finaliza. Inicialmente, este
conjunto está vacío.
2. Asigne un valor de distancia a todos los vértices en el gráfico de entrada.
Inicialice todos los valores de distancia como INFINITOS. Asigne el valor
de distancia como 0 para el vértice de origen para que se elija primero.
3. Si bien el conjunto de árbol de ruta más corta no incluye todos los
vértices:
a) Elija un vértice que no esté allí en el conjunto de árbol de ruta
más corta y tenga un valor de distancia mínima.
b) Incluirlo al conjunto de árbol de ruta más corta.
c) Actualizar el valor de distancia de todos los vértices adyacentes a
él. Para actualizar los valores de distancia, recorra en iteración
todos los vértices adyacentes. Para cada vértice adyacente v, si
la suma del valor de distancia de u (de la fuente) y el peso de la
arista u-v, es menor que el valor de distancia de v, actualice el
valor de distancia de v.
A continuación, se muestra un ejemplo:

El conjunto de árbol de ruta más corta está inicialmente vacío y las distancias
asignadas a los vértices son {0, INF, INF, INF, INF, INF, INF, INF} donde INF
indica infinito. Ahora, se elija el vértice con un valor de distancia mínima. Se
elige el vértice 0, se incluye al conjunto de árbol de ruta más corta,
convirtiéndose en {0}. Después de incluir 0, se actualizan los valores de
distancia de sus vértices adyacentes. Los vértices adyacentes de 0 son 1 y 7.
Los valores de distancia de 1 y 7 se actualizan como 4 y 8. El siguiente
subgrafo muestra los vértices y sus valores de distancia, solo se muestran los
vértices con valores de distancia finitos. Los vértices incluidos en conjunto de
árbol de ruta más corta se muestran en color verde.

Se elije el vértice con el valor de distancia mínima y que aún no esté incluido en
conjunto de árbol de ruta más corta. El vértice 1 se selecciona y se agrega. Así
que conjunto de árbol de ruta más corta ahora se convierte en {0, 1}. Se
actualizan los valores de distancia de los vértices adyacentes de 1. El valor de
distancia del vértice 2 se convierte en 12.

Nuevamente se elige el vértice con el valor de distancia mínima y que aún no


esté incluido en conjunto de árbol de ruta más corta. Se elige el vértice 7. Así
que el conjunto ahora se convierte en {0, 1, 7}. Se actualizan los valores de
distancia de los vértices adyacentes de 7. El valor de distancia del vértice 6 y 8
se vuelve finito (15 y 9 respectivamente).

Se elije el vértice con el valor de distancia mínima y que aún no esté incluido en
conjunto de árbol de ruta más corta. Se selecciona el vértice 6. Así que el
conjunto ahora se convierte en {0, 1, 7, 6}. Se actualizan los valores de
distancia de los vértices adyacentes de 6. Se actualiza el valor de distancia del
vértice 5 y 8.
Se repiten los pasos anteriores hasta que el conjunto incluya todos los vértices
del gráfico dado. Finalmente, obtenemos el siguiente árbol de camino más
corto.

Fases

Particionado
Se identificó como tarea que se puede descomponer y pasarlo a múltiples
procesos / hilos para ejecución concurrente : Actualizar los valores de distancia
de los vértices adyacentes al vértice actual seleccionado, que sería el de
distancia mínima. En cuanto a la granularidad de la descomposición podría
existir granularidad fina si se tiene un grafo muy grande, ya que la
descomposición genera un número elevado de pequeñas tareas.

Comunicación
No existe comunicación entre las tareas que se realizan en paralelo, ya que la
actualización de los valores de los vértices es independiente uno del otro, por lo
que la comunicación con el hilo principal se puede realizar de manera
asíncrona. Si otros hilos no han completado la actualización, cuando el hilo
principal comienza a buscar el vértice de menor costo obtendrá un resultado
incorrecto. Por lo que se debe usar “Barrera”. El hilo bloqueado continúa
ejecutándose y espera en este punto del programa hasta que todos los hilos
participantes lleguen al punto de obstáculo.
Aglomeración
Cuando se va a realizar la actualización de la distancia de los vértices, se
utilizan tantos nodos como vértices existan. Una vez actualizados, se reúnen
los valores.

En el caso de la comparación de las distancias, para cada par de vértices se le


asigna un procesador, para tener una mayor granularidad. Luego de obtener
los valores resultantes que devolvieron los procesadores restantes, se
aglomera el resultado.

Mapeo
Una vez que se haya seleccionado el vértice raíz, del cual es responsable el
procesador principal, se pasa a realizar la actualización de los vértices
adyacentes. Es aquí donde se les asigna tareas a otros procesadores, en los
que los restantes procesadores actualizarán las distancias. Finalizado el trabajo
de los procesadores que trabajaron en paralelo, se necesita encontrar el menor
de los valores. Para ello se utilizan varios procesadores, haciendo la
comparación entre los valores.

Patrones identificados
PATRONES DE FLUJO DE CONTROL SERIE ESTRUCTURADO
Entre los patrones de flujo de control serie estructurado se identificó el de
“Selección”, ya que se evalúa si un vértice adyacente es el de menor costo se
añade al conjunto, sino se selecciona otro vértice. También se identificó el
patrón iteración ya que se van a realizar las tareas hasta q se hayan evaluados
todos los vértices del grafo.

PATRONES DE CONTROL EN PARALELO


Otro patrón reconocido es el Fork-Join ya que el flujo principal se bifurca en
varias tareas, que serían la actualización de los costos de los vértices
adyacentes, para luego reincorporarse al flujo principal

También podría gustarte