¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Precio sombra y análisis de sensibilidad

Después de esta lección: Puedo decir cuánto cambia la respuesta cuando cambia un límite.

Lección de 60 min4 comandosLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Cuánto vale una hora más de horno?

El análisis de sensibilidad estudia cuánto cambia la mejor solución cuando cambia un límite o un precio. Sirve para decidir si compensa pagar por más harina o por una hora más de horno.

La panadería gana 540 € con 6 tandas de pan y 4 de tarta. El dueño pregunta cuánto ganaría si el horno diera una hora más.

Al final de esta lección

Nota

Puedo decir cuánto cambia la respuesta cuando cambia un límite.

Palabras clave

PalabraQué significa
Análisis de sensibilidadestudiar cómo cambia la respuesta cuando cambian los datos
Precio sombralo que sube el beneficio por cada unidad más de un límite
Restricción activaun límite que el plan gasta por completo
Holguralo que sobra de un límite sin usar

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

¿Cuánto vale una unidad más de un límite?

Si el horno diera 25 horas en vez de 24, el mejor plan cambiaría a 5,75 tandas de pan y 4,5 de tarta. El beneficio subiría de 540 a 557,5 €.

La diferencia, 17,5 €, es el precio sombra de una hora de horno: lo que vale la hora de más. Se calcula resolviendo dos veces el problema.

Ejemplo resuelto: el efecto de un límite mayor

CambioMejor plan (pan, tarta)Beneficio (€)Diferencia (€)
Datos de siempre: 24 h y 32 kg6 y 4540ninguna
Una hora más de horno: 25 h5,75 y 4,5557,5+17,5
Un kilo más de harina: 33 kg6,375 y 3,75543,75+3,75

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Resuelve la panadería con 25 horas de horno

Comando
docker exec jupyter python3 -c "from scipy.optimize import linprog; r = linprog([-50, -60], A_ub=[[2, 3], [4, 2]], b_ub=[25, 32]); print(round(-r.fun, 2), [round(v, 2) for v in r.x])"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Resuelve la panadería con 33 kg de harina

Comando
docker exec jupyter python3 -c "from scipy.optimize import linprog; r = linprog([-50, -60], A_ub=[[2, 3], [4, 2]], b_ub=[24, 33]); print(round(-r.fun, 2))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

linprog calcula los precios sombra por ti

No hace falta resolver el problema una vez por límite. Con el método por defecto, linprog guarda en result.ineqlin.marginals un número por cada límite.

Como linprog minimiza, esos números salen con el signo cambiado. Tomando su valor sin signo, con abs, se leen los precios sombra de cada límite.

Lee los dos precios sombra de la panadería

Comando
docker exec jupyter python3 -c "from scipy.optimize import linprog; r = linprog([-50, -60], A_ub=[[2, 3], [4, 2]], b_ub=[24, 32]); print([round(abs(m), 2) for m in r.ineqlin.marginals])"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejemplo resuelto: ¿compensa comprar más?

CompraCuesta (€)Vale (€)¿Compensa?
Una hora de horno2017,5No
Una hora de horno1217,5Sí
Un kilo de harina23,75Sí
Un kilo de harina53,75No

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un límite que sobra no tiene precio

Añade un tercer límite: el mostrador admite 12 tandas en total, x + y <= 12. El plan de 6 y 4 usa solo 10, así que sobran 2: esa es la holgura.

Un límite con holgura es una restricción que no manda, y su precio sombra es 0. Los que se gastan por completo son las restricciones activas.

Precios sombra y holguras con tres límites

Comando
docker exec jupyter python3 -c "from scipy.optimize import linprog; r = linprog([-50, -60], A_ub=[[2, 3], [4, 2], [1, 1]], b_ub=[24, 32, 12]); print([round(abs(m), 2) for m in r.ineqlin.marginals]); print([round(s, 2) for s in r.slack])"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error muy común

Advertencia

Mucha gente cree que el precio sombra vale para cualquier cantidad. Solo vale para cambios pequeños. Con 60 horas de horno la cuenta daría 1.170 €, pero la harina pasa a mandar y el beneficio real es 960 €.

Comprueba lo que aporta cada hora más

Código: python
# Beneficio de la panadería con distintas horas de horno
# (el plan sale de cruzar el horno con la harina mientras la harina no manda)
hours = 24
while hours <= 27:
    y = (2 * hours - 32) / 4
    x = (32 - 2 * y) / 4
    print(hours, "horas:", round(50 * x + 60 * y, 2), "euros")
    hours = hours + 1
# Resta cada beneficio al anterior: ¿qué diferencia sale siempre?

Para ir más lejos: cambiar un precio

Hasta ahora cambiaste los límites. Cambia ahora el beneficio de la tarta de 60 a 70 y resuelve de nuevo. ¿Sigue siendo mejor el plan de 6 y 4? ¿A partir de qué precio de la tarta cambia el mejor plan?

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.