Tutorial para hacer Programación Lineal en Python con PuLP

Formulación de problemas, soluciones y ejemplos usando python

Tutorial para hacer Programación Lineal en Python con PuLP

¿Alguna vez te has preguntado cómo las empresas determinan la cantidad óptima de productos a fabricar para maximizar sus ganancias?

La programación lineal es una herramienta matemática que permite resolver este tipo de problemas de optimización. Y gracias a Python, podemos implementarla de manera sencilla utilizando una biblioteca llamada PuLP.

En esta guía, te llevaré paso a paso para que entiendas cómo utilizar PuLP, incluso si no tienes experiencia previa en programación. Al final, serás capaz de modelar y resolver problemas que son fundamentales en economía y muchas aplicaciones de negocios.

Este es un tutorial que hice para mis alumnos de la clase de Investigación de Operaciones. En la clase nos hemos enfocado mucho en el planteamiento de los problemas y en su solución usando la computadora. Previamente ya hice un tutorial para resolver problemas de PL con el método simplex usando Solver de Excel.

Si quieres verlo, puedes entrar aquí:

¿Qué es PuLP y por qué deberías conocerlo?

PuLP es una biblioteca de Python que facilita la formulación y resolución de problemas de programación lineal (LP) y programación entera mixta (MILP). En términos sencillos, te permite:

  • Definir variables de decisión: las incógnitas que quieres determinar.
  • Establecer funciones objetivo: lo que deseas maximizar o minimizar (por ejemplo, ganancias o costos).
  • Agregar restricciones: limitaciones o condiciones que deben cumplirse (como recursos disponibles).
  • Resolver el problema: encontrar la mejor solución posible dentro de las restricciones.

¿Por qué es importante? Porque la optimización es clave para mejorar la eficiencia y rentabilidad en cualquier negocio. Con PuLP, puedes tomar decisiones informadas basadas en datos y modelos matemáticos.


Paso 1: Instalación de PuLP

Antes de comenzar, necesitamos instalar PuLP en tu sistema. No te preocupes, es más sencillo de lo que parece.

  1. Abre tu terminal o línea de comandos.
  2. Verifica que la instalación fue exitosa.No debería aparecer ningún mensaje de error. Si todo salió bien, ¡ya estás listo para usar PuLP!

Escribe el siguiente comando y presiona Enter:

pip install pulp

Si estás utilizando Jupyter Notebook o un entorno similar, puedes instalarlo directamente en una celda:

!pip install pulp

Nota: PuLP incluye el solucionador CBC por defecto. Para problemas más complejos o requerimientos específicos, podrías considerar instalar solucionadores adicionales como Gurobi o CPLEX, aunque estos pueden requerir licencias separadas.


Paso 2: Entendiendo la Programación Lineal

Antes de sumergirnos en el código, es fundamental comprender qué es la programación lineal y cómo se aplica en economía y negocios.

La programación lineal es una técnica matemática que busca optimizar (maximizar o minimizar) una función objetivo, sujeta a ciertas restricciones lineales. Estas restricciones representan limitaciones en recursos como tiempo, dinero o materiales.

Ejemplo práctico:

Imagina que eres el gerente de producción de una fábrica que produce dos productos. Quieres saber cuántas unidades de cada producto debes fabricar para maximizar tus ganancias, considerando las limitaciones en materia prima y horas de trabajo.


Paso 3: Formulando un Problema de Programación Lineal

Veamos un problema sencillo para ilustrar los conceptos básicos.

Escenario:

Una empresa produce dos productos: Producto A y Producto B.

  • Producto A:
    • Beneficio por unidad: $3
    • Consumo de recursos:
      • Recurso 1: 2 unidades por producto
      • Recurso 2: 1 unidad por producto
  • Producto B:
    • Beneficio por unidad: $2
    • Consumo de recursos:
      • Recurso 1: 1 unidad por producto
      • Recurso 2: 1 unidad por producto

Disponibilidad de recursos:

  • Recurso 1: 100 unidades
  • Recurso 2: 80 unidades

Objetivo:

Determinar cuántas unidades de cada producto deben fabricarse para maximizar el beneficio total, sin exceder la disponibilidad de recursos.

