Investigación de Operaciones
UNIDAD 1
PROGRAMACIÓN LINEAL
PROGRAMACION LINEAL
CON PYTHON
Samuel Oporto Díaz
Temario
1. Ejercicio 1
2. Ejercicio 2
3. Ejercicio 3
4. Ejercicio 4
5. Ejercicio 5
6. Ejercicio 6
Samuel Alonso, Oporto Díaz 2
OPTIMIZACIÓN CON PYTHON
Optimización con Python
• CVXOPT – Notación Matricial, Optimización convexa.
• PuLP – Orientado a la programación matemática. Resuelve LP o MIP. No resuelve NLP.
• OpenOpt – Acepta más de 30 solvers para solucionar el modelado, incluyendo el NLP.
Samuel Alonso, Oporto Díaz 4
PYTHON
Python
1. Desinstalar versiones anteriores y reiniciar la máquina.
2. Descargarlo desde:
– https://www.python.org/downloads/
3. Instalarlo.
Samuel Alonso, Oporto Díaz 6
Python - Librerías
1. Actualizar el pip
1. python -m pip install --upgrade pip
2. pip list
2. Instalar packages
1. pip install numpy
2. pip install matplotlib
3. pip install scipy
4. pip list
Samuel Alonso, Oporto Díaz 7
Editor – Sublime Text
1. Desinstalar versiones anteriores
2. Descargarlo desde:
– https://www.sublimetext.com
Samuel Alonso, Oporto Díaz 8
Instalar Librerías
py -m pip install --upgrade pip setuptools wheel
python -m pip install --upgrade pip
pip install -U numpy
pip install -U pandas
pip install -U matplotlib
pip install -U timedelta
pip install jupyterlab
pip3 install jupyterlab
pip install -U scikit-learn
pip install openpyxl
winget install OpenJS.NodeJS
python --version
pip list
jupyter-lab.exe
Samuel Alonso, Oporto Díaz 9
SciPy
SciPy
SciPy es una biblioteca Python de código abierto que se utiliza para resolver problemas
científicos y matemáticos.
Está construido sobre la extensión NumPy y permite al usuario manipular y visualizar datos
con una amplia gama de comandos de alto nivel.
Samuel Alonso, Oporto Díaz 11
SciPy
cluster Algoritmos de agrupamiento
constants Constantes físicas y matemáticas.
fftpack Rutinas rápidas de transformada de Fourier
integrate Integración y solucionadores de ecuaciones diferenciales ordinarias.
interpolate Interpolación y suavizado de splines.
io Entrada y salida
linalg Álgebra lineal
ndimage Procesamiento de imágenes N-dimensionales
odr Regresión de distancia ortogonal
optimize Rutinas de optimización y búsqueda de raíces.
signal Procesamiento de la señal
sparse Matrices dispersas y rutinas asociadas.
spatial Algoritmos y estructuras de datos espaciales.
special Funciones especiales
stats Distribuciones y funciones estadísticas.
Samuel Alonso, Oporto Díaz 12
Optimización con SciPy
1. Unconstrained minimization of multivariate scalar functions (minimize)
2. Constrained minimization of multivariate scalar functions (minimize)
3. Global optimization
4. Least-squares minimization (least_squares)
– Example of solving a fitting problem
– Further examples
5. Univariate function minimizers (minimize_scalar)
– Unconstrained minimization (method='brent')
– Bounded minimization (method='bounded')
6. Custom minimizers
7. Root finding
– Scalar functions
– Fixed-point solving
– Sets of equations
– Root finding for large problems
– Still too slow? Preconditioning.
8. Linear programming (linprog)
– Linear programming example
9. Assignment problems
– Linear sum assignment problem example
10. Mixed integer linear programming
– Knapsack problem example
Samuel Alonso, Oporto Díaz 13
LINPROG
La función linprog
La función linprog puede minimizar una función objetivo
lineal sujeta a restricciones de igualdad y desigualdad
lineal.
Dónde:
• x es un vector de variables de decisión;
• c, bub, beq, k y u son vectores
• Aub y Aeq son matrices.
scipy.optimize.linprog(c, A_ub=None, b_ub=None,
A_eq=None, b_eq=None, bounds=None, method='highs',
callback=None, options=None, x0=None,
integrality=None)
Samuel Alonso, Oporto Díaz 15
La función linprog
• Convertir un problema de maximización en otro de minimización
Samuel Alonso, Oporto Díaz 16
Ejercicio 1
Resolver el siguiente problema con SciPy
Verifique los resultados con el solver de Excel.
Samuel Alonso, Oporto Díaz 17
Ejercicio 1
• El problema se debe de transformar a un problema de minimización.
Samuel Alonso, Oporto Díaz 18
Ejercicio 1
# importar la libreria del optimizador
from scipy.optimize import linprog
# configurar la lista de costos
c = [-2,-3]
# configurar matriz de coeficientes de restricción
A_ub = [[1,1],
[2,1]]
# lista de restricciones para límites superiores
b_ub =[10,15]
# además, necesito preparar una tupla de límites para cada variable de optimización y
resumirlos en una lista
x1_bounds = (0,None)
x2_bounds = (0,None)
# ahore, puedo resolver
model_linear = linprog(c=c,
A_ub=A_ub,
b_ub = b_ub,
bounds = [x1_bounds,x2_bounds])
# la solución
print(str(model_linear))
Samuel Alonso, Oporto Díaz 19
Ejercicio 1
con: array([], dtype=float64)
crossover_nit: 0
eqlin: marginals: array([], dtype=float64)
residual: array([], dtype=float64)
fun: -30.0
ineqlin: marginals: array([-3., -0.])
residual: array([0., 5.])
lower: marginals: array([1., 0.])
residual: array([ 0., 10.])
message: 'Optimization terminated successfully. (HiGHS Status 7: Optimal)'
nit: 2
slack: array([0., 5.])
status: 0
success: True
upper: marginals: array([0., 0.])
residual: array([inf, inf])
x: array([ 0., 10.])
Samuel Alonso, Oporto Díaz 20
Ejercicio 2
Resolver el siguiente problema con linprog
Verifique los resultados con el solver de Excel.
Samuel Alonso, Oporto Díaz 21
Ejercicio 2
# importar la libreria del optimizador
from scipy.optimize import linprog
# configurar la lista de costos
c = [-1, 4]
# configurar matriz de coeficientes de restricción
A_ub = [[-3, 1],
[ 1, 2]]
# lista de restricciones para límites superiores
b_ub =[6, 4]
# además, necesito preparar una tupla de límites para cada variable de optimización y resumirlos en una lista
x1_bounds = (None,None)
x2_bounds = (-3 ,None)
# ahore, puedo resolver
model_linear = linprog(c=c, A_ub=A_ub, b_ub = b_ub, bounds = [x1_bounds,x2_bounds])
print('fun..')
print(model_linear.fun)
print('x..')
print(model_linear.x)
print('message..')
print(model_linear.message)
print('ineqlin')
print(model_linear.ineqlin)
# la solución
print('')
print('model_linear..')
print(str(model_linear))
Samuel Alonso, Oporto Díaz 22
Ejercicio 2
fun..
-22.0
x..
[10. -3.]
message..
Optimization terminated successfully. (HiGHS Status 7: Optimal)
ineqlin
marginals: array([-0., -1.])
residual: array([39., 0.])
model_linear..
con: array([], dtype=float64)
crossover_nit: 0
eqlin: marginals: array([], dtype=float64)
residual: array([], dtype=float64)
fun: -22.0
ineqlin: marginals: array([-0., -1.])
residual: array([39., 0.])
lower: marginals: array([0., 6.])
residual: array([inf, 0.])
message: 'Optimization terminated successfully. (HiGHS Status 7: Optimal)'
nit: 0
slack: array([39., 0.])
status: 0
success: True
upper: marginals: array([0., 0.])
residual: array([inf, inf])
x: array([10., -3.])
[Finished in 1.4s]
Samuel Alonso, Oporto Díaz 23
Ejercicio 3
Resolver el siguiente problema con linprog
Verifique los resultados con el solver de Excel.
Samuel Alonso, Oporto Díaz 24
Ejercicio 3
# importar la libreria del optimizador
from scipy.optimize import linprog
# configurar la lista de costos
c = [-20, -12, -40, -25]
# configurar matriz de coeficientes de restricción
A_ub = [[ 1, 1, 1, 1],
[ 3, 2, 1, 0],
[ 0, 1, 2, 3]]
# lista de restricciones para límites superiores
b_ub =[50, 100, 90]
# además, necesito preparar una tupla de límites para cada variable de optimización y resumirlos en una lista
x1_bounds = (0 ,None)
x2_bounds = (0 ,None)
x3_bounds = (0 ,None)
x4_bounds = (0 ,None)
# ahore, puedo resolver
model_linear = linprog(c=c,
A_ub=A_ub,
b_ub = b_ub,
bounds = [x1_bounds, x2_bounds,x3_bounds,x4_bounds])
print('fun..')
print(model_linear.fun)
print('x..')
print(model_linear.x)
print('message..')
print(model_linear.message)
print('ineqlin')
print(model_linear.ineqlin)
# la solución
print('')
print('model_linear..')
print(str(model_linear))
Samuel Alonso, Oporto Díaz 25
Ejercicio 3
fun..
-1900.0
x..
[ 5. 0. 45. 0.]
message..
Optimization terminated successfully. (HiGHS Status 7: Optimal)
ineqlin
marginals: array([-20., -0., -10.])
residual: array([ 0., 40., 0.])
model_linear..
con: array([], dtype=float64)
crossover_nit: 0
eqlin: marginals: array([], dtype=float64)
residual: array([], dtype=float64)
fun: -1900.0
ineqlin: marginals: array([-20., -0., -10.])
residual: array([ 0., 40., 0.])
lower: marginals: array([ 0., 18., 0., 25.])
residual: array([ 5., 0., 45., 0.])
message: 'Optimization terminated successfully. (HiGHS Status 7: Optimal)'
nit: 4
slack: array([ 0., 40., 0.])
status: 0
success: True
upper: marginals: array([0., 0., 0., 0.])
residual: array([inf, inf, inf, inf])
x: array([ 5., 0., 45., 0.])
[Finished in 2.0s]
Samuel Alonso, Oporto Díaz 26
Ejercicio 4
• Una empresa elabora tres tipos de bebidas utilizando zumo de piña y zumo de melocotón.
El dueño de la empresa ha comprado 1.500 litros de zumo de piña y 2.000 de zumo de
melocotón. Los litros de zumo requeridos en la fabricación de cada bebida vienen dados en
la tabla siguiente.
• El precio de venta de cada bebida es 15 euros el litro. El coste del zumo de piña es de 1
euro el litro y 2 euros el litro de zumo de melocotón. Se conoce que la demanda de bebidas
asciende a 400 litros.
Samuel Alonso, Oporto Díaz 27
Tarea 3
• Desarrollar al menos cuatro de los ejercicios del conjunto de
problemas 2.4A (página 37 a página 40), del libro de texto
• Desarrolle solo ejercicios con 3 o más variables.
• Desarrolle los ejercicios haciendo uso de algunas de las
siguientes librerías del Python:
– SciPy Optimization
– PuLP
– Pyomo
– CVXOPT
• Explique con claridad los resultados obtenidos, no solo se
trata de presentar los resultados.
• Tarea individual.
Samuel Alonso, Oporto Díaz 28
PREGUNTAS
[email protected]