Prácticas de Optimización Jose Salvador Cánovas Peña & Silvestre Paredes Hernández Departamento de Matemática Aplicada y Estadística Contents 1 Optimización con MAXIMA 1.1 Optimización sin restricciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Optimización con restricciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 1.2.1 Paquete cobyla . . . . . . . . . . . . . . . 1.2.2 Función augmented_lagrangian_method Optimización lineal . . . . . . . . . . . . . . . . . 1.3.1 Función linear_program . . . . . . . . . . 1.3.2 Funciones minimize_lp y maximize_lp . 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 9 9 12 13 14 14 Chapter 1 Optimización con MAXIMA MAXIMA tiene implementados una serie de comandos para resolver problemas de optimización. Se incluyen comandos para optimización con restricciones (fmin_cobyla, augmented_lagrangian_method), sin restricciones (lbfgs) y lineal (simplex). También se implementan comandos para la resolución de ecuaciones no lineales (mnewton) y para problemas de ajustes de funciones (lsquares, minpack), aunque en esta práctica sólo introduciremos los primeros. En casi todos los algoritmos numéricos de optimización se procede de la misma forma; se toma un valor o aproximación inicial y se construye una sucesión de aproximaciones para las que el valor de la función objetivo o criterio de rendimiento va decreciendo (o creciendo según el objetivo del problema). Para encontrar una nueva aproximación, a partir de una dada, en casi todos los métodos existe una estructura fundamental: Se comienza desde un punto inicial x0 , a continuación se determina mediante una regla (el método elegido) una dirección de movimiento, y se avanza por esa dirección hasta llegar a un mínimo (relativo) de la función objetivo sobre ella. Ese nuevo punto, es ahora el punto de partida desde el que reiniciar el proceso. El esquema general sigue el siguiente esquema: x0 xk+1 : Aproximación inicial = xk + αk dk po siendo xk es la aproximación k—ésima, dk es la dirección, llamada de descenso, a lo largo de la cual la función objetivo va decreciendo y αk que sería la cantidad de movimiento que se debe realizar en la dirección dk . Como se puede suponer la diferencia entre los métodos radica en la regla mediante la cual se selecciona la dirección de movimiento en cada paso del algoritmo. El proceso de búsqueda del mínimo sobre la recta se llama búsqueda lineal. Una vez fijada la dirección de movimiento, el valor de la función objetivo depende solamente de una variable, que es precisamente la longitud recorrida en la dirección elegida 1.1 Optimización sin restricciones Las funciones empleadas por MAXIMA para resolver problemas de optimización sin restricciones se resumen en la siguiente tabla: Método lbfgs Descripción Minimización sin restricciones Algoritmo Cuasi Newton BFGS Función lbfgs La función lbfgs implementa el llamado algoritmo L-BFGS (método de Broyden-Fletcher-Goldfarb-Shanno con Limitación de memoria) para resolver el problema de minimización sin restricciones min f (x) x ∈ Rn 2 Antes de poder utilizar este comando, es necesario cargar la librería correspondiente con el comando load de esta forma: load(lbfgs); La forma de utilizar lbfgs viene dada en la siguiente tabla lbfgs(Fobj, X, X0, epsilon, iprint) lbfgs( [Fobj, Grad], X, X0, epsilon, iprint) Cálculo automático de ∇f (x) . ∇f (x) definido por el usuario. Todos los parámetros son obligatorios, salvo Grad. Cuando este argumento está presente, debe contener el gradiente de la función objetivo Fobj respecto de las variables X. La variable Grad puede ser una lista o una función que devuelva una lista con igual número de elementos que X. Si esta variable no está presente, el gradiente se calcula automáticamente mediante derivación simbólica. El cometido de este comando es encontrar una aproximación a la solución del problema de minimización sin restricciones cuya función objetivo viene dada por Fobj y variables de decisión dadas en X, para ello se toma como aproximación inicial la contenida en el vector X0, de tal manera que se cumpla la siguiente desigualdad || Grad(X) || < epsilon*max(1, || X || ) (1.1) siendo ||·|| la norma cuadrática del vector correspondiente. El argumento iprint es un vector que controla los mensajes que aparecen en pantalla durante el proceso. Cada componente se describe a continuación: iprint[1] Descripción Frecuencia de los mensajes Valores <0 =0 >0 Interpretación No se envían mensajes. Sólo la solución. Mensajes únicamente en la primera y última iteraciones. Imprime un mensaje cada iprint[1] iteraciones. iprint[2] Cantidad de información =0 Imprime contador de iteraciones, número de evaluaciones de FOM, valor de FOM, módulo de gradiente FOM y amplitud del paso Igual que para el valor 0, pero incluye X0 y el gradiente de FOM evaluado en X0. Igual que para el valor 1, incluyendo los valores de X en cada iteración. Igual que para el valor 2, incluyendo el gradiente de FOM en cada iteración. =1 =2 =3 Las columnas que devuelve lbfgs son los siguientes: Nombre I NFN FUNC GNORM STEPLENGTH DESCRIPCIÓN Número de iteraciones. Se incrementa tras cada búsqueda lineal. Número de evaluaciones de la función objetivo. Valor de la función objetivo al final de cada iteración. Módulo del gradiente de la función objetivo al final de cada iteración. Un parámetro interno del algoritmo de búsqueda. Example 1 Por ejemplo, si queremos encontrar el mínimo de la función f (x) = x sen (x + 1) utilizando a 0 como aproximación inicial, utilizamos el comando lbfgs(x*sin(x + 1), [x], [0],1e-4, [1,0]) 3 cuya respuesta es N= 1 NUMBER OF CORRECTIONS=25 INITIAL VALUES F= 0.000000000000000D+00 GNORM= 8.414709848078965D-01 ************************************************* I NFN FUNC GNORM STEPLENGTH 1 3 -2.400322755462485D-01 1.932430953437936D-02 6.068590410450232D-01 2 4 -2.401194982937205D-01 4.813037906504836D-03 1.000000000000000D+00 3 5 -2.401252441267841D-01 1.071982675449057D-05 1.000000000000000D+00 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS. IFLAG = 0 (%o36) [x=-0.52026367101869] Podemos comprobar que se trata de un mínimo local, ya que si realizamos la representación de la función en el intervalo mediante el comando wxplot2d(x* sin(x + 1), [x,-10, 10] ) obtendremos la siguiente representación Representación gráfica de x ∗ sen (x + 1) donde podemos observar que el mínimo global del problema se encuentra cercano al punto 10¨, bastante alejado de la solución que se ha encontrado con la función lbfgs. Debido a la presencia de la función periódica sen (·), es posible deducir que la función no tendrá mínimo (ni máximo) global. El punto que ha suministardo la rutina depende del punto de partida elegido, para comprobarlo, cambiaremos el punto de partida. Así, por ejemplo, si utilizamos el valor X0=2, y llamamos de nuevo a la función lbfgs(x*sin(x + 1), [x], [2],1e-4, [-1,0]) obtendremos como solución N= 1 NUMBER OF CORRECTIONS=25 INITIAL VALUES F= 2.822400161197344D-01 GNORM= 1.838864985141024D+00 ************************************************* I NFN FUNC GNORM STEPLENGTH 1 5 -3.838086557765887D+00 9.884041156093981D-02 1.053260970366502D+00 2 7 -3.839222860317910D+00 5.647031582457496D-04 2.074409490772091D-01 3 8 -3.839222897150713D+00 2.974017014767405D-06 1.000000000000000D+00 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS. IFLAG = 0 (%o36) [x=3.95975816226166] 4 Y comprobamos, efectivamente, que la respuesta dada ahora no coincide con la obtenida con anterioridad, también podemos comprobar en la gráfica 1.1 que se trata de otro mínimo local. Está claro que el punto de partida es fundamental a la hora de obtener una u otra solución. El valor devuelto por el comando de MAXIMA, en este caso lbfgs, es aquel que cumple unos determinados criterios. Podemos emplear la misma instrucción para funciones de varias variables, especificando en cada caso ¡ 2 un valor ¢ inicial en cada variable, por ejemplo, para localizar un mínimo local de la función f (x, y) = cos x − 3y + ¡ 2 ¢ sen x + y 2 cerca del punto (1, 1) utilizaremos la expresión: lbfgs( cos(x^2-3*y) + sin(x^2+y^2), [x,y], [1,1], 1e-3, [-1,0]) En este caso tanto el vector X=[x,y], como el vector X0=[1,1] tienen dos componentes. La respuesta que proporciona la función es: [x = 1.376379353356124, y = 1.678681594080048] Si representamos (ver en la gráfica 1.2) la función mediante el comando: plot3d(cos(x^2-3*y) + sin(x^2+y^2), [x,-2,2], [y,-2,2]) podemos ver que la función tiene infinitos máximos y mínimos y por tanto, como en el ejemplo en una variable, Figure 1.1: Minimización en 2 variables. la respuesta dependerá del punto de partida. En este caso también es interesante representar gráficamente los isocontornos de la función. Si utilizamos el comando: contour_plot(cos(x^2-3*y)+sin(x^2+y^2), [x,-2,2], [y,-2,2], [legend,false], [gnuplot_preamble,"set cntrparam levels 20"]); obtendremos la gráfica 1.3: 5 ¡ ¢ ¡ ¢ Isocontornos de la función cos x2 − 3y + sen x2 + y 2 . donde se pueden observar las zonas donde se encuentran los extremos locales. Si no se especifica, el gradiente se calcula automáticamente y de forma simbólica, no obstante es posible incluirlo como argumento en la función lbfgs, como en el siguiente ejemplo: Example 2 Encuentra mediante lbfgs el mínimo de la función F (x, y, z) = (x − 5)2 + (y − 3)4 + (z − 2)6 Incluye en la resolución el gradiente de la función objetivo. load(lbfgs) F(x, y, z):=(x - 5)^2 + (y - 3)^4 + (z - 2)^6; define(F_grad(x,y,z), map(lambda([t], diff(F(x,y,z),t)), [x,y,z])) solucion : lbfgs([F,F_grad], [x,y,z], [0,0,0], 1e-4, [1, 0]); el resultado del código anterior se refleja en la siguiente tabla: ************************************************* N= 3 NUMBER OF CORRECTIONS=25 INITIAL VALUES F= 1.700000000000000D+02 GNORM= 2.205175729958953D+02 ************************************************* I NFN FUNC GNORM STEPLENGTH 1 2 6.632967565917637D+01 6.498411132518770D+01 4.534785987412505D-03 15 16 7.683645404048677D-06 6.011057038099202D-04 1.000000000000000D+00 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS. IFLAG = 0 (%o36) [x=5.000086823042934,y=3.052395429705181,z=1.927980629919583] Teniendo en cuenta que estamos buscando el mínimo de una función que es siempre positiva por ser suma de cuadrados, la solución óptima del problema se encuentra en el único punto donde se anula la función: x∗ = (5, 3, 2) , por tanto F (x, y, z) ≥ 0 = F (5, 3, 2) 6 Podemos comprobar el error cometido por la rutina al tomar como solución aproximada al número obtenido en %o36: x = (5.000086823042934, 3.052395429705181, 1.927980629919583) kx∗ − xk = 0.0891 Y comprobamos que se cumple la condición (1.1) ³ ´ ∇F (x, y, z) = 2 (x − 5) , 4 (y − 3)3 , 6 (z − 2)5 ⇒ k∇F (x)k = 6.011057038099343e − 04 epsilon* max {1, kxk} = 1e − 4 ∗ max {1, 6.167259959382106} = 6.167259959382106e − 04 que es el criterio de parada utilizado por el comando lbfgs. Es posible definir las funciones empleadas como variables load(lbfgs) F : (x - 5)^2 + (y - 3)^4 + (z - 2)^6; F_grad: [diff(F,x), diff(F,y), diff(F,z)] solucion : lbfgs([F,F_grad], [x,y,z], [0,0,0], 1e-4, [1, 0]); Variables de sistema relacionadas Hay dos variables relacionadas con la función lbfgs y que describimos a continuación: • lbfgs_nfeval_max (Valor por defecto: 100) La variable lbfgs_nfeval_max almacena el número máximo de evaluaciones que lbfgs utiliza en la función objetivo. Cuando se alcanza el valor lbfgs_nfeval_max, la función lbfgs devuelve el resultado de la última iteración. Este límite evita que se pueda entrar en un bucle debido a la precisión finita del ordenador. • lbfgs_ncorrections (Valor por defecto: 25) La variable lbfgs_ncorrections está relacionada con el algoritmo de optimización empleado y tiene que ver con una aproximación a la inversa de la matriz hessiana en cada punto. A continuación se incluyen algunos ejemplos del uso de la función lbgfs. Example 3 Resuelve el siguiente problema con MAXIMA 2 min e−x Solución: load (lbfgs) fobjetivo(x) := exp(-x^2); x0: [0.5]; epsilon:1e-3; output:[1,0]; lbfgs(fobjetivo(x),[x],x0,epsilon,output); 7 que tiene por salida la siguiente N= 1 NUMBER OF CORRECTIONS=25 INITIAL VALUES F= 7.788007830714049D-01 GNORM= 7.788007830714049D-01 ************************************************* I NFN FUNC GNORM STEPLENGTH 1 2 1.053992245618643D-01 3.161976736855930D-01 1.284025416687741D+00 2 3 8.499465465214358D-03 3.711747613438485D-02 1.000000000000000D+00 3 4 5.667470485332136D-03 2.578048134689472D-02 1.000000000000000D+00 4 5 2.120490154477348D-03 1.052251059218531D-02 1.000000000000000D+00 5 6 1.024155213369504D-03 5.374185440592811D-03 1.000000000000000D+00 6 7 4.587713525504515D-04 2.543920635365517D-03 1.000000000000000D+00 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS. IFLAG = 0 (%o31) [x=2.772536494729975] También es posible definir la función en forma de variable: fobjetivo : exp(-x^2); En este caso la llamada a la función lbfgs sería: lbfgs(fobjetivo,[x],x0,epsilon,output); Example 4 Resuelve el siguiente problema con MAXIMA min x2 + y 2 Solución: fobjetivo(x,y) := x^2 + y^2; x0: [0.5, 0.5]; epsilon:1e-3; output:[1,0]; lbfgs(fobjetivo(x,y),[x,y],x0,epsilon,output); que tiene por salida la siguient N= 2 NUMBER OF CORRECTIONS=25 INITIAL VALUES F= 5.000000000000000D-01 GNORM= 1.414213562373095D+00 ************************************************* I NFN FUNC GNORM STEPLENGTH 1 2 1.053992245618643D-01 5.857864376269047D-01 7.071067811865475D-01 2 3 8.578643762690490D-02 3.711747613438485D-02 1.000000000000000D+00 3 4 0.000000000000000D+00 0.000000000000000D+00 1.000000000000000D+00 THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS. IFLAG = 0 (%o36) [x=0.0,y=0.0] Como antes también es posible definir la función como una variable fobjetivo(x) := exp(-x^2); y en este caso la llamada a la función lbfgs sería: lbfgs(fobjetivo, [x,y], x0, epsilon, output); 8 Actividad 1 Halla los extremos locales y globales de f (x) = x3 − 12x + 3 en el intervalo [−4, 4]. Actividad 2 Estudia los extremos relativos y absolutos de las siguientes funciones f (x, y) = x2 + 3xy − y 2 f (x, y) = x3 + 3xy 2 − 15x − 12y f (x, y) = sen x + sen y + cos (x + y) 0 < x, y < 2π Actividad 3 Dada la función h ih i f (x, y) = x2 + (y + 1)2 x2 + (y − 1)2 1.2 Optimización con restricciones Las funciones empleadas por MAXIMA para resolver problemas de optimización con restricciones se resumen en la siguiente tabla: Método fmin_cobyla augmented_lagrangian_method 1.2.1 Descripción Minimización con restricciones Minización con restricciones h (x) = 0 Algoritmo Aproximaciones lineales sucesivas. Función de penalización. Paquete cobyla El nombre de COBYLA es la abreviatura en inglés de Constrained Optimization BY Linear Aproximacion, es decir, optimización con restricciones mediante aproximaciones lineales. COBYLA se utiliza para resolver problemas del tipo min s.a. f (x) g (x) ≥ 0 Las restricciones en forma de igualdades se pueden sustituir por pares de desigualdades: ⎧ ⎨ h (x) ≥ 0 h (x) = 0 ⇐⇒ ⎩ −h (x) ≤ 0 No obstante la interfaz MAXIMA para COBYLA admite restricciones de igualdad transformándolas luego internamente a pares de desigualdades. El algoritmo hace uso de aproximaciones lineales, tanto de la función objetivo como de las funciones de restricción; tales aproximaciones se hacen mediante interpolación lineal de n+1 puntos en el espacio de variables. Los puntos de interpolación son los vértices de un símplex (símplice o simplejo) que es la extensión a dimensión n de un triángulo en dimensión 2. Así un simplex en dimensión 3 sería un tetraedro (ver figura). El parámetro RHO controla el tamaño del símplex y se reduce automáticamente de RHOBEG a RHOEND. Para cada valor del parámetro RHO la subrutina intenta alcanzar un vector adecuado de variables para el tamaño actual, reduciéndose entonces RHO hasta alcanzar el valor de RHOEND. Por eso, tanto a RHOBEG como a RHOEND se les deben asignar valores razonables, lo que requeriría cierto trabajo empírico previo. La rutina trata cada restricción individualmente, en lugar de considerarlas todas dentro de una función de penalización. 9 Figure 1.2: Tetraedro (simplex en dimensión 3). Función fmin_cobyla Antes de su uso, se debe cargar la librería correspondiente con la instrucción load load(fmin_cobyla); El uso de fmin_cobyla viene dado en la siguiente tabla fmin_cobyla(FObj, X, X0) fmin_cobyla(FObj, X, X0, optional_args) Devuelve una aproximación del valor mínimo de la expresión FObj respecto de las variables X, sujeta a un conjunto opcional de restricciones. X0 es una lista que contiene la aproximación inicial en X. FObj debe ser una expresión ordinaria, no valen nombres de funciones ni expresiones tipo lambda (ver manual de MAXIMA). X es un vector de variables de n componentes. El parámetro optional_args hace referencia a argumentos adicionales, que se especifican en la forma symbol = value. Los argumentos opcionales que se reconocen son: • constraints Lista de restricciones en forma de desigualdades e igualdades que debe satisfacer X. Las restricciones de desigualdad deben ser de la forma g(X) >= h(X) o g(X) <= h(X). Las restricciones de igualdad deben ser de la forma g(X) = h(X). • rhobeg Valor inicial de la variable interna RHO, que controla el tamaño del simplex. Su valor por defecto es 1.0. • rhoend El valor final deseado para el parámetro RHO. Es aproximadamente la precisión de las variables. Su valor por defecto es 1d-6. 10 • iprint Nivel de información de salida. Los posibles valores se indican en la siguiente tabla, su valor por defecto es 0. iprint Descripción Nivel de información de salida . Valores 0 1 2 3 Interpretación Sin información de salida. Sumario al final de los cálculos. Se van mostrando los nuevos valores de RHO y SIGMA, incluyendo el vector de variables. Como en 2, pero la información se muestra cuando se calcula F(X). • maxfun Número máximo de evaluaciones de la función. Su valor por defecto es 1000. El resultado que devuelve la función fmin_cobyla es un vector cuyas componentes están descritas en la siguiente tabla: Componente 1 2 3 4 Interpretación Los valores de las variables en las que se alcanza el valor mínimo. Es una lista de elementos de la forma var = value para cada una de las variables listadas en X El valor mínimo de la función objetivo. El número de evaluaciones de la función. Código de respuesta con los siguientes significados: 0 - No ha habido errores 1 - Alcanzado el número máximo de evaluaciones de la función. 2 - Los errores de redondeo han impedido el avance del proceso. Example 5 Resuelve el siguiente problema con MAXIMA min xy s.a. 1 − x2 − y 2 ≥ 0 Solución: load (fmin_cobyla); fobjetivo(x,y) := x*y; x0: [1, 1]; fmin_cobyla(fobjetivo(x,y),[x,y], x0, constraints=[x^2+y^2<=1], iprint=1); que tiene por salida la siguiente: Normal return from subroutine COBYLA NFVALS = 66 F =-5.000000E-01 MAXCV = 1.999845E-12 X = 7.071058E-01 -7.071077E-01 (%o6) [[x=0.70710584934848,y=-0.7071077130248],-0.49999999999926,66,0] También es posible definir la función como una variable de esta forma fobjetivo : x*y; en este caso la llamada a la función fmin_cobyla sería: fmin_cobyla(fobjetivo,[x,y], x0, constraints=[x^2+y^2<=1], iprint=1); 11 1.2.2 Función augmented_lagrangian_method La función augmented_lagrangian_method minimiza el llamado lagrangiano aumentado (o penalizado) haciendo uso del algoritmo LBFGS, se utiliza para problemas del tipo: min s.a. f (x) h (x) = 0 que se transforma en un problema sin restricciones de la forma min f (x) + m X λ2i h2i (x) i=1 Como el sumatorio está formado por términos positivos, cualquier valor de x que no sea factible (h (x) 6= 0) contribuirá con un valor positivo y será penalizado frente a puntos que si son factibles (h (x) 6= 0). Antes de su uso, se debe cargar la librería correspondiente con la instrucción load: load(augmented_lagrangian); El uso de augmented_lagrangian_method viene dado en la siguiente tabla augmented_lagrangian_method(FObj, X, R, X0) augmented_lagrangian_method(FObj, X, R, X0, optional_args) augmented_lagrangian_method([FObj, Grad], X, R, X0) augmented_lagrangian_method([FObj, Grad], X, R, X0, optional_args) La función devuelve una aproximación del valor mínimo de la función objetivo FObj respecto de las variables dadas en el vector X y manteniendo las restricciones definidas en R igual a cero. La lista X0 contiene las aproximaciones iniciales para X. Si Grad está presente en la llamada a la función, se interpreta como el gradiente de la función FObj respecto de las variables X y estará representado como una lista de tantas expresiones como variables tenga X. Si el argumento Grad no está, se calculará de forma automática. El argumento optional_args hace referencia a argumentos adicionales, los cuales se especifican de la forma symbol = value. Estos argumentos son: niter lbfgs_tolerance iprint lambda Descripción Número de iteraciones del algoritmo Tolerancia del algoritmo Lista de dos enteros que controlan la frecuencia de mensajes y la cantidad de información en cada mensaje durante el proceso. Valores/Interpretación Ver función lbfgs Valor inicial de %lambda que será utilizado para calcular el lagrangiano aumentado. Example 6 Resuelve el siguiente problema con MAXIMA y la función augmented_lagrangian_method min x2 + 2y 2 s.a. x + y = 1 12 Solución: load (augmented_lagrangian); FObj(x,y) := x^2 + 2*y^2; R : [x+y-1]; x0: [1, 1]; augmented_lagrangian_method(FObj(x,y), [x,y], R, x0, iprint=[-1,0]); que tiene por salida la siguiente: [[x=0.66665984108002,y=0.33334027245545], %lambda=[-1.333337940892525]] También es posible definir la función como una variable: FObj : x^2+2*y ^2; en este caso la llamada a la función augmented_lagrangian_method sería: augmented_lagrangian_method(FObj, [x,y], R, x0, iprint=[-1,0]); Example 7 Resuelve el siguiente problema con MAXIMA y la función min s.a. y x2 + z 2 = 10 x+y+z =3 Solución: load (augmented_lagrangian); FObj(x,y,z) := y; R : [x̀ ^2+z ^2-10, x+y+z-3]; x0: [1, 1, 1]; augmented_lagrangian_method(FObj(x,y,z), [x,y,z], R, x0, iprint=[-1,0]); que tiene por salida la siguiente: [[x=2.236499068014832,y=-1.47153167636176,z=2.236499068014832],%lambda=[0.97436850268555,0.97436850268555]] Actividad 4 Determina los puntos de la elipse que se obtienen al cortar el cilindro de ecuación x2 + y 2 = 1 con el plano x + y + z = 1, cuyas distancias al origen sean respectivamente máxima y mínima. Actividad 5 Resuelve el problema Optimizar Sujeto a f (x, y, z) = x2 + y 2 + z 2 x + y 2 + z 2 + xy + yz + zx − 1 = 0 x + 2y − 3z = 0 2 Actividad 6 Halla la mínima distancia entre la recta x + y = 4 y la circunferencia x2 + y 2 = 1 Actividad 7 Resuelve el siguiente problema Optimizar Sujeto a 1.3 −x2 + 2y + z x + 2y − z = 0 2y + z = 0 Optimización lineal El paquete simplex utiliza el algoritmo del mismo nombre para resolver problemas de programación lineal. 13 1.3.1 Función linear_program La función linear_program es una implementación del algoritmo simplex y se utiliza para resolver problemas de la forma min c1 x1 + c2 x2 + · · · cn xn s.a. Ax = b xk ≥ 0 donde A es una matriz, b y c son vectores. La instrucción linear_program(A, b, c) calcula un vector x tal que minimiza c.x (c1 x1 + c2 x2 + · · · cn xn ) bajo las restricciones A.x = b y x >= 0. El argumento A es una matriz y los argumentos b y c son vectores. Si el problema tiene solución, entonces el valor que devuelve linear_program es una lista que contiene un vector x, con la solución óptima y el valor óptimo. Por el contrario, si el problema no está acotado devuelve el mensaje "Problem not bounded!" y si el problema no es factible devuelve el mensaje "Problem not feasible!". Para usar esta función, hay que cargar primero el paquete con la instrucción load(simplex). Example 8 Resuelve el siguiente problema con MAXIMA y la función linear_program min s.a. x1 − 2x2 x1 + x2 − x3 = 1 2x1 − 3x2 − x4 = 1 4x1 − 5x2 = 6 xj ≥ 0 Solución: load (simplex); A : matrix([1,1,-1,0], [2,-3,0,-1], [4,-5,0,0]); b : [1, 1,6]; c : [1, -2, 0, 0]; linear_program(A,b,c) que tiene por salida la siguiente: 1.3.2 ∙∙ ¸ ¸ 13 19 3 , 4, , 0 , − 2 2 2 Funciones minimize_lp y maximize_lp La función minimize_lp se utiliza para resolver problemas lineales de la forma: min Sujeto a. c1 x1 + · · · + cn xn ae11 x1 + · · · + ae1n xn = be1 .. . aem1 x1 + · · · + aemn xn = bem ag11 x1 + · · · + ag1n xn ≥ bg1 agp1 x1 + · · · + agpn xn ≥ bgp al11 x1 + · · · + al1n xn ≤ bl1 .. . alq1 x1 + · · · + alqn xn ≤ blq xk ≥ 0 14 El uso de esta función sería de la forma minimize_lp(obj, con, [pos]) Esta función minimiza la función objetivo lineal obj (c1 x1 +· · ·+cn xn ) sujeta a las restricciones lineales indicadas en la variable cond, estas restricciones se representan como una lista de ecuaciones o inecuaciones lineales. A la hora de resolver el problema en las inecuaciones estrictas se reemplaza > por ≥ y < por ≤. El argumento pos es opcional y contiene una lista con las variables de decisión que deben ser positivas, en otro caso serían libres. Si el mínimo existe, minimize_lp devuelve una lista que contiene el valor mínimo de la función objetivo y una lista de valores para las variables de decisión con los que se alcanza el mínimo. Si el problema no está acotado, devuelve el mensaje "Problem not bounded!" y si el problema no es factible, devuelve el mensaje "Problem not feasible!". Si no se especifica lo contrario, las variables de decisión serían libres, para indicar que todas las variables de decisión son no negativas, se le puede asignar el valor true a la variable del sistema nonegative_lp. Si sólo algunas de las variables de decisión fueran positivas entonces se pueden incluir restricciones de la forma x ≥ 0, aunque es más eficiente utilizar el argumento pos. La función minimize_lp utiliza el algoritmo simplex implementado en la función linear_program de Maxima y por tanto para usar esta función, es necesario cargar primero el paquete con la instrucción load(simplex). La función maximize_lp es identica en funcionamiento a minimize_lp pero en este caso el objetivo del problema sería maximizar. A continuación pondremos una tabla con diferentes ejemplos ⎧ Problema ⎨ min x + y 3x + y = 0 ⎩ ⎧ x + 2y ≥ 2 min x + y ⎪ ⎪ ⎨ 3x + y > 0 x + 2y > 2 ⎪ ⎪ ⎩ ⎧ x, y ≥ 0 min 2x + y ⎪ ⎪ ⎪ ⎪ x+y ≤2 ⎪ ⎪ ⎨ −x + y ≤ 3 3x + 2y ≤ 10 ⎪ ⎪ ⎪ ⎪ x libre ⎪ ⎪ ⎩ y≥0 ⎧ min −10x + 4y ⎪ ⎪ ⎨ x−y ≤2 5x − 2x ≤ 16 ⎪ ⎪ ⎩ ⎧ x, y ≥ 0 max 2x + 5y ⎪ ⎪ ⎨ x+y ≥4 x≥2 ⎪ ⎪ ⎩ x, y≥0 ⎧ min x+y ⎪ ⎪ ⎨ x + y <= 1 4x + 2y >= 6 ⎪ ⎪ ⎩ x, y ≥ 0 Instrucciones MAXIMA minimize_lp(x+y, [3*x+y=0, x+2*y>2]); minimize_lp(x+y,[3*x+y>0,x+2*y>2]),nonegative_lp=true; o minimize_lp(x+y,[3*x+y>0,x+2*y>2],[x,y]); maximize_lp(2*x+y,[x+y<=2,-x+y<=3,3*x+2*y<=10],[y]); minimize_lp(-10*x+4*y,[x-y<=2, 5*x-2*y<=16]),nonegative_lp=true; o minimize_lp(-10*x+4*y,[x-y<=2, 5*x-2*y<=16],[x,y]); Respuesta [4/5,[y=6/5,x=-2/5]] [1, [y = 1, x = 0]] [4, [y=0, x=2]] [-32, [y=2, x=4]] maximize_lp(2*x+5*y,[x+y>=4, x>=2]),nonegative_lp=true; o maximize_lp(2*x+5*y,[x+y>=4, x>=2],[x,y]); Problem not bounded! minimize_lp(x+y, [x+y<=1,4*x+2*y>=6]), nonegative_lp=true; o minimize_lp(x+y, [x+y<=1,4*x+2*y>=6],[x,y]); Problem not feasible! Funcion maximize_lp La función maximize_lp esMaximiza la función objetivo lineal obj sujeta a ciertas restricciones lineales cond. Véase minimize_lp para una descripción detallada de los argumentos y de la respuesta dada por esta función. 15 Variables opcionales • nonegative_lp Valor por defecto: false. Si nonegative_lp vale true todas las variables de decisión pasadas a minimize_lp y a maximize_lp se suponen positivas. Actividad 8 Resuelve el siguiente problema Optimizar Sujeto a −x + 2y + z x + 2y − z = 0 2y + z = 0 Actividad 9 Resuelve el siguiente problema min x+y s.a. 3x + 2y > 2 x + 4y > 3 Actividad 10 Resuelve el siguiente problema Minimizar x +2y Sujeto a −5x +y x +y x y = 7 ≥ 26 ≥ 3 ≥ 4 Actividad 11 Resuelve los siguientes problemas Minimizar x+y s.a. x + 2y ≥ 3 x, y ≥ 0 Minimizar x+y s.a. x + 2y = 3 x, y ≥ 0 Minimizar x+y s.a. x + 2y ≤ 3 x, y ≥ 0 Minimizar s.a. x+y x + 2y ≥ 3 −1 ≤ x ≤ 2 −1 ≤ y ≤ 1 16