Asignación de tareas#
Tags: Asignación, Variable binaria, Recurso
Show code cell source
import os
# Por precaución, cambiamos el directorio activo de Python a aquel que contenga este notebook
if "optimizacion" in os.listdir():
os.chdir(r"optimizacion/Formulaciones/6. Asignacion de tareas/")
Enunciado#
El equipo de Principios de Optimización se encuentra realizando un rediseño estructural del curso. Dado el largo trabajo que este rediseño implica, los integrantes del equipo han definido diez responsabilidades que deben ser ejecutadas. Para esto, el equipo debe decidir cuál es la mejor asignación de responsabilidades a los diferentes integrantes del equipo para el periodo intersemestral.
Cada uno de los cinco miembros del equipo está en la capacidad de encargarse de cualquiera de estas diez responsabilidades, sin embargo, debido sus preferencias y habilidades, cada uno ha determinado el tiempo (en horas) que le tomará realizar cada una de las responsabilidades que le pueden ser asignadas. Además, cada uno de ellos cuenta con una disponibilidad horaria de acuerdo con su contrato y sus demás compromisos personales. La información descrita anteriormente se encuentra disponible en la Tabla 1.
Tabla 1. Tiempos de realización y disponibilidad (en horas)
Integrantes | |||||
---|---|---|---|---|---|
Responsabilidades | 1 | 2 | 3 | 4 | 5 |
Diseño parciales | 25 | 75 | 125 | 200 | 250 |
Diseño tareas | 75 | 25 | 225 | 250 | 200 |
Diseño y grabación videos magistrales | 50 | 125 | 100 | 175 | 225 |
Diseño talleres magistrales | 100 | 50 | 250 | 225 | 175 |
Diseño jupyter notebooks | 125 | 150 | 25 | 150 | 50 |
Grabación videos trabajo asistido | 175 | 175 | 50 | 100 | 75 |
Edición videos trabajo asistido | 225 | 200 | 175 | 25 | 150 |
Diseño talleres trabajo asistido | 150 | 100 | 75 | 125 | 100 |
Diseño y grabación videos PulP | 200 | 225 | 150 | 75 | 50 |
Edición videos PulP | 250 | 250 | 200 | 50 | 125 |
Disponibilidad | 200 | 150 | 150 | 100 | 75 |
Aparte de hacer un curso agradable y productivo para cada uno de los estudiantes, el equipo del curso se siente motivado y a gusto en el proceso de rediseño. Por lo anterior, cada uno ha definido el índice de preferencia asociado a realizar cada una de las responsabilidades. Este índice se encuentra en una escala de 1 a 10, correspondiendo 1 y 10 a la responsabilidad menos deseada y a la preferida, respectivamente. En la Tabla 2 se presenta esta información.
Tabla 2. Preferencias
Integrantes | |||||
---|---|---|---|---|---|
Responsabilidades | 1 | 2 | 3 | 4 | 5 |
Diseño parciales | 1 | 3 | 5 | 8 | 10 |
Diseño tareas | 3 | 1 | 9 | 10 | 8 |
Diseño y grabación videos magistrales | 2 | 5 | 4 | 7 | 9 |
Diseño talleres magistrales | 4 | 2 | 10 | 9 | 7 |
Diseño jupyter notebooks | 5 | 6 | 1 | 6 | 2 |
Grabación videos trabajo asistido | 7 | 7 | 2 | 4 | 3 |
Edición videos trabajo asistido | 9 | 8 | 7 | 1 | 6 |
Diseño talleres trabajo asistido | 6 | 4 | 3 | 5 | 4 |
Diseño y grabación videos PulP | 8 | 9 | 6 | 3 | 1 |
Edición videos PulP | 10 | 10 | 8 | 2 | 5 |
El equipo de Principios de Optimización te ha pedido que plantees y resuelvas un modelo matemático que represente la situación.
Formulación#
a. Formula matemáticamente un modelo de optimización de forma general que represente la situación anterior. Defina clara y rigurosamente:
Conjuntos
Parámetros
Variables de decisión
Restricciones
Naturaleza de las variables
Función objetivo
Implementación#
b. Resuelve el modelo planteado utilizando la librería de PuLP en Python. ¿Cuál es la solución óptima del problema?
Librerías#
Importa la librería pulp
para crear y resolver el modelo.
# Escribe en esta celda tu código.
Conjuntos#
Define los conjuntos I
y R
que representan respectivamente los integrantes y las responsabilidades.
Recuerda que por conveniencia de preservar el orden de los elementos de los conjuntos, no siempre deberás definirlos con el tipo set
.
# Escribe en esta celda tu código.
Parámetros#
Define o importa los parámetros del modelo.
# Tiempo que consume i en I en realizar r in R
t = {
(1, "Diseño parciales"): 25,
(2, "Diseño parciales"): 75,
(3, "Diseño parciales"): 125,
(4, "Diseño parciales"): 200,
(5, "Diseño parciales"): 250,
(1, "Diseño tareas"): 75,
(2, "Diseño tareas"): 25,
(3, "Diseño tareas"): 225,
(4, "Diseño tareas"): 250,
(5, "Diseño tareas"): 200,
(1, "Diseño y grabación videos magistrales"): 50,
(2, "Diseño y grabación videos magistrales"): 125,
(3, "Diseño y grabación videos magistrales"): 100,
(4, "Diseño y grabación videos magistrales"): 175,
(5, "Diseño y grabación videos magistrales"): 225,
(1, "Diseño talleres magistrales"): 100,
(2, "Diseño talleres magistrales"): 50,
(3, "Diseño talleres magistrales"): 250,
(4, "Diseño talleres magistrales"): 225,
(5, "Diseño talleres magistrales"): 175,
(1, "Diseño jupyter notebooks"): 125,
(2, "Diseño jupyter notebooks"): 150,
(3, "Diseño jupyter notebooks"): 25,
(4, "Diseño jupyter notebooks"): 150,
(5, "Diseño jupyter notebooks"): 50,
(1, "Grabación videos trabajo asistido"): 175,
(2, "Grabación videos trabajo asistido"): 175,
(3, "Grabación videos trabajo asistido"): 50,
(4, "Grabación videos trabajo asistido"): 100,
(5, "Grabación videos trabajo asistido"): 75,
(1, "Edición videos trabajo asistido"): 225,
(2, "Edición videos trabajo asistido"): 200,
(3, "Edición videos trabajo asistido"): 175,
(4, "Edición videos trabajo asistido"): 25,
(5, "Edición videos trabajo asistido"): 150,
(1, "Diseño talleres trabajo asistido"): 150,
(2, "Diseño talleres trabajo asistido"): 100,
(3, "Diseño talleres trabajo asistido"): 75,
(4, "Diseño talleres trabajo asistido"): 125,
(5, "Diseño talleres trabajo asistido"): 100,
(1, "Diseño y grabación videos PuLP"): 200,
(2, "Diseño y grabación videos PuLP"): 225,
(3, "Diseño y grabación videos PuLP"): 150,
(4, "Diseño y grabación videos PuLP"): 75,
(5, "Diseño y grabación videos PuLP"): 25,
(1, "Edición videos PuLP"): 250,
(2, "Edición videos PuLP"): 250,
(3, "Edición videos PuLP"): 200,
(4, "Edición videos PuLP"): 50,
(5, "Edición videos PuLP"): 125,
}
# Preferencia de i en I por r en R
p = {
(1, "Diseño parciales"): 1,
(2, "Diseño parciales"): 3,
(3, "Diseño parciales"): 5,
(4, "Diseño parciales"): 8,
(5, "Diseño parciales"): 10,
(1, "Diseño tareas"): 3,
(2, "Diseño tareas"): 1,
(3, "Diseño tareas"): 9,
(4, "Diseño tareas"): 10,
(5, "Diseño tareas"): 8,
(1, "Diseño y grabación videos magistrales"): 2,
(2, "Diseño y grabación videos magistrales"): 5,
(3, "Diseño y grabación videos magistrales"): 4,
(4, "Diseño y grabación videos magistrales"): 7,
(5, "Diseño y grabación videos magistrales"): 9,
(1, "Diseño talleres magistrales"): 4,
(2, "Diseño talleres magistrales"): 2,
(3, "Diseño talleres magistrales"): 10,
(4, "Diseño talleres magistrales"): 9,
(5, "Diseño talleres magistrales"): 7,
(1, "Diseño jupyter notebooks"): 5,
(2, "Diseño jupyter notebooks"): 6,
(3, "Diseño jupyter notebooks"): 1,
(4, "Diseño jupyter notebooks"): 6,
(5, "Diseño jupyter notebooks"): 2,
(1, "Grabación videos trabajo asistido"): 7,
(2, "Grabación videos trabajo asistido"): 7,
(3, "Grabación videos trabajo asistido"): 2,
(4, "Grabación videos trabajo asistido"): 4,
(5, "Grabación videos trabajo asistido"): 3,
(1, "Edición videos trabajo asistido"): 9,
(2, "Edición videos trabajo asistido"): 8,
(3, "Edición videos trabajo asistido"): 7,
(4, "Edición videos trabajo asistido"): 1,
(5, "Edición videos trabajo asistido"): 6,
(1, "Diseño talleres trabajo asistido"): 6,
(2, "Diseño talleres trabajo asistido"): 4,
(3, "Diseño talleres trabajo asistido"): 3,
(4, "Diseño talleres trabajo asistido"): 5,
(5, "Diseño talleres trabajo asistido"): 4,
(1, "Diseño y grabación videos PuLP"): 8,
(2, "Diseño y grabación videos PuLP"): 9,
(3, "Diseño y grabación videos PuLP"): 6,
(4, "Diseño y grabación videos PuLP"): 3,
(5, "Diseño y grabación videos PuLP"): 1,
(1, "Edición videos PuLP"): 10,
(2, "Edición videos PuLP"): 10,
(3, "Edición videos PuLP"): 8,
(4, "Edición videos PuLP"): 2,
(5, "Edición videos PuLP"): 5,
}
# Disponibilidad en tiempo de i en I
d = {
1: 200,
2: 150,
3: 150,
4: 100,
5: 75,
}
Objeto del modelo#
Construye un problema al que luego agregarás las restricciones y la función objetivo.
# Escribe en esta celda tu código.
Variables de decisión#
Define las variables del problema de manera que estén contenidas en diccionarios indexados en los conjuntos de sus variables respectivas.
# Escribe en esta celda tu código.
Función objetivo#
Agrega al problema la función objetivo. Recuerda que al definir el problema, ya definiste si este es de maximización o minimización.
# Escribe en esta celda tu código.
Restricciones#
Agrega al problema las restricciones del modelo.
# Escribe en esta celda tu código.
Resolver el problema#
Invoca el optimizador. Este paso le asigna un valor a las variables incluidas en las restricciones o función objetivo del modelo.
# Escribe en esta celda tu código.
Imprimir resultados#
Antes de estudiar el óptimo del modelo, identifica en el estado del optimizador si pudo resolver el problema.
# Escribe en esta celda tu código.
Identifica también el valor de la función objetivo.
# Escribe en esta celda tu código.
Por último, imprime de manera estructurada el valor de las variables de decisión y otras expresiones de interés.
# Escribe en esta celda tu código.
Créditos#
Equipo Principios de Optimización
Autores: Juan Felipe Rengifo
Desarrollo: Juan Felipe Rengifo, Alejandro Mantilla
Última fecha de modificación: 08/04/2023