Cómo funciona el generador de horarios — y cómo lo medimos

Actualizado el .

Sky traduce las reglas que escribes; un motor de optimización (Timefold) ubica cada clase. En las reglas obligatorias no hay choques: un docente, un grupo y un aula nunca están en dos lugares a la vez. Cuando las reglas de la escuela no caben juntas, el horario muestra qué clases quedaron fuera y por qué.

Respuesta rápida

El generador tiene dos piezas. Sky lee frases como “Prof. Ana solo por la mañana” y guarda cada una como regla de la escuela. El motor Timefold aplica 34 reglas, separadas en obligatorias y preferencias, y busca el mejor horario. En la prueba del 24/10/2026, con escuelas sintéticas de 40 a 80 grupos, los 30 solves terminaron con todas las clases en el horario y ningún choque en las reglas obligatorias. Esos choques se eliminaron en 0,9 a 2,4 s (4,0 a 6,1 s en el primer solve de cada JVM); el resto del tiempo, hasta el límite de 69 a 120 s, se usó para afinar preferencias.

1. Dos papeles: Sky entiende, el motor decide

Sky (lenguaje natural)

Convierte una frase en regla: quién, qué, cuándo y si la regla es obligatoria o solo una preferencia. Cada regla queda listada en la escuela; la coordinación la revisa y borra la que no quiera. Sky no elige el horario de ninguna clase.

Motor de optimización (Timefold)

Recibe grupos, docentes, materias, aulas, horarios y las reglas. Da a cada clase un horario y un aula, evalúa el horario según las reglas y mueve clases mientras el horario mejora o hasta el tiempo límite.

Por qué separarlos

Un chat solo escribe un horario que parece correcto y puede poner al mismo docente en dos aulas. Aquí quien ubica la clase es el motor, que cuenta cada choque. La IA solo traduce.

2. Reglas obligatorias y preferencias

El motor tiene 34 reglas. La escuela marca trece de ellas como obligatoria o como preferencia; contando las dos versiones, son 47 restricciones en el código (archivo TimetableConstraintProvider). Una regla obligatoria no se puede romper: el horario que la rompe no se acepta como terminado. Una preferencia pesa en la nota del horario, y el motor la cumple todo lo que puede.

TipoReglas
Siempre obligatorias (10)Toda clase necesita horario y aula · docente sin dos clases a la misma hora · grupo sin dos clases a la misma hora · aula sin dos clases a la misma hora · aula con el recurso exigido (laboratorio, cancha) · capacidad del aula · grupo dentro de su turno · docente dentro de sus turnos · indisponibilidad del docente por franja horaria · clase doble obligatoria en bloques de 2
Siempre preferencias (11)Grupo en su aula · evitar la misma materia en clases contiguas (fuera de las dobles) · horario que el docente prefiere evitar · horario que el docente prefiere · clase doble deseada en bloques de 2 · exceso de la misma materia seguida · horas libres del docente · horas libres del grupo (pesan tres veces las del docente) · máximo de la misma materia por día · repartir la materia en la semana · variar el horario de la materia
La escuela elige (13)Indisponibilidad del docente · aula preferida de la materia · máximo de clases por día del grupo · mínimo de días por semana de la materia · materia no antes del período N · materia no después del período N · materia exige recurso de aula · máximo de clases por día del docente · máximo de clases consecutivas del docente · máximo de días por semana del docente · máximo de clases seguidas del grupo · límite de horas libres del docente · límite de horas libres del grupo

“Sin choques” quiere decir: ninguna regla obligatoria rota en el horario entregado. No quiere decir que se cumplió toda preferencia, ni que el motor conoce una regla que nadie registró.

3. Cuando las reglas no caben juntas

Algunas combinaciones no tienen solución. Ejemplo ilustrativo: la escuela escribe “Prof. Ana solo por la mañana” como obligatoria, y la Prof. Ana tiene 30 clases por semana, pero la mañana tiene 25 horarios. No existe horario que cumpla las dos cosas. El motor no pone la clase en un horario prohibido para fingir que cerró: las 5 clases que sobran aparecen como no asignadas, y cada una trae el motivo en una frase, con la forma “Prof. Ana tiene 30 horas de clase a la semana y solo 25 horarios libres.”

Qué muestra la pantalla

El horario con las clases que cupieron, la lista de las que quedaron fuera y el motivo de cada una: falta de horario del grupo, docente sin horario libre, indisponibilidad, límite de clases por día, falta de aula libre. Cuando la cuenta no nombra la causa, el motor señala la regla obligatoria que la ubicación rompería.

Qué hace la escuela

Afloja una regla (la vuelve preferencia), cambia la disponibilidad o divide la carga, y genera de nuevo. El horario incompleto no se presenta como terminado.

Tiempo agotado

