Ayer, un artículo interactivo de divulgación sobre el funcionamiento interno de los ascensores se posicionó en lo más alto de Hacker News, la mayor comunidad de desarrolladores del mundo, alcanzando 771 puntos y 198 comentarios. Los ingenieros pasaron el día entero debatiendo la lógica de programación de los ascensores.
El punto de partida fue una observación contraintuitiva: en muchos edificios de oficinas modernos se han eliminado los botones de planta del interior de las cabinas, trasladándolos al vestíbulo principal. El usuario selecciona su piso de destino antes de entrar y el sistema le asigna una cabina específica. Sin embargo, en la mayoría de los escenarios simulados, este sistema de «asignación de destino» (Destination Dispatch) resulta ser más lento que los tradicionales botones de subida y bajada. La sección de comentarios se llenó rápidamente de ingenieros de ascensores, desarrolladores de controladores de disco y gestores hoteleros aportando sus experiencias.
El ascensor es algo que casi todo el mundo utiliza a diario, pero muy pocos conocen la complejidad técnica que esconde. El artículo original explica esta mecánica mediante simulaciones interactivas: cada algoritmo cuenta con una animación a velocidad ajustable donde el lector puede añadir plantas y ascensores para observar en tiempo real cómo cambia la distribución de los tiempos de espera. A continuación, sintetizamos los detalles más relevantes debatidos por la comunidad.
Por qué es tan difícil programar un ascensor
Primero hay que considerar las restricciones físicas. Un ascensor solo puede desplazarse en una dirección a la vez; la capacidad de pasajeros es limitada; y a mayor número de plantas, las combinaciones posibles se multiplican. Cuando funcionan varias cabinas en paralelo, decidir a quién recoger y en qué orden se convierte en un problema complejo de planificación (scheduling).
El flujo de pasajeros es además profundamente asimétrico. En la hora punta matutina de un edificio de oficinas, casi todo el mundo viaja desde el vestíbulo hacia las plantas altas; por la tarde ocurre lo contrario; y a mediodía el tráfico es mixto. Un mismo conjunto de reglas produce rendimientos radicalmente opuestos según la hora del día. Optimizar las métricas de espera durante la hora punta de la mañana es uno de los retos más difíciles.
A esto se suma la gestión de grupos (Group Control): en edificios de oficinas, un grupo de cinco o seis cabinas suele compartir un único panel de llamadas. Cuando un usuario pulsa el botón de subida, el sistema debe decidir qué cabina enviar. Esta decisión se recalcula constantemente a medida que las cabinas se mueven, la gente entra y las peticiones cambian. Ahí radica la dificultad: las reglas para una sola cabina son simples, pero la coordinación entre varias resulta sumamente compleja.
Cómo funcionan los ascensores tradicionales
El algoritmo estándar más común se denomina SCAN, patentado ya en 1961. El ascensor sube desde el vestíbulo hasta la planta más alta y luego invierte su marcha para bajar, recogiendo a los pasajeros que van en su misma dirección, como si fuera un autobús de línea. Los científicos informáticos descubrieron que el cabezal de lectura/escritura de un disco duro se desplaza exactamente de la misma manera y adoptaron el término «algoritmo del ascensor» (Elevator Algorithm).
Dado que rara vez todos los pasajeros necesitan ir al piso superior, se desarrolló una versión optimizada llamada LOOK. Con LOOK, la cabina solo avanza hasta la petición más lejana en su dirección actual antes de dar la vuelta. Este es el comportamiento con el que la mayoría estamos familiarizados: mantener la dirección, recoger a quienes están en el camino e invertir el sentido solo cuando no quedan más peticiones por delante.
Figura: Demostración de simulación interactiva de John.fun. Fuente: john.fun/elevators
El criterio para medir la eficacia de un ascensor es el tiempo de espera, evaluado formalmente a través de su distribución estadística: p50 representa el tiempo que espera la mitad de los usuarios, mientras que p90 indica el tiempo límite para el 90 % de los pasajeros. Casi nadie recuerda el tiempo medio de espera; lo que queda en la memoria son esas contadas ocasiones en las que pareció pasar «una eternidad». Por ello, la optimización de algoritmos se centra principalmente en contener la latencia del percentil p90.
Figura: Demostración de la distribución del tiempo de espera en John.fun. Fuente: john.fun/elevators
Existe también un compromiso fundamental: esperar poco no garantiza un trayecto corto. Para recoger a más personas por el camino, el ascensor realiza paradas frecuentes, lo que prolonga el tiempo que el pasajero permanece dentro de la cabina. Minimizar el tiempo de espera suele hacerse a expensas de la duración del viaje, y los algoritmos deben encontrar un equilibrio entre ambos factores.
Más inteligente no siempre significa mejor
Cuando operan varios ascensores, el enfoque más básico es la gestión centralizada: asignar las nuevas peticiones a la cabina más cercana. Pero los ingenieros no se detuvieron ahí. Otis desarrolló el algoritmo RSR (Relative System Response), que asigna puntuaciones dinámicas a cada cabina según el tiempo estimado de llegada, la carga actual, la penalización por agruparse (anti-clustering), la coincidencia de dirección y la disponibilidad de vehículos libres cercanos. La cabina con mejor puntuación asume la llamada. El sistema recalcula la asignación cada 5 segundos; si la cabina A se retrasa, la tarea se reasigna automáticamente a la cabina B.
RSR incluye una regla contra el agrupamiento: si otra cabina ya se dirige a la misma planta, la segunda no acude a la misma llamada. Cuando dos ascensores llegan simultáneamente al vestíbulo y abren sus puertas a la vez, es el resultado de un fallo en la lógica de anti-clustering. La evaluación se realiza en tiempo real y cambia con cada piso que avanza una cabina.
Sin embargo, los resultados de la simulación arrojaron una sorpresa: a mayor volumen de tráfico, el algoritmo simple LOOK superaba al complejo RSR. En edificios pequeños o con pocas cabinas, LOOK también resultaba ganador con frecuencia. Añadir más reglas no garantiza mayor rapidez; a veces, mantener la simplicidad es la mejor opción. Esto supone una lección de ingeniería: entre la complejidad del algoritmo y la mejora del rendimiento media el escenario de uso real.
La controversia de la asignación de destino
La lógica tras la asignación de destino (Destination Dispatch) parece impecable: si el sistema conoce de antemano a qué planta se dirige cada persona, puede agrupar en la misma cabina a los pasajeros que van al mismo piso, reduciendo drásticamente las paradas intermedias. Al disponer de información completa, la eficiencia teórica debería ser superior. Este sistema basado en quioscos es cada vez más habitual en hoteles, hospitales y rascacielos.
Sin embargo, la simulación del artículo demostró lo contrario: en la mayoría de los casos, la asignación de destino resultó ser más lenta que los botones tradicionales de subida y bajada. El motivo radica en la pérdida de flexibilidad. Los ascensores tradicionales pueden reoptimizar su ruta cada 5 segundos. En cambio, la asignación de destino bloquea al pasajero en una cabina determinada desde el momento en que interactúa con el quiosco. Si 30 segundos después las condiciones del tráfico cambian por completo, el sistema no puede modificar la asignación. La ventaja de la información previa no compensa la pérdida de adaptabilidad en tiempo real.
Varios ingenieros en los comentarios matizaron esta conclusión. Señalaron que en las horas de almuerzo de los edificios de oficinas reales, grandes grupos de personas se desplazan simultáneamente a la misma planta del restaurante, un patrón donde la asignación de destino destaca gracias al procesamiento por lotes (batching). De igual modo, en los hoteles el tráfico matutino cambia a modos específicos de desayuno. Al no incluir la simulación estos modos de tráfico especializados, los resultados favorecieron a los algoritmos antiguos. Ambas posturas son válidas: la eficacia de la asignación de destino depende del patrón de tráfico específico. Aunque sigue siendo la opción predilecta en muchos rascacielos modernos, la afirmación de que «lo nuevo siempre es más rápido» no se sostiene de forma universal.
Figura: Demostración del sistema de asignación de destino de John.fun. Fuente: john.fun/elevators
Un disco duro es un ascensor enrollado
Un detalle destacado en los comentarios que llamó la atención del autor es que el algoritmo SCAN es exactamente el mismo que se utiliza para la planificación de los cabezales en los discos duros de ordenador. En Wikipedia, la entrada aparece bajo dos títulos: «Elevator algorithm» y «SCAN». Originalmente se diseñó para coordinar las peticiones de lectura y escritura en los discos magnéticos.
En un disco duro mecánico, el cabezal se desplaza por las pistas del plato del mismo modo que un ascensor se mueve entre plantas para recoger pasajeros. Las peticiones de lectura y escritura están dispersas por la superficie del disco; el cabezal barre en una dirección atendiendo peticiones a su paso y, al llegar al extremo, invierte el sentido. El movimiento de búsqueda (seek) del cabezal es una de las operaciones mecánicas más lentas de todo el ordenador, y lo que ahorra el algoritmo es precisamente ese tiempo mecánico. Como bromeaba un desarrollador: «Un disco duro no es más que un ascensor enrollado sobre sí mismo».
En los libros de texto de informática, SCAN es un capítulo clásico de planificación de E/S de disco. La patente de ascensores de 1961 y los manuales de sistemas operativos comparten el mismo principio fundamental. Cuando Donald Knuth analizó las corrutinas en The Art of Computer Programming, utilizó como ejemplo principal la simulación de un ascensor. Uno transporta personas y el otro datos, pero la lógica de control es idéntica.
Hoy en día, este algoritmo se está retirando paulatinamente de los discos duros debido a que las unidades de estado sólido (SSD) ofrecen tiempos de búsqueda casi nulos. Sin embargo, en los ascensores sigue funcionando a diario. Una misma idea conceptual ha perdurado desde la patente de 1961 hasta nuestros días, conectando la ingeniería mecánica con la ciencia de la computación.
Conclusión
Cuando un ascensor tarda en llegar, no es que ignore su llamada; simplemente está procesando múltiples variables simultáneamente. La próxima vez que espere frente a la puerta del ascensor, piense que detrás de cada botón pulsado hay generaciones de ingenieros debatiendo cómo optimizar el algoritmo, y que algunas de esas discusiones siguen sin resolverse en la actualidad.
Enlaces de referencia:
- John.fun: Elevators Explicación interactiva
- Discusión en HN (item?id=49124218)