Está en la página 1de 11

República Bolivariana de Venezuela

Ministerio del Poder Popular Para la Defensa


Universidad Nacional Experimental Politécnica de la Fuerza Armada Nacional
Bolivariana
6° Semestre Sección: D-01
Asignatura: Optimización no lineal
Carrera: Ingeniería de Sistemas

Optimización no lineal

Profesor: Integrantes:
Rodolfo Quijada * Rommy Fernández
* Estefany Rivas
* Johan Vargas
Caracas, 05 de julio de 2019
Antes de comenzar a resolver los ejercicios propuestos en esta ocasión, vale la pena
detenerse antes para describir brevemente los mecanismos utilizados para la obtención
de estos resultados.

Para la resolución de los problemas planteados fue usado Pyomo, un paquete de


software muy popular por su filosofía Open source y su sintaxis basada en la
Programación Orientada a Objetos en Python.

En cuanto a los solvers, que son paquetes diseñados para brindar el soporte
algorítmico para la resolución de problemas de Optimización y en vista de la gran
variedad de estos, decidimos utilizar uno de los más conocidos en cuanto a
Programación No Lineal se refiere: IPOPT (Interior Point OPTimizer); la cual es una
librería de Software para la Optimización No Lineal de sistemas continuos a gran
escala.

IPOPT implementa un método de punto interior primal-dual, y usa búsquedas de líneas


basado en métodos de filtrado (Fletcher and Leyffer). IPOPT está diseñado para
explotar la información de la primera y segunda derivada (Hessianos) si es
proporcionada (usualmente mediante rutinas de derivación automática en entornos de
modelado tales como AMPL). Si los Hessianos no son proporcionados, IPOPT los
aproximará usando un método de quasi-Newton.

Teniendo en cuenta cómo funciona el solver a utilizar y conociendo el entorno donde


manejaremos nuestros ejercicios, procedemos entonces a la resolución de los mismos.

Ejercicio 2: Resolver con Python los siguientes ejercicios:


El primer problema tal como se observa es un problema de Maximización sujeto a
ciertas condiciones que condicionan su solución, así que procedemos a hacer el
algoritmo:

Ya teniendo instalados y configurados Python, Pyomo e IPOPT; Lo primero que


hacemos es importar las dependencias de Pyomo para poder usarlo en nuestro
ejercicio, esto se hace con las siguientes líneas de código:

from future import


division from pyomo.environ
import *

Ya importadas las dependencias, procedemos a instanciar un modelo para nuestro


ejercicio, algo que podemos hacer con la siguiente línea de código:

modelo = ConcreteModel() #Creación e Instanciación del Modelo

Luego de Creado el Modelo, que representará el ámbito donde tendrá lugar nuestro
ejercicio, procedemos a crear las variables que formarán parte de nuestro modelo, en
este caso necesitamos 2 variables (X 1 y X2), por lo cual procedemos a su creación, de
la siguiente manera:

modelo.x = Var([1,2], domain = Reals) #Creación de Variables

Como se muestra, se crean 2 variables que llamamos X[1] y X[2], cuyo dominio se
encuentra en el campo de los números reales. Ahora bien, ya teniendo las variables
necesarias podemos proceder a formular la Función Objetivo, la cual representamos a
continuación:

#Función Objetivo:
modelo.OBJ = Objective(expr = modelo.x[1] - exp(-modelo.x[2]), sense = maximize)

Como podemos ver, ésta se define por el método Objective() y recibe 2 parámetros: La
expresión a optimizar (Es decir, la función objetivo, denotada por expr) y el objetivo (es
decir, si se quiere maximizar o minimizar la función, representado por sense).

Ya descrita la función objetivo, procedemos a establecer las restricciones por la cual se


va a regir nuestro modelo, estas son:
#Restricciones:
modelo.Restriccion1 = Constraint(expr = -sin(modelo.x[1]) + modelo.x[2] <=
0) modelo.Restriccion2 = Constraint(expr = modelo.x[1] <= 3)

Estas son definidas por medio del método Constraint() que puede recibir varios
parámetros; en este caso usamos la expresión que queremos restringir para hallar la
solución deseada.

Ahora procedemos a configurar la obtención de los valores finales de las variables X[1]
y X[2], debido a que de lo contrario no se nos mostrarán, esto lo hacemos con la
función mostrada más abajo; luego definimos el solver a utilizar y llamamos a la
resolución de nuestro problema de optimización:

