Saltar al contenido

¿Cómo se resuelve Eternity II con un ordenador?

Aquí no hay magia, solo tres grandes ideas: probar posibilidades una a una, deshacer los errores y calcular hasta dónde puede dispararse el coste. Cada número y cada gráfico de esta página los midió el mismo motor Rust que impulsa el área de juego, ejecutándose sobre puzzles que él mismo generó.

1 · Búsqueda en profundidad: la estrategia del laberinto

Imagina que exploras un laberinto: en cada cruce tomas el primer pasillo que aún no has probado; y en cuanto topas con un callejón sin salida, vuelves al último cruce y tomas el siguiente pasillo. Eso es la búsqueda en profundidad (DFS), y es exactamente como nuestro solucionador ataca Eternity II. El «cruce» es una casilla vacía; los «pasillos» son cada pieza × rotación que todavía encaja; y a esa «vuelta atrás» se la llama backtracking.

El DFS es completo: dale tiempo suficiente y lo prueba todo, así que si existe una solución, acabará encontrándola. La trampa está en esas palabras: «tiempo suficiente». Aquí lo tienes, ralentizado a una decisión por segundo:

Cargando el motor…
▶ Ahora míralo a toda velocidad

2 · El muro exponencial

Y ese «todo», ¿cómo de grande es? Para un puzzle n×n hay aproximadamente n²! formas de ordenar las piezas, multiplicadas por sus 4 rotaciones cada una. El gráfico de abajo muestra el número de cifras de esa cuenta. Fíjate en que es una línea casi recta: cada escalón de tamaño multiplica el trabajo por un factor astronómico. La caja 16×16 que tienes en la estantería se sitúa en unas 560 cifras.

Cifras del tamaño del espacio de búsqueda, según el tamaño del tablero

La línea azul encierra la primera lección del diseño de algoritmos: una deducción encoge mundos. Con solo notar que las piezas de esquina van en las esquinas y las de borde en el perímetro, ya se tachan unas 100 cifras. Los solucionadores de verdad encadenan muchas deducciones así. Y aún no basta ni de lejos.

¿Cuánto ocupa un número de 560 cifras? Esto:

10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Un 1 seguido de 559 ceros: 560 cifras, exactamente tantas como la cuenta real (unos 9 × 10^559). Cada cero de más multiplica la cuenta por diez.

La palabra «cifras» sigue siendo abstracta, así que hagámoslo personal:

¿Cuánto tardaría tu ordenador en probarlo todo?

Midiendo tu máquina…

3 · La dificultad, medida: tamaño y colores

Generamos cientos de mini-puzzles y dejamos que el motor resolviera cada uno, contando los nodos (los emplazamientos de pieza puestos a prueba) hasta la primera solución (mediana de 10 puzzles aleatorios por punto; ¡escala logarítmica!). Hay tres cosas que ver. Cada fila de más en el tablero multiplica el trabajo: las líneas se separan por varios órdenes de magnitud. Añadir colores suele hacer el puzzle más fácil, porque un emplazamiento erróneo se rechaza antes en lugar de arrastrar la búsqueda al fondo de un callejón sin salida. Y cada línea revela algo célebre: un marcado pico de dificultad. Muy pocos colores → soluciones a montones, fáciles de encontrar por azar. Muchos colores → un puzzle tan restringido que la búsqueda apenas se ramifica. El pico se aloja justo en medio y, sobre todo, se desplaza hacia la derecha a medida que crece el tablero: la línea 6×6 culmina en 4 colores, la línea 8×8 en 6 colores, más o menos un color más por cada fila añadida. En su pico, el puzzle 8×8 mediano exige más de 2 mil millones de emplazamientos de piezas, y la mayoría de las semillas allí tardaron tanto que tuvimos que dejar de medirlas (las mesetas planas son esos puntos censurados). Un color a un lado u otro y todo se derrumba por un factor de cien. Prolonga esa tendencia de un color por fila hasta un tablero 16×16 y el pico cae justo en torno a los 22 colores: exactamente donde se diseñó Eternity II para situarse. No es casualidad que quede más allá del pico; está calibrado para caer sobre él.

Trabajo para resolver (mediana de nodos, escala log) según el número de colores

4 · El orden en que buscas importa. Y mucho.

