Optimización Matemática con Pyomo en Python

Optimización Matemática con Pyomo en Python

La optimización matemática es un campo de las matemáticas aplicadas que se ocupa de encontrar la mejor solución a un problema dado. En un problema de optimización, se tiene una función objetivo que se desea maximizar o minimizar, y un conjunto de restricciones que deben cumplirse.

Pyomo es una biblioteca de Python que permite modelar y resolver problemas de optimización matemática. Es un lenguaje de modelado algebraico que proporciona una notación similar a la que se utiliza en la formulación matemática de los problemas.

Introducción

En este tutorial, aprenderemos a usar Pyomo para resolver problemas de optimización matemática. Comenzaremos con una introducción a los conceptos básicos de la optimización matemática, y luego veremos cómo usar Pyomo para modelar y resolver problemas de programación lineal, programación no lineal y programación entera.

Conceptos básicos de la optimización matemática

Un problema de optimización se puede definir de la siguiente manera:

min/max f(x)
s.t.
g(x) <= 0
h(x) = 0

En esta definición,

  • f(x) es la función objetivo, que se desea maximizar o minimizar.
  • g(x) son las restricciones de desigualdad, que deben cumplirse.
  • h(x) son las restricciones de igualdad, que deben cumplirse.

Modelado de problemas de optimización con Pyomo

Pyomo proporciona una notación similar a la que se utiliza en la formulación matemática de los problemas. Por ejemplo, para modelar un problema de programación lineal, podemos usar el siguiente código:

Python
import pyomo.environ as pe

# Definición de la función objetivo
def obj(model):
  return model.x1 + model.x2

# Definición de las restricciones
def cons1(model):
  return model.x1 + model.x2 <= 10

def cons2(model):
  return model.x1 <= 5

# Creación del modelo
model = pe.ConcreteModel()

# Definición de las variables
model.x1 = pe.Var(domain=pe.NonNegativeReals)
model.x2 = pe.Var(domain=pe.NonNegativeReals)

# Definición de la función objetivo y las restricciones
model.obj = pe.Objective(obj=obj, sense=pe.maximize)
model.cons1 = pe.Constraint(expr=cons1)
model.cons2 = pe.Constraint(expr=cons2)

# Resolución del modelo
solver = pe.SolverFactory("glpk")
solver.solve(model)

# Impresión de la solución
print(model.x1.value, model.x2.value)

Este código crea un modelo de programación lineal con dos variables, x1 y x2. La función objetivo es maximizar la suma de x1 y x2. Las restricciones son que x1 + x2 <= 10 y x1 <= 5.

Resolución de problemas de optimización con Pyomo

Pyomo puede resolver problemas de optimización utilizando una variedad de solucionadores. Los solucionadores más comunes son GLPK, COIN-OR CLP/CBC, CPLEX y Gurobi.

Para resolver un problema de optimización con Pyomo, podemos usar el siguiente código:

Python
solver = pe.SolverFactory("glpk")
solver.solve(model)

Este código resuelve el modelo utilizando el solucionador GLPK.

Ejemplos de problemas de optimización

A continuación, se muestran algunos ejemplos de problemas de optimización que se pueden resolver con Pyomo:

  • Problema de transporte: Este problema consiste en encontrar la ruta óptima para transportar bienes desde un conjunto de orígenes a un conjunto de destinos.
  • Problema de asignación: Este problema consiste en asignar tareas a trabajadores de manera que se minimice el costo o se maximice el beneficio.
  • Problema de programación lineal entera: Este problema es una variante de la programación lineal en la que las variables deben tomar valores enteros.
  • Problema de programación no lineal: Este problema es una variante de la programación lineal en la que la función objetivo o las restricciones son no lineales.

Conclusión

Pyomo es una herramienta poderosa que puede utilizarse para resolver una amplia gama de problemas de optimización matemática. Es una buena opción para los usuarios que desean modelar y resolver problemas de optimización de manera eficiente y flexible.