Asignación de tareas#

Tags: Asignación, Variable binaria, Recurso

Hide 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