Está en la página 1de 9

MA3701 Optimización

Informe de la Tarea #1
Desarrollo y resultados

Autor: Isaí Hidalgo Rodríguez.


Profesor: Jorge Amaya.
Auxiliares: Aldo Gutiérrez y Manuel Torres.
Ayudante: José Calderón, Diego Morales y Daniela Sánchez.
Fecha: 01 de septiembre de 2023. Semestre de Primavera.
Índice general

1. Introducción 2

2. Respuestas 3
1. Preguntas de la tarea . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Conclusión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

A. Anexo 5
1. Codificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2. Imágenes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

1
Capítulo 1

Introducción

El presente informe tiene por objetivo lograr familiarizarse con las herramientas numéricas pa-
ra resolver problemas de optimización. Para ello, se resuelven dos problemas utilizando la librería
Scipy, y uno utilizando matplotlib.

La librería Scipy es un paquete científico que inlcuye interfases a otras librerías científicas, y
que permite ajustar datos de manera lineal y no lineal, ajustar funciones generales, interpolar datos,
realizar integraciones numéricas, entre otras muchas funciones.

En este informe interesa conocer la función de optimización que incluye esta librería, en donde
es posible resolver problemas de minimización o maximización de alguna función objetivo dada,
sujeta a determinadas restricciones.

2
Capítulo 2

Respuestas

1.- Preguntas de la tarea


P1.- Enunciado del problema 1:

Solución: De la librería Scipy se importa linprog, y se define el vector de costos y las


matrices para las restricciones, tal como en Listing A.1. Luego, se resuelve el problema
desarrollando un código como el de Listing A.1. De esa forma, el problema de optimiza-
ción lineal tiene como solución el valor -20,5 para la función objetivo.

P1.- Enunciado del problema 2:

Solución: Para modelar este problema, primero se definen las variables de decisión, que
en este caso son las dimensiones del paquete postal, largo = L, ancho = A, altura = H.
La restricción impuesta es que su altura más el perímetro no excedan los 53 cms, además
de ser positivas todas las variables. Esto se traduce en lo siguiente: 2 ∗ L + 2 ∗ A + H <=
53 <=> −2 ∗ L − 2 ∗ A − H + 53 >= 0, con L, A, H >= 0

3
CAPÍTULO 2. RESPUESTAS 4

Y la función objetivo del problema es maximizar el volumen del paralelepipedo, esto es


equivalente a maximizar la multiplicación de las tres variables definidas. Como se ocupa-
rá minimize, es equivalente a minimizar esa multiplicación por −1, quedando −L∗A∗H
Teniendo claro el problema a optimizar, lo resolvemos mediante el comando minimize
de Scipy, como en el Listing A.2.
Así, se tiene que el resultado de optimizar el problema enunciado es un paquete postal
con volumen de 1378,49 [cms3 ], con largo y ancho de 8,83 [cms] y altura de 17,66 [cms].

P1.- Enunciado del problema 3:

Solución: Utilizando matplotlib, se grafican las regiones de factibilidad para los tres pro-
blemas de optimización. El Listing A.3 lo detalla.
El primero arroja la gráfica de la Figura A.1
El segundo arroja la gráfica de la Figura A.2
El tercero arroja la gráfica de la Figura A.3

2.- Conclusión
Resulta entonces bastante útil ocupar esta librería, Scipy, a la hora de resolver problemas de
optimización. De tal manera que esta herramienta queda a disposición para futuros trabajos rela-
cionados a esta área de la matemática.
Apéndice A

Anexo

1.- Codificación
La resolución del problema 1 se realizó con la siguiente codificación
1 from scipy.optimize import linprog
2 c = [-8,-1,-3]
3 A = ([-1,1,1],[3,5,5],[9,-5,0])
4 b = np.array([13,10,20])
5 # I n c l u m o s las restricciones para cada variable
6 x_bound = (0, None)
7 y_bound = (0, None)
8 z_bound = (0, None)
9 [x_bound,y_bound, z_bound]
10 sol = linprog(c, A_ub=A, b_ub=b, bounds=[x_bound,y_bound, z_bound])
11 sol
12 sol.nit
13 sol.x
14 print("La solucion es", sol.fun)
Listing A.1: Problema 1
La resolución del problema 2 se realizó con la siguiente codificación
1 import numpy as np
2 from scipy.optimize import minimize
3 def objetivo(x):
4 return -(x[0] * x[1] * x[2])
5 def restriccion1(x):
6 return -2*x[0]-2*x[1]-x[2]+53
7 def restriccion2(x):
8 return x[0]
9
10 def restriccion3(x):
11 return x[1]
12
13 def restriccion4(x):
14 return x[2]
15 rest1={’type’: ’ineq’, ’fun’:restriccion1}
16 rest2={’type’: ’ineq’, ’fun’:restriccion2}
17 rest3={’type’: ’ineq’, ’fun’:restriccion3}
18 rest4={’type’: ’ineq’, ’fun’:restriccion4}
19 rest=[rest1,rest2,rest3,rest4]

