Manual de algorítmica
MANUAL DE ALGORÍTMICA
Proyecto fin de carrera Escuela Técnica Superior de Ingeniería Informática Departamento Matemáticas Aplicadas I Tutor: Alberto Márquez Pérez
Borrego Ropero, Rafael
[email protected] Recio Domínguez, Daniel
[email protected]
Borrego Ropero Rafael Recio Domínguez Daniel
1 de 248
Manual de algorítmica
Borrego Ropero Rafael Recio Domínguez Daniel
2 de 248
Manual de algorítmica
1.- Introducción................................................................................................... 6 2.- Conceptos generales. ................................................................................... 8 Grafos, tipos, ejemplos................................................................................ 8 Algunas definiciones. ................................................................................ 12 Algunos grafos básicos. ............................................................................ 17 Tipos de rutas ........................................................................................... 46 Grafo complementario............................................................................... 48 Grafo de línea. .......................................................................................... 50 3.- Algoritmos implementados. ......................................................................... 54 3.1.- Algoritmos sobre caminos mínimos. ..................................................... 54 Algoritmo de Dijkstra. ................................................................................ 54 Algoritmo de Floyd. ................................................................................... 61 3.2.- Algoritmos de distancias....................................................................... 65 Excentricidad de un vértice. ...................................................................... 65 Radio de un grafo...................................................................................... 67 Diámetro de un grafo................................................................................. 69 Distancia de un vértice. ............................................................................. 70 Algoritmo de la mediana............................................................................ 72 Algoritmo del centro. ................................................................................. 73 3.3.- Conectividad......................................................................................... 75 Algoritmo de componentes conexas. ........................................................ 75 Vértices de corte. ...................................................................................... 77 Aristas puente. .......................................................................................... 78 Bloques. .................................................................................................... 79 3.4.- Algoritmos de búsquedas. .................................................................... 88 Búsqueda en profundidad (DFS) .............................................................. 88 Búsqueda en anchura (BFS) .................................................................... 90 3.5.- Árboles recubridores de peso mínimo. ................................................. 92 Algoritmo de Boruvka. ............................................................................... 92 Algoritmo de Prim...................................................................................... 98 Algoritmo de Kruskal. .............................................................................. 100 3.6.- Prufer.................................................................................................. 103 Algoritmo de codificación. ....................................................................... 103 Algoritmo de decodificación. ................................................................... 110 3.7.- Algoritmo de emparejamientos ........................................................... 120 Algoritmo de emparejamiento maximal simple........................................ 121 Algoritmo de Kuhn-Munkres.................................................................... 128 Algoritmo de Kuhn-Munkres con preprocesamiento (peso mínimo)........ 142 Algoritmo de emparejamiento maximal de peso óptimo.......................... 146 3.8.- Euler ................................................................................................... 157 ¿ Es euleriano ?. ..................................................................................... 157 3.9.- Algoritmos de búsqueda de trayectorias eulerianas. .......................... 162 Algoritmo de Fleury ................................................................................. 162 Algoritmo de Tucker. ............................................................................... 183 Algoritmo de Hierholzer........................................................................... 201 Problema del cartero ............................................................................... 205 3.10.- Algoritmos de vértice coloración....................................................... 212 Algoritmo de coloración Secuencial o Voraz. .......................................... 213
Borrego Ropero Rafael Recio Domínguez Daniel
3 de 248
Manual de algorítmica Algoritmo de coloración Welsh-Powell .................................................... 215 Algoritmo de coloración Matula-Marble-Isaacson ................................... 216 Algoritmo de coloración de Brelaz........................................................... 217 ¿Es bipartito? .......................................................................................... 221 3.11.- Algoritmos de aristas coloración....................................................... 225 Algoritmo basado en rellenar un cuadrado latino .................................... 225 Algoritmo basado en emparejamientos maximales................................. 228 3.-12.- Hamilton .......................................................................................... 235 Algoritmo de Dirac................................................................................... 235 Búsqueda de trayectorias hamiltonianas................................................. 239 4.- Bibliografía ................................................................................................ 248
Borrego Ropero Rafael Recio Domínguez Daniel
4 de 248
Manual de algorítmica
Borrego Ropero Rafael Recio Domínguez Daniel
5 de 248
Manual de algorítmica
1.- Introducción. Nos encontramos ante una aplicación desarrollada para el departamento de matemática aplicada I con el objetivo de proporcionar una herramienta que ayude al desarrollo de las prácticas de las asignaturas dedicadas al estudio de los grafos y la investigación. La aplicación desarrollada tiene como objetivos mejorar algunos aspectos de la aplicación “Algraf” la cual ha sido punto de partida de este proyecto por lo que se mantiene la compatibilidad con versiones anteriores. La aplicación resuelve todos los problemas recogidos en versiones anteriores de “Algraf” y se han incluido algunos nuevos por los que ahora la aplicación da solución a gran cantidad de problemas entre los que podemos destacar.
- Problema de rutas. - Problemas de ubicación. - Problemas de compatibilidades o coloración. - Problemas de minimización de costes. - Problemas de emparejamientos.
Los conceptos expuestos a continuación están enfocados a la comprensión única y exclusivamente a los algoritmos desarrollados para la aplicación. Se ha pretendido que sea un manual autocontenido por lo que cualquier concepto necesario para entender de los algoritmos o funcionamiento de la aplicación está debidamente explicado.
Borrego Ropero Rafael Recio Domínguez Daniel
6 de 248
Manual de algorítmica
Borrego Ropero Rafael Recio Domínguez Daniel
7 de 248
Manual de algorítmica
2.- Conceptos generales. Grafos, tipos, ejemplos.
Un grafo G es un conjunto finito, no vacío de vértices V(G) y un conjunto de aritas E(G) que puede ser vacío formado por pares no ordenados de elementos pertenecientes a V(G). Solo se establecerá un orden cuado hablemos de grafos dirigidos y a las aristas se las denomina arcos. Ejemplo de grafo no dirigido.
La matriz de adyacencias del grafo es simétrica respecto a la diagonal principal por ser no dirigido.
v7 v1 v2 v3 v4 v5 v6
Borrego Ropero Rafael Recio Domínguez Daniel
v∞1 ∞ 1 ∞ 1 ∞ ∞
v2 ∞ 1 ∞ 1 1 1 ∞
v3 ∞ ∞ 1 ∞ ∞ ∞ 1
v4 ∞ 1 1 ∞ ∞ 1 ∞
v5 1 ∞ 1 ∞ 1 ∞ ∞
v6 ∞ ∞ ∞ 1 ∞ ∞ ∞
v7 ∞ ∞ ∞ ∞ ∞ 1 ∞
8 de 248
Manual de algorítmica Si dos o más aristas unen el mismo par de vértices se llaman aristas paralelas y en este caso tenemos un multigrafo. Si una arista une un mismo vértice se trata de un lazo o bucle. Si en un grafo se permite aristas paralelas y bucles obtenemos un seudografo.
Ejemplo de grafo dirigido.
Matriz de adyacencias del grafo.
v1 v2 v3 v4 v5
Borrego Ropero Rafael Recio Domínguez Daniel
v1 ∞ 1 ∞ 1 ∞
v2 ∞ ∞ 1 ∞ ∞
v3 1 ∞ ∞ 1 ∞
v4 ∞ 1 ∞ ∞ 1
v5 1 ∞ ∞ ∞ ∞
9 de 248
Manual de algorítmica Un grafo es ponderado si cada arista lleva asociada una magnitud, longitud, dificultad al recorrerla… Ejemplo de grafo ponderado no dirigido.
La matriz de adyacencias del grafo es simétrica respecto a la diagonal principal por ser no dirigido.
v1 v2 v3 v4 v5 v6 v7
Borrego Ropero Rafael Recio Domínguez Daniel
v1 ∞ 3 ∞ ∞ 5 2 ∞
v2 3 ∞ 3 6 1 ∞ ∞
v3 ∞ 3 ∞ 1 ∞ ∞ 2
v4 ∞ 6 1 ∞ 1 ∞ ∞
v5 5 1 ∞ 1 ∞ ∞ ∞
v6 2 ∞ ∞ ∞ ∞ ∞ ∞
v7 ∞ ∞ 2 ∞ ∞ ∞ ∞
10 de 248
Manual de algorítmica Ejemplo de grafo ponderado dirigido.
Matriz de adyacencias.
v1 v2 v3 v4 v5 v6 v7 v8
v1 ∞ ∞ ∞ ∞ ∞ ∞ ∞ ∞
v2 2 ∞ ∞ ∞ ∞ ∞ ∞ ∞
v3 3 ∞ ∞ ∞ ∞ ∞ ∞ ∞
v4 ∞ 1 ∞ ∞ ∞ ∞ ∞ ∞
v5 ∞ 1 ∞ ∞ ∞ ∞ ∞ ∞
v6 ∞ ∞ ∞ 1 1 ∞ ∞ ∞
v7 ∞ ∞ 1 ∞ ∞ ∞ ∞ ∞
v8 ∞ ∞ ∞ ∞ ∞ 4 2 ∞
Si G es un grafo no dirigido y e = uv es una arista de G diremos que “u” es adyacente a “v” o que “v” es adyacente a “u” o “e” une “u” y “v”, e incide en “v” y “u”. En caso de tratarse de un grafo dirigido diremos que “u” es adyacente a “v” y “v” es adyacente desde “u”. El arco (u, v) es incidente desde “u” e incidente hacia “v”.
Borrego Ropero Rafael Recio Domínguez Daniel
11 de 248
Manual de algorítmica
Algunas definiciones.
Tamaño y orden de un grafo. El orden de un grafo G es el número de vértices del grafo y tamaño es el número de aristas. p = orden (G) = | V (G) |. q = tamaño (G) = | E (G) |.
Valencia o grado de un vértice “v”. En un grafo no dirigido el grado de un vértice “v” es el número de aristas que inciden en él o número de vértices adyacentes. En grafos dirigidos se distingue entre grado de entrada y salida del vértice. El grado de entrada de “v” se define como el número de vértices adyacentes y el grado de salida de “v” es el número de vértices adyacentes hacia el “v” o número de vértices que apuntan a “v”.
Subgrafo. Un grafo H es subgrafo de un grafo G si V(H) ⊆ V(G). Ejemplo.
Borrego Ropero Rafael Recio Domínguez Daniel
12 de 248
Manual de algorítmica Subgrafo H.
No es un subgrafo.
Borrego Ropero Rafael Recio Domínguez Daniel
13 de 248
Manual de algorítmica Subgrafo inducido por vértices.
Sea S un conjunto de vértices no vacío de un grafo G. El subgrafo inducido por S es el subgrafo maximal de G con vértices en el conjunto S. Al conjunto de aristas lo denotaremos por . En están todas las aristas de G que unen dos vértices de S. Un subgrafo H es subgrafo inducido por vértices si existe S ⊆ V (G) tal que H = . Ejemplo
Borrego Ropero Rafael Recio Domínguez Daniel
14 de 248
Manual de algorítmica Subgrafo inducido por lo vértices {v1, v4, v5, v6}.
Subgrafo inducido por aristas.
Sea X un conjunto no vació de aristas de G. El subgrafo inducido por X es el subgrafo mínimo de G con X el conjunto de aristas y el conjunto de vértices. En están todos los vértices incidentes con alguna arista de X. Un subgrafo es subgrafo inducido por aristas si H = para algún X ≠ ∅ ⊆ E (G).
Borrego Ropero Rafael Recio Domínguez Daniel
15 de 248
Manual de algorítmica Ejemplo
Subgrafo inducido por las aristas {v1v4, v4v5, v5v6, v6v3, v4v3}.
Borrego Ropero Rafael Recio Domínguez Daniel
16 de 248
Manual de algorítmica
Algunos grafos básicos.
Grafos completos. Sea G un grafo de orden “p”. G es completo si dos vértices cualesquiera del grafo son siempre adyacentes, es decir, todos sus vértices tienen valencia o grado p-1 (kp). Ejemplo k4.
Ejemplo k5.
Borrego Ropero Rafael Recio Domínguez Daniel
17 de 248
Manual de algorítmica
Caminos simples.
Un grafo de orden p ≥ 1 que es un camino simple se denota Pp. Un camino simple tiene longitud par si “p” es impar y longitud impar si “p” es par. Ejemplo
Ciclos.
Los ciclos Cn o n-ciclos para p ≥ 3, son grafos que se asemejan a polígonos de “p” lados. Un ciclo tiene longitud par si “n” es par y longitud impar si “n” es par. Ejemplo C5.
Borrego Ropero Rafael Recio Domínguez Daniel
18 de 248
Manual de algorítmica
Borrego Ropero Rafael Recio Domínguez Daniel
19 de 248
Manual de algorítmica Árbol. Un árbol de “n” vértices es un grafo conexo, sin ciclos con exactamente n-1 aristas. Además posee las siguientes propiedades. a) Dos vértices cualesquiera están unidos por un único camino. b) Si al grafo le eliminamos cualquiera de sus aristas queda dividido exactamente en dos componentes conexas dando lugar a un bosque. Ejemplo.
Borrego Ropero Rafael Recio Domínguez Daniel
20 de 248
Manual de algorítmica Bosque Conjunto de árboles. Ejemplo.
Existen más tipos de grafos como los bipartitos los cuales se comentan más adelante. Concretamente hay un apartado dedicados exclusivamente para ellos y en el algoritmo de Kuhn-Munkres se comenta previamente los grafos bipartitos completos.
Borrego Ropero Rafael Recio Domínguez Daniel
21 de 248
Manual de algorítmica
Árbol n-ario completo.
Una de las formas de representación de la información, como estructura de datos, más utilizada es el árbol. Un árbol consiste en un nodo inicial, llamado raíz, del que parten un cierto número de aristas, denominadas ramas, cada una hasta un nuevo vértice. Los vértices extremos de una arista se llaman también vértice padre, aquel que se representa más cerca de la raíz, y el otro vértice hijo. A su vez, estos vértices hijos pueden presentar ramas hacia nuevos nodos hijos, que deberán ser siempre nodos diferentes, ya que un árbol no puede presentar ciclos. Por último, aquellos vértices que no presentan ramas hacia ningún hijo, se denominan hojas. El caso de los árboles n-arios completos es un caso particular dentro de los árboles. La referencia a n-arios-completos se debe a que el número de ramas que sale de cada nodo padre, que es en todos los casos igual a n. Para definir completamente un grafo perteneciente a esta familia, en realidad son necesarios 2 parámetros. Uno es la n anteriormente comentado, y el otro es el número de niveles que se le quiere dar al grafo, esto es, el número de ramas que deberá tener el grafo desde el vértice raíz hasta cualquiera de los vértices hoja.
Borrego Ropero Rafael Recio Domínguez Daniel
22 de 248
Manual de algorítmica Grafos nulos
Un grafo nulo es aquel que no contiene aristas. Un grafo nulo puede tener un número de vértices cualquiera pero todos ellos son vértices aislados. Obviamente, en un grafo nulo el número de componentes conexas será igual al número de vértices. Un ejemplo de grafo nulo de cuatro vértices puede observarse en la figura.
Borrego Ropero Rafael Recio Domínguez Daniel
23 de 248
Manual de algorítmica
Rueda
Como en los casos de los grafos ciclos y los grafos estrella, la familia de los grafos ruedas toma su apelativo de la figura con la que se representan estos grafos. En este caso, la figura que muestra un grafo rueda viene a ser el resultado de la unión de las dos familias citadas anteriormente, esto es, un vértice central rodeado de los demás vértices del grafo en forma de círculo, de forma que éstos se unen mediante aristas entre vértices consecutivos, y, a su vez, mediante una arista más, quedan unidos al vértice central, dando al conjunto el aspecto de una rueda con sus radios. Así, para cada n≥4, el grafo rueda, W n, con n+1 vértices, se define como la unión K1+Cn, de un vértice aislado con un ciclo de longitud n.
Borrego Ropero Rafael Recio Domínguez Daniel
24 de 248
Manual de algorítmica Cubos
Otra de las familias de grafos que suelen considerarse con bastante asiduidad es la de los cubos. Esta familia está formada por los cubos de las distintas dimensiones, desde el cubo de dimensión 1, como observaremos en el apartado siguiente, hasta cualquier número de dimensiones. Sea K un entero positivo mayor que 1. El k-cubo, Qk, es el grafo cuyos vértices son las k-tuplas ordenadas de ceros y unos, en el cual dos vértices están unidos por una arista si y sólo si difieren exactamente en una posición. Así, por ejemplo, para k=3, los vértices son (0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), y (1, 1, 1) y, por ejemplo, (0, 0, 0) está unido con (0, 0, 1), (0, 1, 0) y (1, 0, 0) pero no con ningún otro vértice. Se puede comprobar que un k-cubo tiene 2k vértices, 2(k-1)k aristas y es bipartito.
Cubo de dimensión 1.
El grafo que representa el cubo de dimensión 1, tal y como se ha explicado en el apartado anterior, tiene 21 vértices y (1/2)21 = 1 arista.
Borrego Ropero Rafael Recio Domínguez Daniel
25 de 248
Manual de algorítmica Cubo de dimensión 2.
Como ya se ha explicado en apartados anteriores, el grafo que representa el cubo de dimensión dos tiene un total de 4 vértices de grado 2, para lo cual son necesarias 4 aristas.
Cubo de dimensión 3.
Al igual que en los casos de los demás cubos, el grafo que representa el cubo de dimensión tres sigue la misma relación de vértices y aristas descrita en la introducción de este apartado. Por lo tanto, el cubo de 3 dimensiones, tal y como es comúnmente conocido, cuenta con 8 vértices de grado 3, para lo cual necesita 12 aristas.
Borrego Ropero Rafael Recio Domínguez Daniel
26 de 248
Manual de algorítmica Cubo de dimensión 4.
Como en los casos anteriores, el cubo de 4 dimensiones también cumple la relación de vértices y aristas descrita, por lo que tiene 24 vértices y 25 aristas, lo que le da un grado 4 a todos sus vértices, como ya sabíamos.
Borrego Ropero Rafael Recio Domínguez Daniel
27 de 248
Manual de algorítmica Cubo de dimensión 5.
Para terminar con los grafos relativos a la familia de los cubos ndimensionales que se incluyen en la aplicación del presente proyecto fin de carrera, el cubo de 5 dimensiones constará, naturalmente, de 32 vértices con 80 aristas. Como en el resto de cubos, se puede comprobar que el grado de todos y cada uno de los vértices del grafo coincide con la dimensión, en este caso, 5.
Borrego Ropero Rafael Recio Domínguez Daniel
28 de 248
Manual de algorítmica Rejillas
La familia de grafos que recibe la denominación de rejillas contiene aquellos grafos cuya representación da como resultado una trama de figuras regulares repetidas un cierto número de veces, lo que da al conjunto el aspecto de una rejilla, lo que le da nombre a la familia. Así, podrían existir tantos tipos de rejillas como figuran geométricas quisiéramos utilizar como base para la construcción de las mismas. En el presente trabajo se han considerado solamente las dos más sencillas: la rejilla rectangular y la rejilla triangular, que se explican a continuación.
Rejilla rectangular
La familia de grafos que componen las rejillas rectangulares se compone de todos aquellos grafos cuya representación tiene la forma de un rectángulo dividido en un cierto número de porciones de ancho por otro cierto número de porciones de alto, lo que da al conjunto el aspecto de una rejilla formada, a su vez, por rectángulos de igual tamaño. Estos grafos se caracterizan por tener lo que podríamos denominar tres grupos diferentes de vértices. Los vértices correspondientes a las esquinas del rectángulo, que tendrán, naturalmente, grado 2; los vértices que forman los lados del rectángulo, que tendrán grado 3; y los vértices interiores, que tendrán grado 4. El número de aristas de estos grafos está claramente determinado por las dimensiones que le demos al rectángulo. Para un número “i” de vértices de ancho y un número “j” de alto, el número de aristas del grafo vendrá determinado por la fórmula (j-1)i + (i-1)j.
Borrego Ropero Rafael Recio Domínguez Daniel
29 de 248
Manual de algorítmica Grafo rejilla rectangular de 20 x 5.
Rejilla triangular
La familia de grafos de las rejillas triangulares, paralelamente a la del rejillas rectangulares, contiene grafos cuya representación es un triangulo dividido en porciones triangulares iguales. Como es fácil de suponer, el número de porciones en que se puede dividir el triángulo de la rejilla también está limitado. A diferencia de la rejilla rectangular, las dimensiones de la rejilla triangular se determinan perfectamente con un solo parámetro que será el número de vértices por cada lado. Al igual que ocurre con las rejillas rectangulares, en las triangulares también podemos encontrar tres grupos diferentes de vértices. Los vértices correspondientes a las esquinas del triángulo, que tendrán, igualmente, grado 2; los vértices que forman los lados del triángulo, que tendrán en este caso grado 4; y los vértices interiores, que tendrán grado 6. El número de aristas de estos grafos también viene determinado, lógicamente, por las dimensiones que le demos al triángulo. Para un número “n” de vértices de lado del triángulo, el número de aristas del grafo vendrá determinado por la fórmula (3/2)n(n-1).
Borrego Ropero Rafael Recio Domínguez Daniel
30 de 248
Manual de algorítmica Grafo rejilla triangular de 11 vértices de lado.
Borrego Ropero Rafael Recio Domínguez Daniel
31 de 248
Manual de algorítmica Grafos Platónicos
En el espacio de tres dimensiones, un poliedro es un sólido limitado por superficies, llamadas comúnmente caras, cada una de las cuales es un plano. Un sólido se dice que es convexo si cualesquiera dos puntos de su interior pueden unirse mediante una línea recta que se encuentre completamente en el interior del sólido. Sea ϕ una cara de un grafo plano G. Definimos el grado de ϕ, denotado por d(ϕ), al número de aristas del contorno de ϕ. Los vértices y las aristas de un poliedro, que forman el esqueleto del sólido, forman un grafo simple en el espacio de tres dimensiones. Se puede ver que si el poliedro es convexo el grafo resultante es planar, y claramente, que también es conexo. Que el grado mínimo de cada vértice será, como mínimo, de 3 y que el grado de cada cara es también como mínimo de 3. Además, en particular el grafo resultante también es simple, por lo que se puede establecer la definición: Un grafo conexo, simple y plano G se denomina poliédrico si d(v)≥ 3 para cada vértice v de G y d(ϕ)≥3 para cada cara ϕ de G. Teorema: Sea P un poliedro convexo y sea G su grafo poliédrico. Para cada n≥3 sea vn el número de vértices de G de grado n y sea fn el número de caras de G de grado n. > El poliedro P, y por lo tanto el grafo G, tiene al menos una cara limitada por un ciclo de longitud n para n=3, 4, o 5. Los antiguos griegos descubrieron cinco poliedros regulares. Se dice que un poliedro es regular si es convexo y sus caras son polígonos regulares congruentes (esto es, que los ángulos del poliedro son todos iguales). Estos cinco poliedros son conocidos como sólidos platónicos. Usando la fórmula de Euler se puede demostrar que no existe ningún otro poliedro regular además de los 5 que descubrieron los griegos y cuyos grafos correspondientes constituyen la familia que se incluye en la herramienta y los cuales se presentan a continuación.
Borrego Ropero Rafael Recio Domínguez Daniel
32 de 248
Manual de algorítmica A continuación, se detalla un poco más cada uno de los citados grafos. Tetraedro
El grafo platónico que representa la figura del tetraedro consta, naturalmente, de 4 vértices y 6 aristas. Como se puede observar en la figura siguiente, todos los vértices del grafo tienen grado 3, y las caras de la figura representada son todas triángulos, como corresponde a dicha figura. El grafo platónico tetraedro se encuentra representado planarmente en la siguiente figura.
Borrego Ropero Rafael Recio Domínguez Daniel
33 de 248
Manual de algorítmica Hexaedro
Como el hexaedro que representa, el grafo platónico hexaedro tiene 8 vértices y 12 aristas, formando 6 caras de cuatro lados. Como todos sabemos ya, la figura geométrica hexaedro recibe también el nombre de cubo refiriéndose al cubo de tres dimensiones, por lo que el grafo platónico hexaedro, coincide exactamente con el grafo que representa el cubo tridimensional. El grafo platónico hexaedro se encuentra representado planarmente en la siguiente figura.
Borrego Ropero Rafael Recio Domínguez Daniel
34 de 248
Manual de algorítmica Octaedro
Como es bien conocido, un octaedro es una figura geométrica que, como su propio nombre indica, consta de ocho caras, en forma de triángulo. Como es lógico, el grafo que lo representa tiene sus mismas características, como ya hemos visto en los ejemplos anteriores, es decir, 6 vértices y 12 aristas. El grado de todos los vértices de este grafo, obviamente, es 4. El grafo platónico octaedro se encuentra representado planarmente en la siguiente figura.
Borrego Ropero Rafael Recio Domínguez Daniel
35 de 248
Manual de algorítmica Icosaedro
Como en todos los casos anteriores el grafo platónico icosaedro, al representar la figura geométrica de la que toma nombre, posee también sus mismas características. En el caso del icosaedro, 12 vértices de grado 5, con 30 aristas, para lograr formar 20 caras triangulares. El grafo platónico icosaedro se encuentra representado planarmente en la siguiente figura.
Borrego Ropero Rafael Recio Domínguez Daniel
36 de 248
Manual de algorítmica Dodecaedro
La última de las figuras representadas en la aplicación y, por lo tanto, contenidas en el presente texto, mediante un grafo platónico es la del dodecaedro. Este grafo contará, pues, con los mismos 20 vértices y las mismas 30 aristas que dan a la figura mencionada sus características 12 caras pentagonales. Para ello, los vértices de este grafo tienen todos grado 3. El grafo platónico dodecaedro se encuentra representado planarmente en la siguiente figura.
Borrego Ropero Rafael Recio Domínguez Daniel
37 de 248
Manual de algorítmica Herschel
Se ha incluido en la aplicación el grafo atribuido a Herschel ya que tiene la particularidad de constituir el ejemplo más pequeño de grafo poliédrico nohamiltoniano.
Borrego Ropero Rafael Recio Domínguez Daniel
38 de 248
Manual de algorítmica Harary
Otra de las familias que se incluyen en el presente trabajo es la correspondiente a los grafos de Harary. Los grafos de Harary se definen mediante dos parámetros: el número de vértices del grafo, que se denota por n; y el grado mínimo que debe tener cada vértice del grafo, que se denota por k. Debido a esta notación, los grafos de Harary suelen describirse mediante la simbología: Hk, n. Estos grafos cumplen la propiedad de hacer que cada uno de sus vértices tenga, como mínimo grado k, pero utilizando para ello el mínimo número de aristas posible. Un ejemplo de este tipo de grafos, donde se pueden observar las características descritas es H11, 10.
Borrego Ropero Rafael Recio Domínguez Daniel
39 de 248
Manual de algorítmica Grafos enlazados.
Los grafos enlazados se caracterizan porque, si numeramos sus vértices, las aristas del grafo enlazan vértices cuyo número se diferencia un una cantidad fija -que podemos llamar k-, es decir, siguiendo una determinada progresión lineal. Por ejemplo, si hacemos k=2, el vértice 1 se uniría al 3, el 2 al 4, y así sucesivamente con todos los vértices del grafo. Si en lugar de tener en cuenta tan sólo este valor de k, tomáramos una serie completa de valores k1, k2, ... , kn, obtendríamos un grafo que podríamos denominar n-enlazado. Los grafos enlazados más comunes son aquellos para los que n=1, que denotamos por Ln,r y aquellos en los que n=2, que denotamos por Ln,r,s. Enlazados LN, R Dado un grafo G, definido por un conjunto de vértices V y un conjunto de aristas A. Supongamos v1, ..., vn los vértices contenidos en V. Se dice que G es un grafo enlazado Ln, r si cumple que: vi, vj ∈ V, tales que (j1, la forma de estos grafos, situando sus vértices en círculo, es de estrella, como se puede observar en el ejemplo de la figura. L5,2.
Borrego Ropero Rafael Recio Domínguez Daniel
40 de 248
Manual de algorítmica Enlazados LN, R, S Dado un grafo G, definido por un conjunto de vértices V y un conjunto de aristas A. Supongamos v1, ..., vn los vértices contenidos en V. Se dice que G es un grafo enlazado Ln, r, s si cumple que: r ≠ s, vi, vj ∈ V, tales que (j 0 Encontrar un vértice v de A de grado 1. Sea v-w la arista que incide en v. Introducir w en S. Eliminar la arista v-w del grafo. a := a-1
Borrego Ropero Rafael Recio Domínguez Daniel
103 de 248
Manual de algorítmica fmientras fin La búsqueda del vértice de grado 1 (hoja) se realiza en la matriz de adyacencias del grafo comenzando de izquierda a derecha y de arriba abajo a partir de la fila correspondiente al vértice “v”. Una vez que se encuentra la hoja “w” eliminamos arista formada por los vértices v-w para no volver a tenerla en cuenta. Para determinar si un vértice es hoja sumamos la fila correspondiente a dicho vértice, si el valor de la suma es 1 se trata de una hoja.
Obtener la codificación de Prüfer del siguiente árbol.
Matriz de adyacencias del grafo. v1 v2 v3 v4 v5 v6 v7
Borrego Ropero Rafael Recio Domínguez Daniel
v1 v2 0 1 1 0 1 ∞ ∞ 1 1 ∞ ∞ 1 ∞ 1
v3 1 ∞ 0 ∞ ∞ ∞ ∞
v4 ∞ 1 ∞ 0 ∞ ∞ ∞
v5 1 ∞ ∞ ∞ 0 ∞ ∞
v6 ∞ 1 ∞ ∞ ∞ 0 ∞
v7 ∞ 1 ∞ ∞ ∞ ∞ 0
104 de 248
Manual de algorítmica La primera hoja encontrada es el vértice v3 y v3-v1 es la arista que incide en v3. Eliminamos dicha arista y añadimos v1 a la secuencia. S = {v1}.
v1 v2 v3 v4 v5 v6 v7
v1 0 1 ∞ ∞ 1 ∞ ∞
v2 1 0 ∞ ∞ ∞ 1 1
v3 ∞ ∞ 0 ∞ ∞ ∞ ∞
v4 ∞ ∞ ∞ 0 ∞ ∞ ∞
v5 1 ∞ ∞ ∞ 0 ∞ ∞
v6 ∞ 1 ∞ ∞ ∞ 0 ∞
v7 ∞ 1 ∞ ∞ ∞ ∞ 0
El árbol nos quedaría
Borrego Ropero Rafael Recio Domínguez Daniel
105 de 248
Manual de algorítmica La primera hoja encontrada es el vértice v4 y v4-v2 es la arista que incide en v4. Eliminamos dicha arista y añadimos v2 a la secuencia. S = {v1, v2}.
v1 v2 v3 v4 v5 v6 v7
v1 v2 0 1 1 0 ∞ ∞ ∞ 1 1 ∞ ∞ 1 ∞ 1
v3 ∞ ∞ 0 ∞ ∞ ∞ ∞
v4 ∞ 1 ∞ 0 ∞ ∞ ∞
v5 1 ∞ ∞ ∞ 0 ∞ ∞
v6 ∞ 1 ∞ ∞ ∞ 0 ∞
v7 ∞ 1 ∞ ∞ ∞ ∞ 0
El árbol nos quedaría
Borrego Ropero Rafael Recio Domínguez Daniel
106 de 248
Manual de algorítmica La primera hoja encontrada es el vértice v5 y v5-v1 es la arista que incide en v5. Eliminamos dicha arista y añadimos v1 a la secuencia. S = {v1, v2, v1}.
v1 v2 v3 v4 v5 v6 v7
v1 0 1 ∞ ∞ ∞ ∞ ∞
v2 1 0 ∞ ∞ ∞ 1 1
v3 ∞ ∞ 0 ∞ ∞ ∞ ∞
v4 ∞ ∞ ∞ 0 ∞ ∞ ∞
v5 ∞ ∞ ∞ ∞ 0 ∞ ∞
v6 ∞ 1 ∞ ∞ ∞ 0 ∞
v7 ∞ 1 ∞ ∞ ∞ ∞ 0
El árbol nos quedaría
Borrego Ropero Rafael Recio Domínguez Daniel
107 de 248
Manual de algorítmica La primera hoja encontrada es el vértice v6 y v6-v2 es la arista que incide en v6. Eliminamos dicha arista y añadimos v2 a la secuencia. S = {v1, v2, v1, v2}.
v1 v2 v3 v4 v5 v6 v7
v1 0 1 ∞ ∞ ∞ ∞ ∞
v2 1 0 ∞ ∞ ∞ ∞ 1
v3 ∞ ∞ 0 ∞ ∞ ∞ ∞
v4 ∞ ∞ ∞ 0 ∞ ∞ ∞
v5 ∞ ∞ ∞ ∞ 0 ∞ ∞
v6 ∞ ∞ ∞ ∞ ∞ 0 ∞
v7 ∞ 1 ∞ ∞ ∞ ∞ 0
El árbol nos quedaría
Borrego Ropero Rafael Recio Domínguez Daniel
108 de 248
Manual de algorítmica La primera hoja encontrada es el vértice v7 y v7-v2 es la arista que incide en v7. Eliminamos dicha arista y añadimos v2 a la secuencia. S = {v1, v2, v1, v2, v2}.
v1 v2 v3 v4 v5 v6 v7
v1 0 1 ∞ ∞ ∞ ∞ ∞
v2 1 0 ∞ ∞ ∞ ∞ ∞
v3 ∞ ∞ 0 ∞ ∞ ∞ ∞
v4 ∞ ∞ ∞ 0 ∞ ∞ ∞
v5 ∞ ∞ ∞ ∞ 0 ∞ ∞
v6 ∞ ∞ ∞ ∞ ∞ 0 ∞
v7 ∞ ∞ ∞ ∞ ∞ ∞ 0
El árbol nos quedaría
Como el tamaño de la secuencia es n-2 el algoritmo termina, siendo n el número de vértices del árbol el algoritmo termina.
Borrego Ropero Rafael Recio Domínguez Daniel
109 de 248
Manual de algorítmica
Algoritmo de decodificación.
El procedimiento de decodificación siguiente convierte una secuencia de Prüfer en su correspondiente árbol. Este procedimiento de decodificación establece una función fd: Pn-2 Tn que hace corresponder a un conjunto de secuencias de Prüfer de longitud n-2 un conjunto de árboles de n vértices. El algoritmo recibe como entrada el número de vértices “n” que debe tener el árbol a generar y una secuencia S de n-2 vértices. Los vértices de la secuencia forman parte del árbol y pueden estar repetidos. A partir de la secuencia proporcionada se genera un árbol. El algoritmo podemos dividirlo en X pasos.
PASO 1
Crear un grafo G con “n” vértices. (Sin aristas).
PASO 2
2.1.- Calcular el conjunto de vértices que no forma parte de la secuencia “NS”. 2.2.- Calcular el conjunto de vértices ocupados “VO”. 2.3.- Obtener la diferencia entre ambos conjuntos NS – VO.
PASO 3
Si la secuencia es vacía insertamos una arista formada por los dos vértices incluidos en NS – VO y FIN. En otro caso insertamos la arista que tiene como origen el primer vértice de la secuencia y como destino el primer vértice de la diferencia NS – VO. Seguidamente eliminar el primer vértice de la secuencia y volver al PASO 2.
Borrego Ropero Rafael Recio Domínguez Daniel
110 de 248
Manual de algorítmica
Borrego Ropero Rafael Recio Domínguez Daniel
111 de 248
Manual de algorítmica Veamos el siguiente ejemplo:
Sea n = 7 y la secuencia S = {v1, v2, v4, v6, v2}.
PASO 1
Sea G el grafo:
Borrego Ropero Rafael Recio Domínguez Daniel
112 de 248
Manual de algorítmica PASO 2.1
Secuencia
S = {v1, v2, v4, v6, v2}.
Vértices no incluidos en la secuencia
NS = {v3, v5, v7}.
Vértices ocupados VO = {}.
PASO 3.1
Como la secuencia no está vacía formamos una arista que posee como origen el primer vértice de la secuencia y como destino el primer vértice de la diferencia entre NS y VO. Calculamos la diferencia entre NS y VO. NS –VO = {v3, v5, v7}. Insertamos en G la nueva arista secuencia.
Borrego Ropero Rafael Recio Domínguez Daniel
v1-v3 y eliminamos v1 de la
113 de 248
Manual de algorítmica
PASO 2.2
Secuencia
S = {v2, v4, v6, v2}.
Vértices no incluidos en la secuencia
NS = {v1, v3, v5, v7}.
Vértices ocupados VO = {v3}. PASO 3.2
Como la secuencia no está vacía formamos una arista que posee como origen el primer vértice de la secuencia y como destino el primer vértice de la diferencia entre NS y VO. Calculamos la diferencia entre NS y VO. NS –VO = {v1, v5, v7}. Insertamos en G la nueva arista secuencia.
Borrego Ropero Rafael Recio Domínguez Daniel
v2-v1 y eliminamos v2 de la
114 de 248
Manual de algorítmica
Borrego Ropero Rafael Recio Domínguez Daniel
115 de 248
Manual de algorítmica
PASO 2.3
Secuencia
S = {v4, v6, v2}.
Vértices no incluidos en la secuencia NS = {v1, v3, v5, v7}. Vértices ocupados VO = {v1, v3}. PASO 3.3
Como la secuencia no está vacía formamos una arista que posee como origen el primer vértice de la secuencia y como destino el primer vértice de la diferencia entre NS y VO. Calculamos la diferencia entre NS y VO. NS –VO = {v5, v7}. Insertamos en G la nueva arista secuencia.
Borrego Ropero Rafael Recio Domínguez Daniel
v4-v5 y eliminamos v4 de la
116 de 248
Manual de algorítmica PASO 2.4
Secuencia
S = {v6, v2}.
Vértices no incluidos en la secuencia NS = {v1, v3, v4, v5, v7}. Vértices ocupados VO = {v1, v3, v5}. PASO 3.4
Como la secuencia no está vacía formamos una arista que posee como origen el primer vértice de la secuencia y como destino el primer vértice de la diferencia entre NS y VO. Calculamos la diferencia entre NS y VO. NS –VO = {v4, v7}. Insertamos en G la nueva arista secuencia.
Borrego Ropero Rafael Recio Domínguez Daniel
v6-v4 y eliminamos v6 de la
117 de 248
Manual de algorítmica PASO 2.5
Secuencia
S = {v2}.
Vértices no incluidos en la secuencia NS = {v1, v3, v4, v5, v6, v7}. Vértices ocupados VO = {v1, v3, v4, v5}. PASO 3.5
Como la secuencia no está vacía formamos una arista que posee como origen el primer vértice de la secuencia y como destino el primer vértice de la diferencia entre NS y VO. Calculamos la diferencia entre NS y VO. NS –VO = {v6, v7}. Insertamos en G la nueva arista secuencia.
Borrego Ropero Rafael Recio Domínguez Daniel
v2-v6 y eliminamos v2 de la
118 de 248
Manual de algorítmica PASO 2.6
Secuencia
S = {}.
Vértices no incluidos en la secuencia NS = {v1, v2, v3, v4, v5, v6, v7}. Vértices ocupados VO = {v1, v3, v4, v5, v6}. PASO 3.6
Como la secuencia está vacía solo nos falta insertar una arista. Los vértices que forman parte de la misma se obtienen calculando la diferencia entre NS y VO. Calculamos la diferencia entre NS y VO. NS –VO = {v2, v7}. Insertamos en G la nueva arista v2-v7 y FIN.
Borrego Ropero Rafael Recio Domínguez Daniel
119 de 248
Manual de algorítmica
3.7.- Algoritmo de emparejamientos Un emparejamiento de un grafo simple G, es cualquier subgrafo 1-regular de G, es decir un subgrafo inducido por las aritas dos a dos no incidentes entre sí) Un emparejamiento máximo en un grafo G es cualquier emparejamiento de G de orden máximo, es decir, con el mayor número de vértices posibles. Un emparejamiento maximal de peso óptimo en un grafo G es un emparejamiento de G de orden máximo donde la suma de las ponderaciones de las aristas es máxima o mínima. Un emparejamiento es completo o perfecto si tiene exactamente p/2 aristas, siendo “p” el orden del grafo. Sea M un emparejamiento, se denomina arista emparejada respecto de “M” a cada una de las aristas de G que están en “M”. Si dicha arista no esta en “M” se dice que no esta emparejada. Se llaman vértice emparejado con respecto a “M” a cada uno de los vértices incidentes con alguna arista de “M”, en otro caso se trata de un vértice no emparejado. Una vez que tenemos claros los conceptos anteriores comentaremos los tres algoritmos de emparejamientos.
Borrego Ropero Rafael Recio Domínguez Daniel
120 de 248
Manual de algorítmica
Algoritmo de emparejamiento maximal simple
La implementación del algoritmo trata de buscar un emparejamiento mediante un camino alternado. Se denomina camino alternado de G con respecto a “M” a un camino de G cuyas aristas son alternativamente emparejadas y no emparejada. En cada paso se escoge un vértice no emparejado y busca un camino alternado aumentante mediante BFS. En el camino no pueden a parecer vértices repetidos. Dicho camino deja de expandirse en cuanto encontremos un vértice de G que no haya sido emparejado. Repetimos este proceso para el resto de vértice del grafo. Al final obtendremos un emparejamiento maximal que puede ser completo si todos los vértices del grafo han sido emparejados. Veamos un ejemplo:
Borrego Ropero Rafael Recio Domínguez Daniel
121 de 248
Manual de algorítmica
Borrego Ropero Rafael Recio Domínguez Daniel
122 de 248
Manual de algorítmica Comenzamos por el vértice v1 formado por las aristas.
y construimos el camino alternado
M = {v1, v6}. A continuación pasamos al vértice v2. M = {v2, v8}.
Para el vértice v3 = {v3,v7}
Borrego Ropero Rafael Recio Domínguez Daniel
123 de 248
Manual de algorítmica
Borrego Ropero Rafael Recio Domínguez Daniel
124 de 248
Manual de algorítmica Para el vértice v4 = {v4, v9}.
Para el vértice v5 = {{v5, v9}, {v4, v6}, {v1, v7}, {v2, v8}, {v3, v10}}
Borrego Ropero Rafael Recio Domínguez Daniel
125 de 248
Manual de algorítmica
Borrego Ropero Rafael Recio Domínguez Daniel
126 de 248
Manual de algorítmica Finalmente el emparejamiento nos queda.
Borrego Ropero Rafael Recio Domínguez Daniel
127 de 248
Manual de algorítmica
Algoritmo de Kuhn-Munkres
Se trata de un algoritmo de emparejamiento de peso máximo para grafos ponderados, bipartitos y completos. Los grafos bipartitos completos km,n, son grafos de (n + m) vértices y (m * n) aristas que admiten una partición de sus vértices en sendos conjuntos V y U de “m” y “n” vértices respectivamente, de manera que cada uno de los “m” vértices de V es adyacente a todos y cada uno de los “n” vértices de U. Se denominan bipartitos completos porque no se pueden añadir arista alguna sin que deje de ser bipartito. Otro concepto importante es el de matriz de pesos del grafo. Se trata de una matriz que posee tantas filas y columnas como elementos tiene los conjuntos X e Y respectivamente. Cada posición de la matriz almacena la ponderación de una arita cuyo origen pertenece al conjunto X y el destino al conjunto Y. Ahora explicaremos de forma detallada los cuatro pasos en los que hemos dividido el algoritmo.
PASO 1
P.1.1.- Identificar los conjuntos V y U de vértices. P.1.2.- Obtener la matriz de pesos del grafo “MatrizPesos”. Sean “i” y “j” los índices para iterar por la matriz de pesos del grafo. P.1.3.- Consideremos las tuplas L(vi) y L(uj) con un tamaño igual al número de vértices que forman parte del conjunto V y U respectivamente. Inicializamos las tuplas con un etiquetado viable L(vi) se inicializa con el máximo de la fila correspondiente al vértice “vi” en MatrizPesos[i, j] con (j