#Resolvemos e imprimimos los Resultados de las Variables


def pyomo_postprocess(options=None, instance=None, results=None):
modelo.x.display() #Desplegamos los valores de las variables x[1] y X[2]

opt = SolverFactory("ipopt") #Definición del solver a usar


resultados = opt.solve(modelo) #Volcado de los datos en la variable resultados

pyomo_postprocess(None, None, resultados) #llamamos a la función pasando los


resultados (ubicados en la variable resultados) como parámetro para que sean
desplegados

De esta manera terminamos nuestro modelo, faltando solamente la ejecución y la


resolución por parte del solver, así que para recapitular, nuestro código para el modelo
se expresa en forma general de esta manera:
Ahora bien, ya terminada la formulación del modelo procedemos a ejecutar con el
solver IPOPT, el cual nos da como resultado, la siguiente información:
Como bien podemos visualizar, el solver nos dice que nuestro modelo tiene solución y
que se ha obtenido la solución óptima; a su vez se da más información de la solución
encontrada, entre las que encontramos:

El valor de la función objetivo en el punto óptimo es de 2.1316149155251924.


El valor de la variable X1 que satisface la función óptima es
3.000000011041779.
El valor de la variable X2 en el punto óptimo es de 0.14112000427984162.

Conocidos los datos necesarios, ponemos fin al ejercicio.

Ejercicio 3:

Ya conocido el procedimiento para la resolución de los modelo de optimización, a partir


de ahora nos limitaremos a mencionar las acciones hechas a manera de guía y así
avanzar más rápido.
Al igual que en el ejercicio anterior nos encontramos con un ejercicio de Optimización,
por lo cual vamos a seguir el procedimiento descrito en el ejercicio 1 debido a que nos
va a servir como guía para la resolución de nuestro modelo, los ejercicios son muy
similares en cuanto a estructura salvo que en este caso se muestra un caso de
Minimización, algo que expresamos en la función objetivo, la cual es diferente a la
resuelta anteriormente (igualmente en el caso de las Restricciones), por tal motivo,
podemos dar por entendido los pasos para la resolución de este problema de
optimización con Pyomo; finalizado el código, procedemos a resolver con IPOPT,
arrojando como resultado los siguientes resultados:
Como bien podemos visualizar, el solver nos dice que nuestro modelo tiene solución y
que se ha obtenido la solución óptima; entre las que encontramos:

El valor de la función objetivo en el punto óptimo es de 4.7792301800122265.


El valor de la variable X1 que satisface la función óptima es
1.8867957385451894.
El valor de la variable X2 en el punto óptimo es de 3.559998151230301.

Estas variables representan la solución óptima a nuestro modelo de Programación No


Lineal, por tanto damos por concluido el ejercicio.
Ejercicio 4:

El cuarto y último ejercicio corresponde a un problema de Minimización que agrupa a


una serie de restricciones bastante considerable, pero que puede ser resuelto con el
solver que hemos utilizado hasta ahora, por lo cual, sabiendo esto procedemos a
construir nuestro modelo, tal y como se muestra más abajo:
En este ejercicio nos encontramos con una situación particular que vale la pena
mencionar, y es que en la restricción 2 se nos pide que la raíz cuadrada de la variable
X2 sea mayor que ½, pero debido a que IPOPT utiliza los Hessianos y al derivar utiliza
como valor inicial de prueba el valor 0 (cero), por defecto, al intentar derivar esta
restricción se encontraría con la derivada de raíz de cero, la cual no está definida, por
lo cual, si no se hace algo para evitar este comportamiento, el modelo terminará con un
error al intentar ser resuelto por el solver, por este motivo y para evitar este problema,
sobreescribimos el valor inicial a tomar por la variable X 2 para evitar este problema,
haciendo esto, la solución será desplegada satisfactoriamente como se muestra a
continuación:

Como bien podemos visualizar, una vez más el solver nos dice que nuestro modelo
tiene solución y que se ha obtenido la solución óptima:

El valor de la función objetivo en el punto óptimo es de 0.49999998253315425.


El valor de la variable X1 que satisface la función óptima es de
-0.49999998253315286.
El valor de la variable X2 en el punto óptimo es de 0.24999999126657643.

Estos ejercicios nos dejan muy claro lo potentes que son estas herramientas en la
resolución de modelos de Programación: tanto Lineal como No Lineal, además de otros
tipos más que no hemos estudiado hasta ahora pero que son igual de importantes.

También podría gustarte