5
APÉNDICE A. ANEXO 6

20 x0=np.array([1,1,1])
21 sol=minimize(objetivo,x0,constraints=rest,method=’trust-constr’)
22 print(’Largo =’,sol.x[0],’cms.’)
23 print(’Ancho =’,sol.x[1],’cms.’)
24 print(’Altura =’,sol.x[2],’cms.’)
25 print(’Volumen optimo =’,sol.x[0]*sol.x[1]*sol.x[2],’cms^3.’)
Listing A.2: Problema 2
La resolución del problema 3 se realizó con la siguiente codificación
1 #Se importa la l i b r e r a a utilizar
2 import matplotlib.pyplot as plt
3 from matplotlib import cm
4 def P(x, y):
5 if abs(x) + abs(y) <= 1:
6 return 1
7 return 0
8 n = 1000
9 X=np.linspace(-5,5,n)
10 Y=np.linspace(-5,5,n)
11 W = np.zeros([n,n])
12 for i in range(n):
13 for j in range(n):
14 W[i,j]=P(X[i],Y[j])
15
16 X2,Y2=np.meshgrid(X, Y)
17
18 plt.figure()
19 plt.contourf(X2,Y2,np.transpose(W),2,alpha=0.75,cmap=cm.coolwarm)
20
21 plt.plot(X,np.zeros_like(X),’k’)
22 plt.plot(np.zeros_like(Y),Y,’k’)
23 #plt.quiver(x_position, y_position, x_direction, y_direction)
24 plt.xlabel("Eje x")
25 plt.ylabel("Eje y")
26 plt.title("Poliedro de la r e g i n factible")
27 plt.show()
28
29 def P(x, y):
30 if np.sqrt((abs(x))**2 + (abs(y))**2) <= 1:
31 return 1
32 return 0
33 n = 1000
34 X=np.linspace(-5,5,n)
35 Y=np.linspace(-5,5,n)
36 W = np.zeros([n,n])
37 for i in range(n):
38 for j in range(n):
39 W[i,j]=P(X[i],Y[j])
40
41 X2,Y2=np.meshgrid(X, Y)
42
43 plt.figure()
44 plt.contourf(X2,Y2,np.transpose(W),2,alpha=0.75,cmap=cm.coolwarm)
45
46 plt.plot(X,np.zeros_like(X),’k’)
47 plt.plot(np.zeros_like(Y),Y,’k’)
APÉNDICE A. ANEXO 7

48 #plt.quiver(x_position, y_position, x_direction, y_direction)


49 plt.xlabel("Eje x")
50 plt.ylabel("Eje y")
51 plt.title("Poliedro de la r e g i n factible")
52 plt.show()
53
54 def P(x, y):
55 if np.sqrt((abs(x+1))**2 + (abs(y+1))**2) <= 1:
56 return 1
57 return 0
58 n = 1000
59 X=np.linspace(-5,5,n)
60 Y=np.linspace(-5,5,n)
61 W = np.zeros([n,n])
62 for i in range(n):
63 for j in range(n):
64 W[i,j]=P(X[i],Y[j])
65
66 X2,Y2=np.meshgrid(X, Y)
67
68 plt.figure()
69 plt.contourf(X2,Y2,np.transpose(W),2,alpha=0.75,cmap=cm.coolwarm)
70
71 plt.plot(X,np.zeros_like(X),’k’)
72 plt.plot(np.zeros_like(Y),Y,’k’)
73 #plt.quiver(x_position, y_position, x_direction, y_direction)
74 plt.xlabel("Eje x")
75 plt.ylabel("Eje y")
76 plt.title("Poliedro de la r e g i n factible")
77 plt.show()
Listing A.3: Problema 3

2.- Imágenes

Figura A.1: Gráfica del primer problema de la P3


APÉNDICE A. ANEXO 8

Figura A.2: Gráfica del segundo problema de la P3

Figura A.3: Gráfica del tercer problema de la P3

También podría gustarte