Laboratorio de Optimización: modelos lineales, enteros y de restricciones con PuLP y OR-Tools en una VM Ubuntu privada
Este laboratorio da a cada alumno los solucionadores que usa un equipo de investigación operativa, en una sola VM Ubuntu. El alumno escribe una decisión como un modelo, un objetivo y unos límites, se la entrega a un solucionador y lee la respuesta: primero el estado, luego el plan, luego lo que vale cada límite. Dos modelos que escribe el alumno los califica un script que los ejecuta con instancias que el alumno nunca ve.
No se instala nada en el ordenador del alumno. PuLP con el solucionador CBC viene del archivo de Ubuntu, y OR-Tools de Google, con su solucionador de restricciones CP-SAT, se instala desde PyPI en la VM la primera vez que arranca. El módulo de investigación operativa resuelve sus problemas con SciPy en el laboratorio JupyterLab; este laboratorio es el lugar donde el alumno conoce las herramientas de modelado y los solucionadores que se usan en la práctica.
Qué aprenden los alumnos
Cómo una decisión se convierte en un modelo. Un programa lineal en PuLP fabrica mesas y sillas con madera, horas y espacio de almacén limitados, y el informe muestra el estado, el plan, la holgura de cada límite y su precio sombra, que dice de qué límite compensa tener más. Un programa entero elige proyectos completos: el mismo modelo se resuelve con fracciones y sin ellas, y redondear la primera respuesta incumple un límite. Un modelo CP-SAT construye un cuadrante de turnos de enfermería a partir de reglas y deseos, y lee OPTIMAL, FEASIBLE o INFEASIBLE en la respuesta del solucionador.
Las cinco partes
Primero un programa lineal: se ejecuta lp.py, se leen su estado, su plan y sus precios sombra, y luego se cambia un límite y se compara el beneficio con el precio sombra. Segundo los números enteros: integer.py resuelve el mismo tipo de modelo con y sin fracciones. Tercero un modelo de restricciones: shifts.py construye un cuadrante con CP-SAT, y el alumno añade una regla e incumple un deseo. Cuarto los tres modelos cambiados a mano. Quinto dos modelos que escribe el alumno, plan.py y rota.py, a partir de un comentario que dice exactamente qué debe leer e imprimir cada uno. Todo lo que el alumno edita está en la carpeta optimisation, y README.md en la carpeta personal dice qué hacer y no da ninguna respuesta.
Ejecútalo en tu navegador
Los laboratorios VM se ponen como tarea de laboratorio en un módulo, y el ejemplo está en la página del laboratorio. La máquina es pequeña: una CPU, 1 GB de memoria y 10 GB de disco. Un modelo se resuelve en mucho menos de un segundo.
- Añadir el laboratorio. En un módulo que enseñes, añade una tarea y elige la tarjeta de laboratorio VM Ubuntu. La página muestra una breve descripción de la máquina en lugar de un archivo compose.
- Empezar desde el ejemplo. La página ofrece laboratorios ya hechos para empezar. Elige Optimisation. Usar un ejemplo reemplaza el texto, y Deshacer recupera el tuyo.
- Publicar e iniciar tu propia copia. Publica y luego pulsa Iniciar. El script setup del laboratorio instala PuLP, los solucionadores CBC y GLPK y OR-Tools desde el archivo de Ubuntu y desde PyPI, y escribe el comando de ayuda opt, los modelos de trabajo y el README, la primera vez que arranca la VM, en uno o dos minutos.
- Abrir el terminal. Abre su terminal y lee README.md en la carpeta personal. No se abre nada en el navegador: el laboratorio es el terminal.
Una lección básica en este laboratorio
Optimisation Basics es una pequeña lección que se da en este laboratorio, una VM Ubuntu. Tiene un gancho, un objetivo «Puedo», palabras clave, una pregunta inicial, una comprobación tras cada idea, un error frecuente y una comprobación final, y cada paso tiene un botón Ejecutar que escribe su comando en el terminal de la máquina. El alumno ejecuta el programa lineal y lee sus precios sombra, ejecuta el programa entero para ver por qué falla el redondeo y ejecuta el cuadrante de turnos.
La lección mira alrededor y deja al alumno la tarea propia del laboratorio, los dos modelos, así que no da ninguna respuesta.
Cómo se califica
El laboratorio tiene una comprobación. Se ejecuta sobre una copia de la máquina guardada y ejecuta plan.py con tres instancias de selección de proyectos que sortea en ese momento. El beneficio que imprime el programa debe ser el mejor posible, que la comprobación encuentra probando todos los planes, el plan debe respetar el presupuesto y las horas, y la cota debe coincidir con lo que vale el mismo modelo con fracciones según otro solucionador, GLPK. Ejecuta rota.py con dos cuadrantes de enfermería que sortea en ese momento y con uno imposible: el coste debe ser el menor número de deseos incumplidos, que la comprobación calcula con otro método, se revisa cada regla del cuadrante, y el imposible debe decir INFEASIBLE. Los programas se ejecutan como el alumno, y la comprobación cuenta que cada uno llamó de verdad a un solucionador. Se rechaza un programa que inicie otro programa o que no use PuLP ni OR-Tools. La primera línea de lo que imprimió la comprobación dice por qué.
- Entregarlo. Asigna el laboratorio como cualquier tarea, con fecha límite si quieres. Cada alumno recibe una VM propia, que se conserva entre sesiones.
- Ejecutar la comprobación. En la fila de un alumno en la lista de la clase, pulsa Ejecutar la comprobación. Inicia una copia de su máquina guardada que no se vuelve a guardar, ejecuta el script de comprobación del laboratorio como root y muestra si pasó, qué imprimió y cuándo. Al alumno no se le comunica el resultado.
- Calificarlo. Lee la primera línea de lo que imprimió la comprobación: dice qué no está bien, por ejemplo un mejor plan que vale menos que el mejor de verdad, o un cuadrante de turnos que incumple más deseos de los necesarios. Devuelve el trabajo con un motivo si necesita más.
La definición en GitHub
El archivo es toda la definición del laboratorio, el mismo texto que ejecuta la plataforma: tamaño, script setup, comando de ayuda, modelos de trabajo, README y comprobación. Cópialo y cambia los números o los problemas para hacer un laboratorio más largo.
Prueba este laboratorio, y lo que cuesta
Con una cuenta personal gratuita puedes seguir las lecciones básicas de este laboratorio, con crédito gratuito suficiente cada mes para seguir la mayoría de las lecciones y sin tarjeta. Para una clase, un centro tiene gratis sus primeros 365 días, hasta 50 alumnos, y después paga por alumno y año, con todos los laboratorios incluidos y el profesorado gratis.
Preguntas frecuentes
- ¿El laboratorio necesita una licencia?
- No. OR-Tools tiene licencia Apache-2.0, PuLP tiene licencia MIT, y los solucionadores CBC y GLPK son de código abierto (EPL y GPL). Se instalan en la VM del alumno cuando arranca, desde el archivo de Ubuntu y desde PyPI, así que no distribuimos ninguno.
- ¿Por qué dos herramientas, y en qué se diferencia de SciPy en el módulo de investigación operativa?
- PuLP escribe programas lineales y enteros y se los entrega a un solucionador como CBC. OR-Tools CP-SAT es un solucionador de restricciones, bueno para cuadrantes de turnos, horarios y rutas. linprog de SciPy solo resuelve programas lineales. El módulo enseña el método con SciPy, y este laboratorio deja ejecutar las herramientas que se usan para problemas mayores y con números enteros.
- ¿Pueden los alumnos estropear algo?
- Solo su propia copia. La máquina de un visitante sin cuenta llega al archivo de Ubuntu y al índice de paquetes de Python y a nada más, y si un alumno estropea un archivo, opt reset lo deja como se entregó.
- ¿Se probó el laboratorio en una VM de alumno de verdad?
- El script setup, los comandos de la lección y la comprobación, con cada forma de engañarla, se ejecutaron en un contenedor Ubuntu 26.04 real que hace de VM, en una máquina arm64. PyPI tiene paquetes de OR-Tools para arm64 y para amd64, pero conviene probar una VM de alumno arrancada y la instalación amd64 antes de una clase.