Torres de Hanói
Las Torres de Hanói es un rompecabezas o juego matemático inventado en 1883 por el matemático francés Édouard Lucas.[1] Este juego de mesa individual consiste en un número de discos perforados de radio creciente que se apilan insertándose en uno de los tres postes fijados a un tablero. El objetivo del juego es trasladar la pila a otro de los postes siguiendo ciertas reglas, como que no se puede colocar un disco más grande encima de un disco más pequeño. El problema es muy conocido en la ciencia de la computación y aparece en muchos libros de texto como introducción a la teoría de algoritmos. La fórmula para encontrar el número de movimientos necesarios para transferir n discos desde un poste a otro es: 2n - 1. DescripciónEl juego, en su forma más tradicional, consiste en tres postes verticales. En uno de los postes se apila un número indeterminado de discos perforados por su centro (elaborados de madera), que determinará la complejidad de la solución. Por regla general se consideran siete discos. Los discos se apilan sobre uno de los postes en tamaño decreciente de abajo arriba. No hay dos discos iguales, y todos ellos están apilados de mayor a menor radio -desde la base del poste hacia arriba- en uno de los postes, quedando los otros dos postes vacíos. El juego consiste en pasar todos los discos desde el poste ocupado (es decir, el que posee la torre) a uno de los otros postes vacíos. Para realizar este objetivo, es necesario seguir tres simples reglas:
Existen diversas formas de llegar a la solución final, todas ellas siguiendo estrategias diversas. HistoriaEl rompecabezas fue inventado por el matemático francés Édouard Lucas en 1883. Se cuenta una historia sobre un templo en la India en Kashi Vishwanath que contiene una gran sala con tres postes gastados por el tiempo, rodeada de 100 discos dorados. Los sacerdotes de Brahma, actuando bajo el mandato de una antigua profecía, han estado moviendo estos discos de acuerdo con las reglas inmutables de Brahma desde ese momento. Por lo tanto, el acertijo también se conoce como el rompecabezas de la Torre de Brahma. Según la leyenda, cuando se complete el último movimiento del rompecabezas, el mundo se terminará.[2] No está claro si Lucas inventó esta leyenda o si se inspiró en ella. Si la leyenda fuera cierta, y si los sacerdotes pudieran mover los discos a una velocidad de uno por segundo, utilizando el menor número de movimientos, completar la tarea les llevaría 2100 - 1 segundos, o aproximadamente 4.019 cuatrillones de años, que es aproximadamente 290.942 cuatrillones de veces la edad actual del Universo. Existen muchas variaciones en esta leyenda. Por ejemplo, en algunos relatos el templo es un monasterio, y los sacerdotes son monjes. Se puede decir que el templo o monasterio se encuentra en diferentes partes del mundo, incluidos Hanói, Vietnam, y puede estar asociado con cualquier religión. En algunas versiones, se introducen otros elementos, como el hecho de que la torre fue creada en el comienzo del mundo, o que los sacerdotes o monjes solo pueden hacer un movimiento por día. ResoluciónLa solución del problema de las Torres de Hanói es muy fácil de hallar, aunque el número de pasos para resolver el problema crece exponencialmente conforme aumenta el número de discos.Como ya se ha indicado, el número mínimo de movimientos necesarios para resolver un rompecabezas de la Torre de Hanói es 2n - 1, donde n es la cantidad de discos.[3] Una manera sencilla para saber si es posible terminar el "juego" es que si la cantidad de discos es impar la pieza inicial irá a destino y si es par a auxiliar. Solución simpleUna forma de resolver el problema se fundamenta en el disco más pequeño, el de más arriba en la varilla de origen. En un juego con un número par de discos, el movimiento inicial de la varilla origen es hacia la varilla auxiliar. El disco n.o 2 se debe mover, por regla, a la varilla destino. Luego, el disco n.o 1 se mueve también a la varilla destino para que quede sobre el disco n.o 2. A continuación, se mueve el disco que sigue de la varilla origen, en este caso el disco n.o 3, y se coloca en la varilla auxiliar. Finalmente, el disco n.o 1 regresa de la varilla destino a la origen (sin pasar por la auxiliar), y así sucesivamente. Es decir, el truco está en el disco más pequeño. Mediante recursividadEste problema se suele plantear a menudo en programación, especialmente para explicar la recursividad. Si numeramos los discos desde 1 hasta n, si llamamos origen a la primera pila de discos, destino a la tercera y auxiliar a la intermedia, y si a la función la denomináramos hanoi, con origen, auxiliar y destino como parámetros, el algoritmo de la función sería el siguiente:
El número de movimientos mínimo a realizar para resolver el problema de este modo es de 2n – 1, siendo n el número de discos. IterativaOtra manera de resolver el problema, sin utilizar la recursividad, se basa en el hecho de que para obtener la solución más corta, es necesario mover el disco más pequeño en todos los pasos impares, mientras que en los pasos pares solo existe un movimiento posible que no lo incluye. El problema se reduce a decidir en cada paso impar a cuál de las dos pilas posibles se desplazará el disco pequeño. El algoritmo en cuestión depende del número de discos del problema:
Una forma equivalente de resolverlo es la siguiente: coloreando los discos pares de un color y los impares de otro, y se resuelve el problema añadiendo la siguiente regla: no colocar juntos dos discos de un mismo color. De esta manera, solo queda un movimiento posible (además del de volver hacia atrás).[4] Reglas matemáticas de los desplazamientosA la hora de resolver matemáticamente el problema, se producen numerosas circunstancias matemáticas particulares respecto a la resolución. Son las siguientes:
Demostración recurrente y por inducción.Tengamos un plato de Hanói con tres varillas colocadas tal que la primera contenga los n discos ordenados y las otras dos varillas no contengan nada. Empecemos definiendo el ejercicio más básico, tenemos un solo disco, por tanto el movimiento del primer plato al último es 1 solo paso.
pues con 0 discos no hay movimiento que hacer; para realizar la demostración no es necesario considerar este resultado pues no tiene sentido 0 discos en una torre de Hanói aunque se pueda considerar válido.
Para dos discos tenemos que mover el pequeño a la varilla auxiliar, el grande a la final y el pequeño a la final para un total de 3 pasos.
Para tres discos tenemos que movimientos necesarios mínimos.
Fórmula generalTengamos un estado que denota la cantidad de movimientos a realizar para n discos. Para hallar la ecuación hay que aplicar una hipótesis que apoye la ecuación a demostrar:
Por tanto la fórmula final que nos queda es:
Reordenándola:
Es una ecuación sencilla que se podría resolver fácilmente y llegar a la conclusión que para n discos dados los movimientos son: Sin embargo, vamos a resolverla paso por paso para estudiarla. En este caso podemos convertir los término dependientes de cada iteración en raíces polinomiales teniendo en cuenta que el grado del polinomio será del orden del menor término que haya presente, en este caso tomamos el 1 como grado del polinomio pues el menor término es , si hubiese un k sería el grado del polinomio.
En este caso solo tenemos una raíz simple son multiplicidad 1. Tenemos por tanto que aplicando la fórmula general: En este caso solo existe una r, por tanto, donde falta hallar el coeficiente C
Realizando un cambio de variable, es decir sustituyendo los términos temporales, : , por lo tanto . La variable obtenida es el término independiente necesario para completar la ecuación. Recuperamos la homogénea asociada con y hallamos su resultado: . Igualamos a las condiciones iniciales.
Nota: Se puede realizar también con pero como tal una torre de Hanói con 0 discos carece de sentido por lo que se utiliza , el cual es el primer elemento de la sucesión. Si se utilizase otro el resultado no coincidiría pues es un polinomio de grado uno y se está utilizando un elemento de la sucesión que supera dicho rango. Por tanto el resultado final obtenido es: . Comprobación por Inducción.Para la inducción débil partimos de la misma premisa que en la fórmula general pero en este paso utilizaremos otro método de verificación que en casos más sencillos como este ejercicio puede resultar más útil pero no es válido para todo tipo de sucesiones o ecuaciones en diferencia. Tenemos un primer movimiento: . y previamente debido a la anterior demostración sabemos que para el movimiento . Por tanto vamos a efectuar una concatenación de movimientos.
Aplicando recurrencia descendente podemos llegar a la conclusión que
El siguiente paso es el deductivo y es el más importante pues una mala deducción llevara a un resultado. Podemos observar que para tenemos un 2 multiplicando y un 1 sumando. si hacemos lo mismo en obtenemos el mismo resultado respecto a . Vemos que para n elementos dados obtenemos (n-1) 'doses' multiplicándose entre sí y (n-1) 1 multiplicados por sucesivos 'doses' tenemos que
En este caso la dificultad proviene en hallar el resultado de la suma sucesiva de potencias de orden 2, En último caso podemos aplicar inducción débil para verificar que el resultado obtenido es el correcto: Inducción débil.
Paso base: k=1
Paso inductivo: ¿Se verifica ? ; pues ; Se verifica por inducción la veracidad de la fórmula.
Rutas más cortas generales y el número 466/885Una curiosa generalización del objetivo original del rompecabezas es comenzar desde una configuración dada de los discos, donde todos los discos no están necesariamente en el mismo poste, y llegar en un número mínimo de movimientos a otra configuración determinada. En general, puede ser bastante difícil calcular una secuencia más corta de movimientos para resolver este problema. Andreas Hinz propuso una solución y se basa en la observación de que, en la secuencia más corta de movimientos, se debe mover el disco más grande (obviamente, pueden ignorarse todos los discos más grandes que ocuparán el mismo poste tanto en la configuraciones inicial como en la final) se moverá exactamente una vez o exactamente dos veces. Las matemáticas relacionadas con este problema generalizado se vuelven aún más interesantes cuando se considera el número promedio de movimientos en la secuencia más corta de movimientos entre dos configuraciones de disco iniciales y finales que se eligen al azar. Hinz y Chan Hat-Tung descubrieron de forma independiente[5][6] (véase también [7]: Chapter 1, p. 14 ) que la cantidad promedio de movimientos en una torre de n discos viene dada por la siguiente fórmula exacta: Tenga en cuenta que para n lo suficientemente grande, solo el primer y el segundo término no convergen a cero, por lo que obtenemos un expresión asintótica:, cuando . Así, intuitivamente, se podría interpretar que la fracción de representa la relación del trabajo que se debe realizar al pasar de una configuración elegida al azar a otra configuración elegida al azar, en relación con la dificultad de tener que cruzar la ruta de longitud "más difícil" que implica mover todos los discos de un poste a otro. Una explicación alternativa para la aparición de la constante 466/885, así como un algoritmo nuevo y algo mejorado para calcular la ruta más corta, fue dada por Romik.[8] AlgoritmosSe presentan varias funciones recursivas que permiten implementar directamente la solución al problema de las Torres de Hanói. La primera solución es una función en lenguaje Java. static void towerOfHanoi(int n, char from_rod, char to_rod, char aux_rod) { if (n == 1) { System.out.println("Move disk 1 from rod " + from_rod + " to rod " + to_rod); return; } towerOfHanoi(n-1, from_rod, aux_rod, to_rod); System.out.println("Move disk " + n + " from rod " + from_rod + " to rod " + to_rod); towerOfHanoi(n-1, aux_rod, to_rod, from_rod); } La segunda solución es en lenguaje C. void towerOfHanoi(int n, char from_rod, char to_rod, char aux_rod) { if (n == 1) { printf("Mover disco 1 desde el eje %c al eje %c\n", from_rod, to_rod); return; } towerOfHanoi(n - 1, from_rod, aux_rod, to_rod); printf("Mover disco %d desde el eje %c al eje %c\n", n, from_rod, to_rod); towerOfHanoi(n - 1, aux_rod, to_rod, from_rod); } Comentario: el algoritmo que resuelve el problema de las torres de Hanói no es paralelizable, no es posible aplicar ninguna estrategia de paralelismo como con OpenMP o CUDA. VariantesHenry Dudeney en su libro The Canterbury Puzzles (1907) propuso una variante (llamada «Problema del almojarife» o The reve's puzzle) que usa cuatro postes en lugar de tres.[9] En 1939, J. S. Frame y B. M. Stewart propusieron —en forma independiente— un algoritmo que resuelve el problema, dado un parámetro i:
Y demostraron que, si n es igual al número triangular tk, la elección óptima para i es justamente k, y si tk – 1 < n < tk, tanto k – 1 como k lo son. Nótese que se está hablando del valor óptimo para este algoritmo particular; encontrar el número mínimo de movimientos en el caso general es, todavía, una cuestión abierta. Sin embargo, para n menor o igual a 30 discos se ha verificado que el algoritmo de Frame-Stewart es, efectivamente, óptimo.[10] Véase tambiénNotas y referencias
Enlaces externos
|