Algoritmo de Prim SUBTEMA: TEORIA DE GRAFOS
AUTORA: Leidy Lizeth Contreras Urbina
¿Qué es un grafo? Un grafo o grafica es un conjunto finito de nodos o vértices conectados a través de aristas, los cuales pueden ser conexos, es decir existe algún enlace con cada nodo a través de algún camino formando así un grafo entero; O los grafos no conexos, que tienen la particularidad de que un segmento de grafo no este enlazado a través de algún vértice al grafo principal. En la teoría de grafos existen grafos dirigidos y grafos no dirigidos , lo grafos dirigidos son aquellos donde sus aristas tienen un sentido , quiere decir que tienen un principio especifico en algún nodo y un destino en algún otro a diferencia de los no dirigidos que son solo grafos simples (puede tomar ambas direcciones). Árboles, un árbol es un grafo que no contiene ciclos y que conecta todos los nodos utilizando el menor número de aristas posibles. Árbol recubridor mínimo, dentro de un grafo se tiene que cubrir todos los nodos formando un árbol (sub grafo) y utilizando el menor coste posible (menor costo, tiempo, distancia, precio, etc.) El algoritmo de Prim es un algoritmo de la teoría de grafos que encuentra un árbol de expansión mínima para un grafo ponderado conexo. Esto significa que se encuentra un subconjunto de las aristas que forma un árbol que incluye todos los nodos, donde el total peso de todas las aristas en el árbol se reduce al mínimo. Si el gráfico no está conectado, entonces sólo se encuentra un mínimo árbol de expansión para uno de los componentes conectados
PÁGINA 1
Vojtěch Jarník Vojtěch Jarník (22 de diciembre de 1897 - 22 de septiembre de 1970) fue un matemático checo. Su principal área de trabajo fue en la teoría de los números y el análisis matemático, demostró una serie de resultados en problemas de punto de celosía. También descubrió el algoritmo sobre la teoría de grafos conocido como el algoritmo de Prim.
PÁGINA 2
El algoritmo de Prim El algoritmo de Prim es un algoritmo perteneciente a la teoría de los grafos para encontrar un árbol recubridor mínimo en un grafo conexo, no dirigido y cuyas aristas están etiquetadas. En otras palabras, el algoritmo encuentra un subconjunto de aristas que forman un árbol con todos los vértices, donde el peso total de todas las aristas en el árbol es el mínimo posible. Si el grafo no es conexo, entonces el algoritmo encontrará el árbol recubridor mínimo para uno de los componentes conexos que forman dicho grafo no conexo. El algoritmo fue diseñado en 1930 por el matemático Vojtech Jarnik y luego de manera independiente por el científico computacional Robert C. Prim en 1957 y redescubierto por Dijkstra en 1959. Por esta razón, el algoritmo es también conocido como algoritmo DJP o algoritmo de Jarnik.
Descripción conceptual El algoritmo incrementa continuamente el tamaño de un árbol, comenzando por un vértice inicial al que se le van agregando sucesivamente vértices cuya distancia a los anteriores es mínima. Esto significa que en cada paso, las aristas a considerar son aquellas que inciden en vértices que ya pertenecen al árbol. El árbol recubridor mínimo está completamente construido cuando no quedan más vértices por agregar.
PÁGINA 3
Seudocódigo del algoritmo Estructura de datos auxiliar: Cola de prioridad (se puede implementar con un heap)*
Prim (Grafo G) /* Inicializamos todos los nodos del grafo. La distancia la ponemos a infinito y el padre de cada nodo a NULL Encolamos, en una cola de prioridad donde la prioridad es la distancia, todas las parejas <nodo,distancia> del grafo*/ por cada u en V[G] hacer distancia[u] = INFINITO
padre[u] = NULL Añadir(cola,<u,distancia[u]>) distancia[u]=0 mientras !esta_vacia(cola) hacer // OJO: Se entiende por mayor prioridad aquel nodo cuya distancia[u] es menor. u = extraer_minimo(cola) //devuelve el minimo y lo elimina de la cola. por cada v adyacente a 'u' hacer si ((v ∈ cola) && (distancia[v] > peso(u, v)) entonces padre[v] = u distancia[v] = peso(u, v) Actualizar(cola,<v,distancia[v]>)
PÁGINA 4
“heap: En computación, un montículo (heap en inglés) es una estructura de datos del tipo árbol con información perteneciente a un conjunto ordenado”.
Código en JAVA public class Algorithms { public static Graph PrimsAlgorithm (Graph g, int s) while (p.hasMoreElements ())
{ int n = g.getNumberOfVertices(); Entry[] table = new Entry [n]; for (int v = 0; v < n; ++v)
{ Edge edge = (Edge) p.nextElement (); Vertex v1 = edge.getMate (v0);
table [v] = new Entry (); table [s].distance = 0;
int n1 = v1.getNumber (); Int wt = (Int) edge.getWeight ();
PriorityQueue queue =
int d = wt.intValue ();
new BinaryHeap (g.getNumberOfEdges());
if (!table[n1].known && table[n1].distance>d)
queue.enqueue (
{
new Association (new Int (0), g.getVertex (s))); while (!queue.isEmpty ())
table [n1].distance = d; table [n1].predecessor = n0; queue.enqueue (
{ Association assoc = (Association)
new Association (new Int (d), v1));
queue.dequeueMin();
}
Vertex v0 = (Vertex) assoc.getValue ();
}
int n0 = v0.getNumber (); if (!table [n0].known)
{
table [n0].known = true; Enumeration p = v0.getEmanatingEdges ();
PÁGINA 5
} } Graph result = new GraphAsLists (n); for (int v = 0; v < n; ++v) result.addVertex (v); for (int v = 0; v < n; ++v) { if (v != s) result.addEdge (v, table [v].predecessor); } return result; } }
PĂ GINA 6
Ejemplo de ejecución Image
Descripción
No En el En el visto grafo árbol
Este es el grafo ponderado de partida. No es un árbol, ya que para serlo se requiere que no haya ciclos, y en este caso sí hay. Los números cerca de las aristas indican el peso. Ninguna de las
C, G
A, B, E, F
D
aristas está marcada, y el vértice D ha sido elegido arbitrariamente como el punto de partida.
El segundo vértice es el más cercano a D: A está a 5 de distancia, B a 9, E a 15 y F a 6. De C, G
B, E, F
A, D
estos, 5 es el valor más pequeño, así que marcamos la arista DA.
El próximo vértice a elegir es el más cercano a D o A. B está a 9 de distancia de D y a 7 de A, E está a 15, y F está a 6. 6 es C
B, E, G A, D, F
el valor más pequeño, así que marcamos el vértice F y a la arista DF.
PÁGINA 7
El algoritmo continua. El vértice B, que está a una distancia de 7 de A, es el siguiente marcado. En este punto la aristaDB es marcada en
null
C, E,
A, D,
G
F, B
rojo porque sus dos extremos ya están en el árbol y por lo tanto no podrá ser utilizado.
Aquí hay que elegir entre C, E y G. C está a 8 de distancia de B, E está a 7 de distancia de B, y G está a 11 de distancia de F. E está más cerca, entonces marcamos el
null
C, G
A, D, F, B, E
vértice E y la arista EB. Otras dos aristas fueron marcadas en rojo porque ambos vértices que unen fueron agregados al árbol.
Sólo quedan disponibles C y G. C está a 5 de distancia de E, y G a 9 de distancia de E. Se elige C, y se
A, D, null
G
F, B, E, C
marca con el arco EC. El arco BC también se marca con rojo.
G es el único vértice pendiente, y está más cerca de E que de F, así que se agrega EG al árbol. Todos los vértices están ya marcados, el árbol de expansión
A, D, null
null
F, B, E, C, G
mínimo se muestra en verde. En este caso con un peso de 39. PÁGINA 8
Aplicación Se usa normalmente para ahorrar recursos, su aplicación más común es la implementación de cables de redes, de servidores, de postes de luz entre otros.
Ejemplo Aplicando el algoritmo de Prim en un problema de la vida real: Situación: Implementación del cableado para el servicio de televisión por cable en ciertos puntos de un sector de la ciudad. Problema: Ahorrar la mayor cantidad de cable (recursos) en los puntos estratégicos (torres de distribución) para llegar a todos los destinos deseados. 3. Datos: Distancia entre torres y casas es de 10 metros (cada casa).
En la figura se observa la ubicación de las torres de distribución y las viviendas. 4. En la figura se transforma el conjunto de torres y viviendas en un Grafo.
PÁGINA 9
5. Aplicando el Algoritmo de Prim en el grafo para hallar el árbol mínimo o en otras palabras la ruta óptima para ahorra la distancia del cableado. Pm = 100 + 65 + 115 + 70 + 90 + 40 + 130 + 120 + 200 + 160 + 114 + 60 + 80 + 190 Pm= 1,534m Pm = 100 + 65 + 70 + 90 + 40 + 120 + 60 + 80 + 160 Pm= 785m Diferencia = 749m
PÁGINA 10
6. Pm = 100 + 65 + 70 + 90 + 40 + 120 + 60 + 80 + 160 Pm= 785
PÁGINA 11
Webgrafía
https://es.wikipedia.org/wiki/Vojt%C4%9Bch_Jarn%C3%ADk https://es.wikipedia.org/wiki/Algoritmo_de_Prim https://www.youtube.com/watch?v=-2NlTulDUq4
http://www.monografias.com/trabajos87/monografia-algoritmo-prim/monografiaalgoritmo-prim.shtml
PÁGINA 12