ComenzarEmpieza gratis

Asignación de recursos

Buen trabajo, toca resolver el siguiente problema que has visto.

Una persona gerente asigna 120 tareas a un ingeniero/a de software senior (S), uno/a junior (J) y un/a becario/a (I), y quiere minimizar los costes.

El becario necesita una formación que cuesta \(500\) antes de empezar a trabajar en las tareas. El coste por resolver cada tarea es c = [30, 40, 5], respectivamente.

\(x\) representa el número de tareas asignadas y \(o\) la binaria que indica si el becario recibe formación. El coste total es

\(TC = 30x_S+40x_J+(5x_I+500)o\)

Usa el método Big-M para linearizar este problema utilizando la nueva variable \(z\):

\(z = (5x_I+500)o\)

\(-oM\leq z \leq oM\)

\(-(1-o)M \leq z- (5x_I+500)o \leq (1-o)M\)

Ya se han importado pulp, junto con un model, los parámetros c, M y names, y las variables x, z, o.

Este ejercicio forma parte del curso

Introducción a la optimización en Python

Ver curso

Instrucciones del ejercicio

  • Define el objetivo sustituyendo la parte de la fórmula por z.
  • Define las restricciones rellenando el índice del becario.

Ejercicio interactivo práctico

Prueba este ejercicio y completa el código de muestra.

# Define the objective
model += c[0]*x[0] + c[1]*x[1] + ____

# Define the constraints
model += -o * M <= z
model += z <= o * M
model += -(1-o) * M <= z - (c[___]*x[____] + 500)
model += z - (c[____]*x[____] + 500) <= (1-o) * M
model += lpSum(x) >= 120

status = model.solve()
print(f"{'Optimal found' if status == 1 else 'Ignore solution'}")
for i in range(len(c)):
    print(f"{names[i]} was assigned {x[i].varValue:.0f}")
Editar y ejecutar código