Formulación matemática:

  1. Variables de decisión:
    • $x$: Número de unidades del Producto A a producir.
    • $y$: Número de unidades del Producto B a producir.
  2. Función objetivo:
    • Maximizar \( Z = 3x + 2y \)
  3. Restricciones:
    • Recurso 1: \( 2x + y \leq 100 \)
    • Recurso 2: \( x + y \leq 80 \)
    • No negatividad: \( x \geq 0 \), \( y \geq 0 \)

Paso 4: Implementando el Problema con PuLP

Ahora, traduciremos este problema matemático al lenguaje de programación usando PuLP.

1. Importar PuLP

Comenzamos importando la biblioteca PuLP en nuestro script de Python.

from pulp import *

2. Definir el Problema

Creamos una instancia del problema, indicando que se trata de una maximización.

prob = LpProblem("Maximización_de_Beneficios", LpMaximize)

3. Definir las Variables de Decisión

Declaramos las variables de decisión con sus límites inferiores.

x = LpVariable('Producto_A', lowBound=0)
y = LpVariable('Producto_B', lowBound=0)

4. Establecer la Función Objetivo

Añadimos la función objetivo al problema.

prob += 3 * x + 2 * y, "Beneficio_Total"

5. Agregar las Restricciones

Incorporamos las restricciones que representan las limitaciones de recursos.

prob += 2 * x + y <= 100, "Restricción_Recurso_1"
prob += x + y <= 80, "Restricción_Recurso_2"

6. Resolver el Problema

Utilizamos el método solve() para resolver el problema.

prob.solve()

7. Mostrar los Resultados

Finalmente, imprimimos el estado y los valores de las variables.

print("Estado de la solución:", LpStatus[prob.status])

print(f"Cantidad óptima de Producto A: {x.varValue}")
print(f"Cantidad óptima de Producto B: {y.varValue}")

print(f"Beneficio total máximo: ${value(prob.objective)}")

Paso 5: Analizando los Resultados

Al ejecutar el código, deberías obtener:

Estado de la solución: Optimal
Cantidad óptima de Producto A: 20.0
Cantidad óptima de Producto B: 60.0
Beneficio total máximo: $180.0

Interpretación:

  • Estado de la solución: Indica que se encontró una solución óptima.
  • Producto A: Debes producir 20 unidades.
  • Producto B: Debes producir 60 unidades.
  • Beneficio total máximo: \$180.

Verificación de restricciones:

  • Recurso 1: \( 2(20) + 1(60) = 100 \) unidades (se utiliza todo el recurso disponible).
  • Recurso 2: \( 1(20) + 1(60) = 80 \) unidades (se utiliza todo el recurso disponible).

Esto confirma que la solución respeta las limitaciones de recursos.


Paso 6: Introducción a la Programación Entera

En la realidad, no podemos producir una fracción de un producto. Para asegurarnos de que las variables sean números enteros, modificamos la definición de las variables:

x = LpVariable('Producto_A', lowBound=0, cat='Integer')
y = LpVariable('Producto_B', lowBound=0, cat='Integer')

Al resolver nuevamente, PuLP buscará soluciones donde \( x \) y \( y \) sean enteros.


Paso 7: Aplicación Práctica en Comercio Electrónico

Veamos un ejemplo aplicado al comercio electrónico.

Escenario:

EcoShop es una tienda en línea que vende productos ecológicos: Botellas Reutilizables y Bolsas de Tela.

Datos:

  • Beneficio por unidad:
    • Botella Reutilizable: \$8
    • Bolsa de Tela: \$5
  • Consumo de recursos por producto:
    • Material Ecológico:
      • Botella: 2 unidades
      • Bolsa: 1 unidad
    • Tiempo de Producción:
      • Botella: 3 horas
      • Bolsa: 2 horas
  • Recursos disponibles:
    • Material Ecológico: 200 unidades
    • Tiempo de Producción: 360 horas

Objetivo:

Determinar cuántas botellas y bolsas producir para maximizar las ganancias.

