1. Introducción Pyomo.

Pyomo ( Python Optimization Modeling Objects ) soporta la formulación y el análisis de modelos matemáticos para aplicaciones de optimización complejas. Esta capacidad está comúnmente asociada a los lenguajes de modelado algebraico (AML) como AMPL, AIMMS y GAMS. Los objetos de modelado de Pyomo están integrados en Python, un lenguaje de programación de alto nivel con todas las funciones que contiene un rico conjunto de bibliotecas de apoyo. El modelado es un proceso fundamental en muchos aspectos de la investigación científica, la ingeniería y la empresa. El modelado implica la formulación de una representación simplificada de un sistema u objetos del mundo real.

Para instalar Pyomo en Python, se pueden seguir las instrucciones que se pueden ver en este enlace, pero de forma resumida, su instalación con pip consiste en simplemente ejecutar la siguiente instrucción:

pip install pyomo

Dada la importancia que tiene el uso en la resolución de problemas de optimización en el mundo real, existe una amplia refrencia al mismo en internet, pero sin ningún lugar a la duda, la referencia básica del mismo la podemos encontrar en el sitio web que posee este paquete y que el lector interesado lo puede encontrar en el enlace http://www.pyomo.org/. Cuando se accede a las páginas de Pyomo, se puede acceder a mucha información relacionada con esta aplicación, pero entre las más destacadas se puede hacer referencia a la documentación en inglés sobre su uso.

Pymo se basa en la utilización de diversos optimizadores, y uno de los más utilizados en la referencia sobre el uso de Pyomo es GLPK, cuya instalación se procede a comentar en el siguiente apartado.

1.1. Instalación del optimizador glpk.

Para la ejecución de los ejemplos que se van a utilizar en estos apartados, se va a utilizar el solver denominado GLPK (también conocido como glpsol), para ello lo primero que hay que hacer es instalarlo en nuestro sistema. Estas instrucciones las podemos ver en este enlace, pero a continuación se pasan a resumir los pasos que deben seguirse ( aquí se van a relatar los pasos a dar para la instalación en windows, para otro sistema operativo los pasos sería muy similares).

1.- Bajar el fichero winglpk-4.65.zip desde este enlace.

2.- Se descomprime este fichero en una carpeta.

3.- En las variables de entorno del sistema poner el camino del ejecutable en la variable Path. En el caso concreto del sistema desde el que se escribe estas instrucciones, el camino añadido ha sido el siguiente: D:\programas\GLPK\glpk-4.65\w64.

4.- Comprobar que la instalación ha sido correcta, para ello abrir una ventana de comandas y ejecutar el comando glpsol. Si el sistema responde con un mensaje similar a: GLPSOL: GLPK LP/MIP Solver, v4.65 No input problem file specified; try glpsol –help, la instalación sería correcta, y ya estaría listo para poder utilizarse dentro de Pyomo.

1.2. Otros optimizadores o solvers.

Pyomo soporta una gran variedad de optimizadores o solvers. Pyomo tiene interfaces especializadas para algunos optimizadors (por ejemplo, BARON, CBC, CPLEX y Gurobi). También tiene interfaces genéricas que permiten llamar a cualquier optimizador que pueda leer archivos AMPL “.nl” y escribir “.sol” y la capacidad de generar modelos en formato GAMS y recuperar los resultados. Puedes obtener la lista actual de optimizadores soportados usando el comando pyomo:

pyomo help –solvers

1.3. Abstract versus Modelos Concrete.

Aunque se hará referencia con mayor detalle a estos diferentes tipos de modelos que se pueden utilizar con Pymo, en este apartado introductorio, se hará una mera referencia a los mismos, a fin de que el lector se vaya familiarizando con ellos.

Un modelo matemático de un determinado problema de optimización, puede ser definido utilizando símbolos matemáticos que representan la situación concreta que se pretende resolver. Y así por ejemplo, la siguiente fórmula representa un típico problema de programación lineal (LP) para encontrar el valor óptimo del vector \(x\) que tiene como parámetros \(n\) , y como vector de parámetros \(c,\,a\, y\,b\).

\[\begin{split} \begin{array}{lll} \min & \sum_{j=1}^n c_j x_j & \\ s.t. & \sum_{j=1}^n a_ij x_j \geq b_i & \forall i = 1 \ldots m\\ & x_j \geq 0 & \forall j = 1 \ldots n \end{array} \end{split}\]

A este modelo se le puede denominar abstract o symbolic modelo matemático ya que se basa en valores de parámetros no especificados. Para poder utilizar este tipo de conceptos, Pyomo tiene una clase denominada AbstractModel que proporciona un contexto para definir e inicializar modelos abstractos de optimización en Pyomo de tal manera que los valores concretos de los datos serán suministrados en el momento de obtener una solución al problema de optimización planteado.

En algunos contextos, un modelo matemático puede definirse directamente con los valores concretos de los datos suministrados en el momento de la definición del modelo e incorporados al mismo. A éstos los llamamos modelos matemáticos concrete. Por ejemplo, el siguiente modelo LP es una instancia concreta del modelo abstracto anterior

\[\begin{split} \begin{array}{lll} \min & 2x_1 + 3x_2\\ s.t. & 3x_1 + 4x_2 \geq 1\\ & 2x_1 + 5x_2 \geq 2 \\ & x_1,x_2 \geq 0 \end{array} \end{split}\]

Aunque en principio no se pueda entender al completo la forma en que hay que plantear estos problemas a Pyomo, a continuación se muestra el código necesario para su resolución. No es preciso entender por completo el funcionamiento del siguiente código, ya que en los apartados que siguen a éste se explicará todo con mayor detalle, pero se ha creído oportuno ir introduciendo conceptos que posteriormente se expondrán con mayor exactitud.

%%writefile codigos/model1.py
from pyomo.environ import *

model = ConcreteModel()
model.x_1 = Var(within=NonNegativeReals)
model.x_2 = Var(within=NonNegativeReals)
model.obj = Objective(expr=2*model.x_1 + 3*model.x_2)
model.con1 = Constraint(expr=3*model.x_1 + 4*model.x_2 >= 1)
model.con2 = Constraint(expr=2*model.x_1 + 5*model.x_2 >= 2)
Overwriting codigos/model1.py
!pyomo solve codigos/model1.py --solver=glpk
[    0.00] Setting up Pyomo environment
[    0.00] Applying Pyomo preprocessing actions
[    0.02] Creating model
[    0.02] Applying solver
[    0.06] Processing results
    Number of solutions: 1
    Solution Information
      Gap: 0.0
      Status: feasible
      Function Value: 1.2000000000000002
    Solver results file: results.json
[    0.06] Applying Pyomo postprocessing actions
[    0.06] Pyomo Finished