Si el motor se detiene en el tiempo límite con clases fuera, o si la escuela es más grande de lo que cubre el plan, el horario sale marcado como “se detuvo por tiempo”: es el mejor encontrado hasta ahí, no el mejor posible.

4. Cómo medimos el tiempo: la prueba del 24/10/2026

Corrimos el motor de Skedavo en una prueba automatizada, con el código del commit b11483910e7e, de 22:42 a 23:30 del 24/10/2026 (UTC−4). Cinco tamaños de escuela sintética, generados por la propia prueba, cada uno con 23 clases por grupo. Cada tamaño corrió en 3 configuraciones de contenedor y con 2 topes de tiempo del plan (90 y 120 s): 30 solves en total.

GruposClasesTiempo límite del motor (tope 90 / 120)Choques obligatorios eliminados enClases fuera del horario
4092069 s / 69 s4,0 a 6,1 s*0 en los 6 solves
501.15086 s / 86 s0,9 a 1,6 s0 en los 6 solves
601.38090 s / 104 s1,0 a 1,8 s0 en los 6 solves
701.61090 s / 120 s1,1 a 2,0 s0 en los 6 solves
801.84090 s / 120 s1,1 a 2,4 s0 en los 6 solves

* El primer solve de cada JVM fue siempre el de 40 grupos, con la JVM todavía fría (compilación JIT). Tiempos leídos del reloj de Timefold. “Eliminados” = fin de la fase de construcción y de la fase de encaje, con cero choques en las reglas obligatorias.

Qué dicen los números

Los 30 solves cerraron con todas las clases en el horario y ninguna regla obligatoria rota. Ninguno se detuvo antes del límite por falta de mejora: el motor siguió afinando preferencias hasta el final. Con 70 y 80 grupos, el tope de 120 s dio preferencias entre 10 y 17% mejores que el de 90 s.

Máquina y límites

Notebook Intel Core i9-13900H, Docker dentro de WSL2 con 4 vCPU y 7,76 GiB. Contenedores de 4 CPU y 2 GB, 4 CPU y 8 GB (los 8 GB son solo nominales: la VM no tenía tanto) y 2 CPU y 3 GB. Java 21. El motor usa un hilo, por eso las tres configuraciones dieron resultados prácticamente iguales.

Tiempo límite

El tiempo del motor crece con el número de clases (cerca de 0,075 s por clase), con un piso de 8 s y el tope del plan. También se detiene antes si pasa la mitad de ese tiempo sin encontrar un horario mejor. Mientras tanto, la pantalla muestra el avance.

5. Límites de esta prueba y de la revisión humana

Escuelas sintéticas

Las escuelas de la prueba las generó la propia prueba. No son datos de clientes. Reglas reales más apretadas piden más tiempo y pueden no caber.

Una sola máquina

Corrió en un notebook x86 con otros programas abiertos (uso medio de CPU del 74% en Windows). El servidor de producción tiene otra CPU, en general más lenta: el corte por tiempo es el mismo, pero las preferencias pueden salir menos afinadas y, en escuelas más grandes, pueden quedar clases fuera. No medimos en producción.

Lo que el motor no sabe

Cumple las reglas registradas. Acuerdos de pasillo, preferencias no escritas o una frase que Sky entendió distinto de lo que la escuela quiso no entran en la cuenta. Por eso la coordinación revisa las reglas listadas y el horario antes de publicar.

Preguntas frecuentes

¿Qué quiere decir “sin choques”?

Que, en las reglas obligatorias, el mismo docente, grupo o aula nunca está en dos lugares a la vez. El motor también respeta las demás reglas marcadas como obligatorias, como turno, aula con el recurso exigido e indisponibilidad rígida.

¿Y si las reglas de la escuela no caben juntas?

El horario no esconde el problema. Las clases que no cupieron aparecen como no asignadas, cada una con su motivo, por ejemplo: el docente tiene más clases en la semana que horarios libres. La escuela decide qué aflojar y genera de nuevo.

¿Cuánto tarda?

En la prueba del 24/10/2026, con 40 a 80 grupos, los choques de las reglas obligatorias se eliminaron entre 0,9 y 2,4 s; en el primer solve de cada JVM, entre 4,0 y 6,1 s. Después el motor siguió afinando las preferencias hasta el tiempo límite: 69 a 120 s en esos tamaños.

¿Estos números valen para mi escuela?

Son una referencia, no una promesa. Las escuelas de la prueba son sintéticas, no datos de clientes, y la prueba corrió en una sola máquina, distinta del servidor de producción. Las reglas y el tamaño cambian el tiempo.

Prueba con las reglas de tu escuela

Gratis hasta 15 grupos, sin tarjeta. Escribe las reglas en lenguaje natural y mira qué cupo y qué no.

Genera mi horario gratis