Formulación matemática:

  1. Variables de decisión:
    • \( R \): Número de botellas a producir.
    • \( T \): Número de bolsas a producir.
  2. Función objetivo:
    • Maximizar \( Z = 8R + 5T \)
  3. Restricciones:
    • Material Ecológico: \( 2R + 1T \leq 200 \)
    • Tiempo de Producción: \( 3R + 2T \leq 360 \)
    • No negatividad y enteridad: \( R, T \geq 0 \) y son enteros.

Implementación en PuLP:

from pulp import *

# 1. Definir el problema
prob = LpProblem("Maximizar_Ganancias_EcoShop", LpMaximize)

# 2. Definir variables de decisión
R = LpVariable('Botellas', lowBound=0, cat='Integer')
T = LpVariable('Bolsas', lowBound=0, cat='Integer')

# 3. Establecer la función objetivo
prob += 8 * R + 5 * T, "Ganancia_Total"

# 4. Agregar restricciones
prob += 2 * R + 1 * T <= 200, "Restricción_Material"
prob += 3 * R + 2 * T <= 360, "Restricción_Tiempo"

# 5. Resolver el problema
prob.solve()

# 6. Mostrar los resultados
print("Estado de la solución:", LpStatus[prob.status])

print(f"Cantidad óptima de Botellas: {R.varValue}")
print(f"Cantidad óptima de Bolsas: {T.varValue}")

print(f"Ganancia total máxima: ${value(prob.objective)}")

Resultados esperados:

Estado de la solución: Optimal
Cantidad óptima de Botellas: 40.0
Cantidad óptima de Bolsas: 80.0
Ganancia total máxima: $720.0

Análisis:

  • Botellas a producir: 40 unidades.
  • Bolsas a producir: 80 unidades.
  • Uso de recursos:
    • Material Ecológico: \( 2(40) + 1(80) = 160 \) unidades utilizadas (sobran 40 unidades).
    • Tiempo de Producción: \( 3(40) + 2(80) = 320 \) horas utilizadas (sobran 40 horas).
  • Ganancia total máxima: \$720.

Interpretación:

  • Sobrante de recursos: No es necesario utilizar todos los recursos disponibles para maximizar las ganancias.
  • Decisión estratégica: Podrías considerar si vale la pena producir más unidades si los recursos lo permiten o si existen otras limitaciones no consideradas.

Paso 8: Consejos para Evitar Errores Comunes

  • Comprueba las unidades: Asegúrate de que todas las unidades (horas, unidades de material, beneficios) sean consistentes.
  • Revisa las restricciones: Un error en una desigualdad puede cambiar completamente el resultado.
  • Nombra adecuadamente: Usa nombres descriptivos para variables y restricciones para facilitar la comprensión.
  • Analiza los resultados: Siempre verifica que los resultados tengan sentido en el contexto del problema.
  • Practica con diferentes escenarios: Modifica los valores y observa cómo cambian las soluciones.

Paso 9: Recursos para Profundizar

Si quieres seguir aprendiendo, aquí tienes algunas sugerencias:

  • Documentación de PuLP: https://coin-or.github.io/pulp/
  • Cursos en línea: Plataformas como Coursera o edX ofrecen cursos sobre programación lineal y Python.
  • Libros de texto: "Investigación de Operaciones" de Hamdy A. Taha es un buen recurso.
  • Comunidades en línea: Foros como Stack Overflow o Reddit pueden ser útiles para resolver dudas específicas.

Conclusión

La programación lineal es una herramienta invaluable en economía y negocios para tomar decisiones óptimas basadas en datos y restricciones reales. Con PuLP y Python, tienes al alcance de tu mano la capacidad de resolver problemas complejos de manera eficiente.

Ahora que has visto cómo modelar y resolver problemas de optimización, te animo a que apliques estos conocimientos a situaciones más complejas o adaptadas a tus intereses.

Recordatorio: La clave para dominar estos conceptos es la práctica. No dudes en experimentar y plantear tus propios problemas para resolverlos con PuLP.


¡Genial! Te has registrado exitosamente.

¡Bienvenido de vuelta! Has iniciado sesión correctamente.

Te has suscrito correctamente a Marionomics: Escribe tu paper de economía.

¡Éxito! Revisa tu correo electrónico para obtener el enlace mágico para iniciar sesión.

¡Éxito! Se ha actualizado la información de facturación.

No se actualizó tu información de facturación.