Mismos puzzles, mismo solucionador. Lo único que cambia es el orden en que se rellenan las casillas. Los órdenes que mantienen cada nuevo emplazamiento pegado a vecinos ya colocados (snake, spiral) restringen cada paso y podan pronto. Los que dispersan los emplazamientos (random) dejan las piezas sin restricción y lo pagan más adelante. Es un tema de investigación de verdad, y puedes diseñar tu propio orden y echarlo a correr. Este es el aspecto real de los órdenes clásicos; sigue las flechas (rojo = primera casilla, verde = última):

Mediana de nodos en los mismos puzzles 6×6, según el orden de relleno (escala log)

Una sutileza que conviene nombrar (gracias a Dan Karlsson): por filas y por columnas son el mismo orden salvo por voltear el tablero sobre su diagonal, así que en muchos puzzles deberían costar lo mismo; cualquier diferencia aquí es ruido de muestreo, no una diferencia real. Los órdenes que difieren de verdad son los de forma distinta: una espiral, una diagonal, el borde primero. Una salvedad: la barra del orden aleatorio es una cota inferior, no una mediana medida: cada ejecución muestreada alcanzó el tope de búsqueda sin terminar, así que su coste real es mayor que el mostrado.

La misma pregunta, llevada hasta el final sobre el puzzle 16×16 completo, es el estudio DFS: mide lo que aporta cada orden de relleno, cada heurística y cada regla de ruptura, y descubre que el orden equivocado puede costar más de 300 puntos de puntuación.

5 · Por qué aquí los ordenadores piensan en binario

Una pieza no es más que cuatro números pequeños (los motivos de arriba, derecha, abajo e izquierda). Ni imágenes, ni geometría. Estas cuatro demos funcionan en directo; obsérvalas unos segundos cada una:

1 · Una pieza entera cabe en 20 bits
=
arriba801000
derecha901001
abajo1201100
izquierda1710001

01000 01001 01100 10001 · un solo número de 20 bits

El ordenador nunca ve el dibujo. A cada uno de los 22 motivos le corresponde un número que cabe en 5 bits, y como una pieza reúne cuatro, son 4 × 5 = 20 bits: un número muy pequeño. El juego oficial completo ocupa apenas 1 KB.

2 · «¿Encaja?» equivale a «¿son iguales los números?»
00111
00111
comparando…

Es una «comprobación de encaje». El procesador compara todos los bits de una vez, en una sola instrucción, en menos de un nanosegundo.

3 · Rotar una pieza = una sola rotación de bits
antes
01000010010110010001
↻ rotate right by 5
después ↻
10001010000100101100

Como una pieza no es más que una palabra de 20 bits, un cuarto de vuelta se reduce a una rotación del procesador: se desplazan los bits 5 posiciones y los que se salen por el final reaparecen al principio. Ningún dibujo se gira de verdad, y pasar por las cuatro orientaciones apenas cuesta nada.

4 · 256 piezas = 256 bits para decir «¿aún libre?»
1111111111111111111111111111111111111111111111111111111111111111

1 = libre · 0 = usada. Los solucionadores rápidos registran las piezas aún sin usar en un único número de 256 bits, un bit por pieza. «¿Está libre la pieza n.º 137?» se reduce a leer un solo bit; «marcarla como usada» invierte un bit. Así, consultar y actualizar la disponibilidad sigue siendo casi instantáneo incluso con 256 piezas. Nuestro propio motor hace exactamente esto.

Guardado como números, el conjunto oficial entero ocupa alrededor de 1 KB. Los solucionadores serios van más allá con los bitsets: un único número de 64 bits transporta una respuesta sí/no sobre 64 piezas a la vez, de modo que una sola instrucción de la CPU filtra 64 candidatas de golpe. Así es como los motores más rápidos alcanzan cientos de millones de nodos por segundo. La representación, y no solo el algoritmo, forma parte del oficio.

6 · Entonces, ¿hasta dónde te lleva la astucia?

Los ataques de vanguardia añaden propagación de restricciones (deducir los emplazamientos forzados antes de probar ninguno), ordenaciones de piezas ingeniosas, búsqueda en paralelo y heurísticas de reparación local que arreglan tableros imperfectos. Alcanzan 469 y 470 de 480 aristas coincidentes. Extraordinario, y aún insuficiente. El hueco entre «casi resuelto» y «resuelto» es donde vive la investigación abierta: consulta la sección Investigación.