Introducción A Pyomo
Introducción A Pyomo
Introducción A Pyomo
Los AML son lenguajes de alto nivel para describir y resolver problemas de optimización. Los AML
minimizan las dificultades asociadas con el análisis de modelos de optimización al permitir la
especificación de alto nivel de problemas de optimización. Además, el software AML proporciona
interfaces rigurosas para los paquetes de solucionadores externos que se utilizan para analizar
problemas y permite al usuario interactuar con los resultados del solucionador en el contexto de su
especificación de modelo de alto nivel.
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
2. Capacidad de Adaptación
Una de las principales desventajas que presentan los lenguajes de modelado de carácter comercial
que desempeñan funciones similares a Pyomo es su limitada capacidad de customización de sus
componentes o de los propios procesos de optimización. Debido al carácter de código abierto de
Pyomo, el usuario tiene la capacidad de no sólo llevar a cabo modificaciones del código existente,
así como de los componentes y características ya integradas, sino también la creación de nuevos
componentes, herramientas, o futuras mejoras, lo cual abre un amplio campo para la comunidad
investigadora. De esta manera, el diseñador puede personalizar el software a su gusto para
adaptarlo a sus necesidades, y prototipar nuevas capacidades que pudieren incluso ser integradas
en un futuro en la versión básica.
3. Integración de Solvers
Las hasta ahora existentes herramientas de modelado de problemas de optimización pueden ser
clasificadas de manera general en dos categorías. Por un lado están las herramientas de modelado
fuertemente acopladas en las cuales se tiene acceso directo a la utilización de un determinado
solver matemático, y por otro lado las herramientas de modelado débilmente acopladas en los que
se hace uso de ejecutables externos. Pyomo permite la utilización de ambas vertientes. Los
objetivos de diseño de Pyomo han llevado a la distinción entre la formulación del modelo y la
ejecución de la optimización, siendo ambos procesos completamente independientes.
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
4. Instanciación de Modelos
Una de las principales y deseables característica de Pyomo es la definición de modelos
abstractos de manera similar a la forma en que trabajan AMPL y AIMMS. En un modelo
abstracto se lleva a cabo la separación de la declaración del modelo y de los datos utilizados
para la creación de una instancia de modelo específica.
Dicha separación proporciona una gran capacidad de modelo flexible. Para ello, Pyomo utiliza
una representación simbólica de los datos, variables, restricciones, y objetivos de
optimización, para después proceder a generar instancias del modelo previamente creado
mediante la llamada a fuentes de datos externos
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
Pyomo es una herramienta que se fundamenta en la creación de modelos a modo de objetos,
construidos mediante la incorporación de diversos componentes. De esta forma, podría
describirse un modelo en Pyomo como la suma de todos y cada uno de los componentes
declarados y asociados al mismo. Sin entrar en detalles acerca de cada uno de los elementos,
se muestra a continuación un diagrama en el cual se puede ver la estructura clásica de un
modelo en Pyomo.
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
Pyomo es una colección de paquetes de software NEOS Server es una aplicación cliente-servidor
de Python para formular modelos de basada en Internet que proporciona acceso
optimización. Pyomo fue desarrollado por William gratuito a una biblioteca de solucionadores de
Hart y Jean-Paul Watson en el Laboratorio optimización. Su biblioteca de solucionadores
Nacional de Sandia y por David Woodruff en incluye más de 60 solucionadores comerciales,
Universitarios de California gratuitos y de código abierto, que pueden
aplicarse a problemas de optimización
matemática de más de 12 tipos diferentes,
incluida la programación lineal , la programación
entera y la optimización no lineal .
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
Modelos en Pyomo EN PYTHON
Existen principalmente dos tipos de modelos en Pyomo, los modelos concretos y los modelos abstractos. La
diferencia principal entre ambos es que, mientras que en un modelo concreto todos los datos necesarios se
encuentran incluidos en el mismo fichero en el cual se realiza la definición del modelo, en una modelo
abstracto los datos se encuentran en ficheros externos los cuales han de ser llamados cuando se lleva a cabo
la resolución del problema. De esta forma, se utilizará un modelo concreto cuando se desee resolver un
problema particular mientras que se utilizará un modelo abstracto cuando se desee resolver un problema
general del cual se realizarán numerosas instancias con distintos datos.
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
Modelos en Pyomo EN PYTHON
El primer paso en cualquier programa desarrollado mediante el uso del Pyomo es la llamada e la
librería que contiene el paquete. Mediante el comando siguiente se importan todos los paquetes
contenidos en el núcleo básico de Pyomo.
Una vez que se ha declarado la librería en la cual se encuentran contenidos los elementos
básicos de Pyomo, se puede declarar el modelo, bien concreto o bien abstracto, mediante los
siguientes comandos.
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
Elementos Básicos en Pyomo
Una vez que se ha creado el objeto modelo en Pyomo, concreto o abstracto, el siguiente paso
es el de agregar todos y cada uno de los elementos necesarios a dicho modelo para la
descripción del problema de optimización, sistema a controlar, y del problema a resolver en sí.
Estos elementos básicos que será necesario añadir al modelo son:
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
Elementos Básicos en Pyomo: Sets
Estos elementos son aquellos utilizados en Pyomo cuando se desea llevar a cabo la indexación
de una determinada variable. Para su definición, es necesario llevar a cabo una inicialización de
los mismos. Existe numerosas formas de realizar dicha inicialización. La más básica de ellas,
es la utilización de lista, sets, o tuplas de python, tal y como se muestra a continuación:
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
Elementos Básicos en Pyomo: Parámetros
Son parámetros aquellos elementos utilizados durante el problema de optimización cuyo
valor no es utilizado como variable de decisión del mismo, y que permanecen constantes
durante todo el proceso de optimización para el valor de un índice o índices. Por ello, a la
hora de llevar a cabo la declaración de un parámetro, será necesario indiciar de qué
índice o indices depende.
En el caso en que el que valor del parámetro permanezca constante a lo largo de todo el
proceso de optimización sin depender de ningún índice, son dos las alternativas existentes.
Bien su declaración como parámetros sin dependencia de índice, o bien mediante una
constante de Python al uso. De esta forma se puede tener:
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
Elementos Básicos en Pyomo: Variables
Otro de los elementos clave, junto con sets y parámetros en pyomo, son las variables. Se
definen como variables aquellos elementos a los cuales se les dará valor a lo largo del
proceso de optimización. Dichas variables son declaradas, pueden ser opcionalmente
restringidas a un conjunto de valores, y se les pueden ser asignados un conjunto de valores
iniciales.
De esta forma, todos y cada uno de los elementos que sean declarados como variables
serán utilizados como toma de decisión durante el proceso de optimización, siendo esto una
de las principales ventajas de Pyomo, y lo cual se conoce como optmización multiobjetivo.
Algunas de las directivas que se pueden incluir durante la declaración de variables son:
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
Elementos Básicos en Pyomo: Variables
Por último, es posible especificar el domino en el cual se han de encontrar las variables
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
Elementos Básicos en Pyomo: Objetivo
Se define objetivo en Pyomo como la función que se desea optimizar, y la cual sirve como
índice de desempeño del problema de optmimización. De esta forma, se trata de una función
que devuelve un valor el cual se intenta minimizar o maximizar, con respecto al conjunto de
variables. Aunque existen diversas maneras de llevar a cabo la declaración de la función
objetivo, la más recomendada de todas ellas es el uso de una función genérica de Python
que después es incluida como elemento del modelo a modo de objetivo. A continuación se
muestra una ejemplo de declaración de función objetivo.
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
EN PYTHON
Elementos Básicos en Pyomo: Restricciones
Se definen restricciones como aquellos elementos utilizados para restringir, por lo general,
del valor de las variables del problema. Sin embargo, también se utilizarán restricciones,
tal y como se verá en secciones posteriores, para definir el comportamiento dinámico de
un sistema.
CD - PASCO
PYOMO: MODELADO DE PROBLEMAS DE OPTIMIZACIÓN
Aplicación de Solvers EN PYTHON
Una vez que se ha definido el problema de optimización, es decir, se ha descrito por completo
el modelo que se desea optimizar, incluyéndose función objetivo a optimizar y restricciones
impuestas al sistema, el único paso que queda por dar para la resolución del problema es la
aplicación del solver matemático encargado de resolver el problema.
CD - PASCO
EJEMPLOS BÁSICOS EN PYOMO
Problema de la Mochila (Modelo Concreto)
CD - PASCO
Problema de la Mochila (Modelo Concreto)
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
MODELADO EN PYOMO
El objetivo de Pyomo es proporcionar una plataforma para especificar modelos de optimización que
incorporen las ideas centrales que se encuentran en las AML modernas, dentro de un marco que
promueve la flexibilidad, extensibilidad, portabilidad, apertura y facilidad de mantenimiento. Pyomo
es una AML que amplía Python para incluir objetos para el modelado de optimización.
Estos objetos se pueden utilizar para especificar modelos de optimización y traducirlos a varios
formatos que pueden ser procesados por solucionadores externos.
Ejemplos sencillos
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Este LP se puede expresar fácilmente en PYOMO de la siguiente manera:
La primera línea es una declaración de importación estándar de Python que inicializa el entorno
Pyomo y carga la biblioteca de componentes de modelado central de Pyomo.
Las siguientes líneas construyen un objeto modelo y definen atributos del modelo.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Este LP se puede expresar fácilmente en PYOMO de la siguiente manera:
Los componentes de modelo son objetos que son atributos de un objeto de modelo y el objeto
ConcreteModel inicializa cada componente del modelo a medida que se agregan.
Las variables de decisión del modelo, las restricciones y el objetivo se definen utilizando
componentes del modelo Pyomo.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Los usuarios rara vez tienen que resolver una sola instancia de un problema de optimización en particular.
Más bien, comúnmente tienen un modelo de optimización general y luego crean una instancia particular
de ese modelo usando datos específicos. Por ejemplo, las siguientes ecuaciones representan un LP con
parámetros escalares n y m, parámetros vectoriales b y c, y parámetro matricial a:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Este script requiere que los datos utilizados para construir el modelo estén
disponibles mientras se construye cada componente de modelado. En este
ejemplo, los datos necesarios existen en mydata.py:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
VARIABLES
Las variables de Pyomo se crean utilizando la clase Var, que puede representar un valor único o
una colección indexada de valores. Las variables pueden tener valores iniciales y el valor de una
variable puede ser recuperado y establecido por el usuario o por un solucionador como parte del
proceso de solución.
Se admiten argumentos con nombre y sin nombre, se proporciona una lista de los argumentos
comunes que se pueden pasar al declarar el componente Var
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
VARIABLES
Se admiten argumentos con nombre y sin nombre, se proporciona una lista de los argumentos
comunes que se pueden pasar al declarar el componente Var
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
VARIABLES
El dominio de una variable (es decir, el conjunto de valores legales) se especifica con el dominio o
dentro de las opciones de palabras clave del constructor Var:
En este ejemplo, y solo puede tomar los valores enteros 1, 2 o 3. La variable r puede tener
cualquier valor real, y w está restringida a ser binaria (es decir, 0/1 o Verdadero / Falso). Si no se
especifica el dominio, el predeterminado es el escenario de los números Reales.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
VARIABLES
Otros dominios soportados por Pyomo se definen en la Tabla. Tenga en cuenta que estos dominios
también se pueden utilizar en otros contextos (por ejemplo, al construir objetos Param).
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
VARIABLES
El dominio o el argumento interno también pueden aceptar una función, que se utiliza para definir
el dominio para elementos individuales de una variable indexada.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
VARIABLES
El límite de variable se puede especificar explícitamente con la opción de palabra clave de bounds
La opción de límites puede especificar una tupla de 2 con valores superiores e inferiores.
Alternativamente, puede especificar una función que devuelva una tupla de 2 para cada índice de
variable. Tenga en cuenta que Ninguno se puede utilizar en lugar del límite inferior o superior para
indicar que no se debe aplicar ningún límite. En el fragmento de código anterior, model.a tiene un
límite inferior de 0 y no tiene un límite superior, mientras que model.b tiene límites diferentes para
cada uno de sus índices. Por ejemplo, model.b [3] tiene un límite inferior de 6: 5 y un límite
superior de 7: 5.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
VARIABLES
El valor inicial de las variables se puede establecer con el argumento de palabra clave initialize
como en el siguiente ejemplo:
Para las variables no indexadas, se proporciona un único valor escalar al argumento de la palabra
clave initialize. Si el componente está indexado, aún se puede proporcionar un valor único, en cuyo
caso todas las entradas de una variable indexada se inicializarán con el mismo valor.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
VARIABLES
El dominio o el argumento interno también pueden aceptar una función, que se utiliza para definir
el dominio para elementos individuales de una variable indexada.
Para las variables no indexadas, se proporciona un único valor escalar al argumento de la palabra
clave initialize. Si el componente está indexado, aún se puede proporcionar un valor único, en
cuyo caso todas las entradas de una variable indexada se inicializarán con el mismo valor.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
VARIABLES
Además, se puede pasar un diccionario donde las claves corresponden a los índices válidos de la
variable. Además, a este argumento se le puede pasar una regla (una función de Python) que
acepta el modelo y los índices variables como argumentos y devuelve el valor inicial deseado para
ese elemento variable:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
El valor actual de la variable se puede obtener con la función value(), y los atributos lb y ub
mantienen valores para los límites superior e inferior de la variable, respectivamente. Estos
valores pueden inferirse del dominio de la variable.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Los valores de las variables se pueden establecer mediante el operador de asignación de Python,
También se puede llamar al método set_values para establecer todos los valores de las variables
de un diccionario.
Los componentes de Var se pueden fijar a valores específicos. Si el atributo fixed es Verdadero,
entonces la variable tiene un valor fijo que no será alterado por un optimizador. El método fix se
usa para establecer un valor de elementos de una Var, y el método de unfix se usa para deshacer
elementos de una Var.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
OBJETIVOS
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
OBJETIVOS
Se admiten argumentos con nombre y sin nombre, y la Tabla proporciona una lista de los
argumentos comunes que se pueden pasar al declarar el componente Objective
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
OBJETIVOS
La palabra clave expr se puede utilizar para especificar la expresión real del objetivo. También se
puede usar la palabra clave rule para especificar una regla (una función de Python) que devuelve
una expresión. Una regla proporciona control sobre cómo se forma el objetivo. Ambas opciones se
ilustran aquí:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
OBJETIVOS
Algunos solucionadores pueden realizar una optimización multiobjetivo con dos o más objetivos.
Se pueden declarar varios objetivos individualmente o se pueden indexar y definir usando una
regla como se muestra aquí:
Cuando el objeto Objective se declara como un componente indexado, Pyomo itera sobre todos
los elementos del conjunto de índices durante la construcción del objeto, pasando cada elemento
del conjunto a la función dada como argumento de la palabra clave de la regla. Si se especifican
varios conjuntos en una declaración de objetivo, Pyomo itera sobre el producto cruzado de todos
los conjuntos, proporcionando un elemento para cada conjunto a la función de regla.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
OBJETIVOS
En algunos contextos, puede ser conveniente no definir objetivos para algunos valores de índice. Si
la regla de construcción devuelve Objective.Skip, el objetivo se ignora.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
La función objetivo contiene algunos atributos que pueden resultar útiles para la creación de
scripts o la depuración. El atributo expr almacena la expresión del objetivo. El atributo sense indica
si el objetivo debe minimizarse o maximizarse. La función value se puede utilizar para calcular el
valor del objetivo. Estos se ilustran en el siguiente ejemplo:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
RESTRICCIONES
Una restricción define una o más expresiones que ponen límites a los valores factibles de las variables.
La declaración de expresiones de restricción es similar a la declaración de expresiones de función
objetivo. Las restricciones difieren de los objetivos en que las expresiones incluyen relaciones
(igualdades o desigualdades). Si bien los objetivos se pueden indexar, esta función se usa con poca
frecuencia. Por el contrario, las restricciones se indexan comúnmente, lo que permite construir y
almacenar una colección de expresiones de restricción relacionadas en un único objeto de restricción.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
RESTRICCIONES
La expresión especificada por la palabra clave expr se puede generar alternativamente con una
función de regla. Por ejemplo, la restricción diff también se puede declarar de la siguiente manera:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
RESTRICCIONES
Se admiten varios argumentos con nombre y la Tabla enumera los argumentos comunes que se
pueden pasar al declarar un componente Constraint.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
RESTRICCIONES
Las restricciones se pueden indexar y esos índices se pueden usar para hacer referencia a elementos
específicos de parámetros y variables indexados al construir expresiones. El siguiente fragmento de
código muestra un ejemplo de esto:
RESTRICCIONES
Dados los datos especificados en a y b, la instancia del modelo pasada al solucionador incluirá las
siguientes restricciones explícitas:
RESTRICCIONES
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
RESTRICCIONES
En algunos modelos de optimización, es posible que no se defina una restricción para todos los índices. Por
ejemplo, es posible que determinados índices no sean realizables físicamente. La función de regla puede devolver
Constraint.Skip (o Constraint.NoConstraint) para indicar que no hay ninguna restricción asociada con un índice en
particular. Por ejemplo, considere la declaración de una restricción de programación de tareas teórica:
El valor Constraint.Skip indica que no se genera ninguna restricción y se omite el valor de índice
correspondiente. Una alternativa a este enfoque es construir un conjunto de índices dispersos que
especifique solo los índices válidos en la restricción. Sin embargo, esto puede no ser siempre práctico en
modelos complejos. CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Después de declarar una restricción, la expresión de restricción se procesa para identificar los
elementos de la tupla lógica: (lower, body, upper), donde las expresiones no constantes se
envían al cuerpo. Por lo tanto, los atributos lower e upper son expresiones constantes o
Ninguno, y el atributo body contiene una expresión Pyomo. Si una restricción contiene una
expresión de igualdad, el atributo de igualdad es Verdadero y los atributos superior e inferior
tienen el mismo valor.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
SET DATA
conjunto es una colección de datos, que posiblemente incluya datos numéricos (por ejemplo, valores
reales o enteros) así como datos simbólicos (por ejemplo, cadenas) que normalmente se utilizan para
especificar los índices válidos para un componente indexado. Se pueden usar varias clases para definir
conjuntos en modelos Pyomo:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DECLARACIONES Set
Se admiten
argumentos con
nombre y sin
nombre, y la Tabla
proporciona una lista
de los argumentos
comunes que se
pueden pasar al
declarar el
componente Set.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DECLARACIONES Set
También se puede especificar un conjunto indexado proporcionando otros conjuntos o listas de Python
como argumentos sin nombre en la declaración:
De manera similar, los tipos estándar de Python se pueden usar para definir un índice establecido:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DECLARACIONES Set
Las declaraciones de conjuntos también pueden usar operaciones de conjuntos estándar para declarar
un conjunto de forma constructiva:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DECLARACIONES Set
La palabra clave initialize se puede utilizar para especificar los elementos de un conjunto:
También se puede pasar un diccionario de Python a la palabra clave initialize para especificar los
elementos de cada índice de un conjunto indexado:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DECLARACIONES Set
Alternativamente, se puede pasar una regla (una función de Python) a la palabra clave initialize para
proporcionar los elementos de un conjunto indexado. La función acepta el modelo y los índices y
devuelve el conjunto deseado para ese índice:
Los ejemplos anteriores ilustran cómo se pueden especificar o generar dinámicamente datos para
inicializar un conjunto. Hay algunos contextos en los que es más sencillo especificar los elementos del
conjunto que deben omitirse. La palabra clave filter se puede utilizar para especificar una función que
devuelve True cuando un elemento pertenece a un conjunto y False en caso contrario. Por ejemplo:
Aquí, el conjunto P contiene valores primos y el conjunto Q es el conjunto de todos los números
excepto los miembros de P. CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DECLARACIONES Set
Después de construir un conjunto indexado en un modelo concreto, se pueden agregar conjuntos para
índices específicos usando el operador igual de Python:
La validación de los datos del conjunto se admite de dos formas diferentes. Primero, se puede
especificar un superconjunto con la palabra clave dentro o dominio:
Cuando se agrega un elemento al conjunto B, se verifica para confirmar que también pertenece a A.
Esto asegura que B sea un subconjunto de A.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DECLARACIONES Set
La validación de los datos del conjunto también se puede realizar pasando una regla al argumento de la
palabra clave validate. La función de regla debe devolver True si el elemento que se pasa pertenece a
este conjunto, y False en caso contrario (Pyomo lanzará una excepción). Por ejemplo, la siguiente
función de validación de C imita el argumento de la palabra clave interna:
Finalmente, tenga en cuenta que si se especifican los argumentos de la palabra clave within y validate,
entonces la lógica especificada por ambos se aplica para validar los elementos del conjunto.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DECLARACIONES Set
De forma predeterminada, los conjuntos se ordenan por orden de inserción. En algunos casos, es
posible que deseemos que los elementos del conjunto estén ordenados. Esto se puede hacer usando la
opción Set.SortedOrder con la palabra clave ordenada:
Los conjuntos pueden contener elementos de datos que son singleton o k-tuples. La palabra clave
dimen se utiliza para especificar la dimensión esperada de los datos. El valor predeterminado es uno, lo
que indica que el conjunto contendrá datos singleton. En algunos casos, el valor apropiado de la
dimensión se puede determinar a partir de otros valores de palabras clave, pero en general se requiere
que el usuario especifique esta palabra clave para los datos del conjunto de tuplas.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DECLARACIONES Set
El componente RangeSet define un conjunto virtual ordenado que representa una secuencia de
valores enteros o de punto flotante. Esta secuencia está definida por un valor inicial, un valor final y un
tamaño de paso. Si un RangeSet se define con un solo argumento, el argumento define el valor final. El
valor inicial predeterminado es 1 y el tamaño de paso predeterminado es 1. Por ejemplo, lo siguiente
define una secuencia de números enteros del 1 al 10:
Si un RangeSet se define con dos argumentos, el primero es el valor inicial y el segundo es el valor
final. Por ejemplo, lo siguiente define una secuencia de números enteros del 5 al 10:
Finalmente, si un RangeSet se define con tres argumentos, entonces son el valor inicial, el valor final y
el tamaño del paso respectivamente. Por ejemplo, lo siguiente define una secuencia de valores de
coma flotante de 2.5 a 10.0 con el paso 1.5:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Se puede acceder a los elementos del conjunto con el método data(), que devuelve los datos del
conjunto subyacente como una tupla de Python (o un diccionario de Python para conjuntos indexados)
como se muestra a continuación.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Los conjuntos ordenados incluyen una variedad de métodos que reflejan el orden en el conjunto:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
NOTA: Los índices de posición comienzan en uno, no en cero. El orden del conjunto está determinado
por la secuencia de los datos proporcionados cuando se instancia y la opción especificada para el
argumento de palabra clave ordenada.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DATOS DE PARÁMETROS
Un parámetro es un valor numérico o simbólico que se utiliza para formular restricciones y objetivos
en un modelo. Los parámetros de Pyomo se pueden crear usando la clase Param, que puede denotar
un valor único, una matriz de valores o una matriz multidimensional de valores. Un componente
Param no indexado se parece mucho a un valor escalar, y un componente Param indexado se parece
mucho a un diccionario de valores de Python. El componente Param admite funciones avanzadas
como mutabilidad y representaciones dispersas con valores predeterminados.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DATOS DE PARÁMETROS
Se admiten argumentos con nombre y sin nombre, y Table proporciona una lista de los argumentos
comunes que se pueden pasar al declarar el componente Param.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DATOS DE PARÁMETROS
Se puede especificar un parámetro indexado proporcionando conjuntos como argumentos sin nombre
a la declaración Param:
La palabra clave initialize se puede utilizar para especificar el valor de un parámetro como se muestra
en los dos fragmentos de código anteriores. También se puede pasar una función de regla a la palabra
clave initialize para establecer el valor de un parámetro:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DATOS DE PARÁMETROS
Si se utilizan conjuntos ordenados para definir el índice de un parámetro indexado, la función de
inicialización puede hacer referencia a valores de parámetro definidos previamente:
La opción predeterminada se puede utilizar para especificar valores de parámetros para todos los
índices válidos que no se han inicializado explícitamente. Por ejemplo, podemos definir un parámetro
indexado que representa una matriz diagonal de 3 × 3 de la siguiente manera:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DATOS DE PARÁMETROS
De forma similar al componente Establecer, hay dos formas de validar los valores de los parámetros.
Primero, la opción dentro de la palabra clave se puede utilizar para especificar el dominio válido de los
valores de los parámetros:
La validación de los datos de los parámetros también se puede realizar con la opción de validación, que
especifica una función que devuelve Verdadero si el valor de un parámetro es válido y Falso si no lo es
(Pyomo lanzará una excepción). El siguiente ejemplo usa la opción de validación para imitar el
comportamiento de la opción within:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DATOS DE PARÁMETROS
La validación de los parámetros indexados se realiza de manera similar. La opción de validación
especifica una función cuyos argumentos son el modelo, el valor del parámetro y los índices de los
parámetros:
Si se especifican las opciones internas y de validación, se aplicará la lógica de ambas opciones para
validar los valores de los parámetros.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DATOS DE PARÁMETROS
El componente Param se puede utilizar para representar valores constantes en modelos Pyomo; sin
embargo, también se admite la mutabilidad. En el siguiente ejemplo, Pyomo genera la expresión para
el objetivo en este modelo con la forma:
Específicamente, Pyomo ha tratado los valores de los parámetros como constantes fijas y sus
expresiones simplemente contienen las constantes numéricas.
Tenga en cuenta que esta "conversión" ocurre tan pronto como se crea la expresión por primera vez. El hecho de
que estos valores provengan de un componente Param se pierde y solo quedan los valores numéricos. Esto se hace
por eficiencia. En consecuencia, estos valores no se pueden cambiar una vez que se crea la expresión.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DATOS DE PARÁMETROS
Sin embargo, este comportamiento es diferente si se especifica la opción mutable al construir el
modelo. Si esta opción es Verdadero, los valores de los parámetros no se tratan como constantes.
Considere el ejemplo anterior nuevamente donde el parámetro p ahora es mutable:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
DATOS DE PARÁMETROS
Cuando Pyomo genera la expresión para el objetivo en este modelo, mantiene el conocimiento del
componente Param y ahora tiene la forma:
donde los valores pi son objetos Param con referencias a los valores de los parámetros. Aquí, Pyomo
trata los valores de los parámetros como valores mutables que el usuario puede cambiar más
adelante. En este ejemplo, los valores de los parámetros se cambian después de que se define la
expresión del objetivo, y el objetivo resultante es
Los parámetros solo se reemplazan con sus valores numéricos cuando se llama al solucionador. Por lo
tanto, sus valores se pueden cambiar entre llamadas consecutivas a un solucionador. Los parámetros
mutables requieren una sobrecarga adicional para la memoria y requieren un procesamiento adicional
al traducir las expresiones de Pyomo a una forma que comprenda un solucionador. En consecuencia,
los parámetros son inmutables por defecto.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Sin embargo, no es necesario definir todos estos valores en un modelo. Por ejemplo:
El parámetro W está definido para los índices 1 y 3, pero el conjunto de índices B incluye 1, 2 y 3. Si se
accede a W [2], se produce un error y se lanza una excepción de Python.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Sin embargo, no es necesario definir todos estos valores en un modelo. Por ejemplo:
El parámetro W está definido para los índices 1 y 3, pero el conjunto de índices B incluye 1, 2 y 3. Si se
accede a W [2], se produce un error y se lanza una excepción de Python.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
EXPRESIONES NOMBRADAS
Las expresiones Pyomo son declaraciones matemáticas que contienen números, parámetros y variables
combinadas usando operadores como +, -, *, / por ejemplo. Estas expresiones forman la base de la
representación algebraica de un modelo y se almacenan dentro de los componentes de restricción y
objetivo del modelo.
El componente Expresión proporciona un mecanismo para almacenar una expresión Pyomo en un modelo
que hace que la expresión sea reutilizable en múltiples contextos, como una subexpresión común en una o
más restricciones, sin la sobrecarga de regenerar la expresión cada vez. Además, la expresión Pyomo
almacenada por el componente Expression se puede cambiar en un momento posterior, actualizando así
cualquier restricción o expresión objetiva que haga referencia a ella. Esto proporciona un enfoque poderoso
para modificar un modelo entre llamadas a un solucionador.
Las siguientes secciones describen la sintaxis para declarar y trabajar con expresiones con nombre.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
EXPRESIONES NOMBRADAS
Las expresiones Pyomo son declaraciones matemáticas que contienen números, parámetros y variables
combinadas usando operadores como +, -, *, / por ejemplo. Estas expresiones forman la base de la
representación algebraica de un modelo y se almacenan dentro de los componentes de restricción y
objetivo del modelo.
El componente Expresión proporciona un mecanismo para almacenar una expresión Pyomo en un modelo
que hace que la expresión sea reutilizable en múltiples contextos, como una subexpresión común en una o
más restricciones, sin la sobrecarga de regenerar la expresión cada vez. Además, la expresión Pyomo
almacenada por el componente Expression se puede cambiar en un momento posterior, actualizando así
cualquier restricción o expresión objetiva que haga referencia a ella. Esto proporciona un enfoque poderoso
para modificar un modelo entre llamadas a un solucionador.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
EXPRESIONES NOMBRADAS
Se admiten argumentos con nombre y sin nombre, y la Tabla proporciona una lista de los
argumentos comunes que se pueden pasar al declarar el componente Expression.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
EXPRESIONES NOMBRADAS
Las palabras clave expr o rule se pueden usar para inicializar una expresión nombrada cuando
se declara, como se muestra en el siguiente ejemplo:
Al igual que con los otros componentes básicos de modelado, el componente Expression se puede indexar
declarándolo con uno o más argumentos sin nombre que representen conjuntos de indexación. El siguiente
ejemplo declara un componente de expresión indexado sobre todos los miembros del conjunto de índices
excepto el primero. Los índices que deben dejarse fuera del componente Expression indexado se indican
devolviendo el atributo Expression.Skip de la función de regla.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Un uso simple del componente Expression declara una sola expresión y la usa dentro de un
objetivo y una declaración de restricción:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
COMPONENTE Suffix
Los sufijos proporcionan un mecanismo para anotar un modelo con datos auxiliares que no están
estrictamente relacionados con la declaración y estructura del modelo. Los complementos de
solucionador suelen utilizar sufijos para almacenar información adicional sobre la solución de un
modelo. De manera más general, los sufijos se pueden utilizar para
Esta funcionalidad está disponible para el modelador a través de la clase de componente Suffix,
proporcionando una interfaz para anotar componentes de modelado Pyomo con datos
adicionales.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
COMPONENTE Suffix
El siguiente código crea un sufijo etiquetado foo:
Se admiten argumentos con nombre, y la Tabla proporciona una lista de los argumentos comunes
que se pueden pasar al declarar el componente Sufijo
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
COMPONENTE Suffix
• Suffix.LOCAL: los datos del sufijo son locales para el modelo. Los complementos de
solucionador no lo importan ni exportan y es el predeterminado.
• Suffix.IMPORT: Los datos de sufijo se importarán desde los solucionadores al modelo mediante
complementos de solucionadores.
• Suffix.EXPORT: Los complementos exportarán los datos del sufijo del modelo al solucionador.
• Suffix.IMPORT EXPORT: Los complementos del solucionador importan y exportan los datos del
sufijo.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
COMPONENTE Suffix
El argumento de la palabra clave del tipo de datos especifica el tipo de datos contenidos en el sufijo.
Este argumento puede ser uno de tres valores posibles:
Este argumento puede ser opcional para algunas interfaces de solucionador; sin embargo, exportar
datos de sufijos con solucionadores usando la interfaz de archivo nl requiere que todos los sufijos de
exportación activos tengan un tipo de datos estricto (es decir, la palabra clave del tipo de datos no
puede ser Ninguno).
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
COMPONENTE Suffix
No se garantiza que los sufijos sean compatibles con todos los complementos de solucionador en Pyomo.
Si un sufijo determinado es aceptable o no depende de la interfaz del solucionador y del solucionador que
se utilicen. En algunos casos, un complemento de solucionador generará una excepción si encuentra un
tipo de sufijo que no maneja, pero esto no es cierto en todas las situaciones. Por ejemplo, la interfaz de
archivo nl es genérica para todos los solucionadores compatibles con AMPL, por lo que Pyomo no tiene
forma de validar que un sufijo de un nombre, dirección y tipo de datos dado es apropiado para un
solucionador. Se debe tener cuidado al verificar que las declaraciones de sufijos se manejen como se
espera cuando se cambia a un solucionador o interfaz de solucionador diferente.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
COMPONENTE Suffix
El argumento de palabra clave initialize se puede utilizar para definir valores de sufijo. Este argumento
especifica una función que se ejecuta cuando se construye el modelo. Esta función devuelve una lista
o iterable de tuplas (componente, valor).
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Trabajar con Suffix
Considere el siguiente ejemplo:
Este ejemplo incluye dos componentes variables, indexados y no indexados, junto con un componente de
sufijo. Conceptualmente, la declaración del sufijo foo permite la asociación de foo con cada componente
del modelo. Por ejemplo:
Los valores de sufijo se pueden asignar con un valor de sufijo establecido y se puede acceder a ellos con
obtener un valor de sufijo. Este ejemplo ilustra dos formas de especificar el mismo sufijo: con un
nombre y con un objeto componente de sufijo. CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Trabajar con Suffix
Los valores de sufijo para componentes indexados también se pueden asignar con un valor de sufijo
establecido:
Este ejemplo ilustra cómo se usa establecer valor de sufijo para establecer el valor de un componente
indexado y un objeto de datos de un solo componente. Cuando se llama a establecer un valor de sufijo
para un componente indexado, de forma predeterminada establece valores de sufijo para todos los
elementos o índices del componente, en lugar del componente en sí. Debido a esto, cuando
intentamos recuperar el valor del sufijo para el componente model.y, encontramos que es None.
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
Trabajar con Suffix
Los valores de sufijo también se pueden borrar, lo que equivale a establecer el valor Ninguno:
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
COMPONENTE Suffix
El argumento de palabra clave initialize se puede utilizar para definir valores de sufijo. Este argumento
especifica una función que se ejecuta cuando se construye el modelo. Esta función devuelve una lista
o iterable de tuplas (componente, valor).
CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
USANDO SOLVERS
la función SolverFactory se usa para construir un objeto de interfaz de solucionador. El argumento que
se pasa a la fábrica de solucionadores especifica el nombre del solucionador que se está utilizando. En
la mayoría de los casos, este es el nombre del ejecutable que se utilizará para resolver el problema; sin
embargo, Pyomo admite nombres más cortos para algunos solucionadores. Por ejemplo, el
solucionador GLPK se puede especificar con
Una vez que se ha construido un objeto solucionador, el solucionador puede invocarse llamando al
método solve(). El método solve() acepta varios argumentos de palabras clave, algunos de los cuales
se muestran aquí, más o menos en orden de importancia.
• options: un diccionario de opciones que se pasará al solucionador subyacente.
• tee: si este argumento es Verdadero, la salida del solucionador se imprime tanto en la salida
estándar como se guarda en el archivo de registro. Si es False (el valor predeterminado), la salida
del solucionador solo se guarda en el archivo de registro si el solucionador crea uno.
• Load_solutions: si este argumento es Verdadero (el valor predeterminado), los valores de la
solución se transfieren automáticamente a los objetos Var en el modelo. Si es False, el objeto de
resultados conserva una representación sin formato de las soluciones y no se transfiere al modelo.
Se puede transferir al modelo utilizando el método model.solutions.load from (). CD - PASCO
LENGUAJES DE MODELADO PARA OPTIMIZACIÓN
USANDO SOLVERS
• logfile: el nombre de archivo utilizado para almacenar la salida para los solucionadores de shell.
• solnfile: el nombre de archivo utilizado para almacenar la solución para los solucionadores de shell.
• timelimit: el número de segundos que se ejecuta un solucionador de shell antes de que finalice. (el
valor predeterminado es Ninguno)
• report_timing: si este argumento es Verdadero, el solucionador informa la información de tiempo
(el valor predeterminado es Falso)
• solver_io: especifica una interfaz de solucionador alternativa, p. Ej. solucionador io = "nl".
• suffixes: una lista de sufijos que se exportan al solucionador.
CD - PASCO