Uploaded by dylazz.2019

RESOLVER ACTIVIDADES Y EJERCICIOS DE PENALIZACION M DEL LAB 02

advertisement
RESOLVER ACTIVIDADES Y EJERCICIOS DE
PENALIZACION M DEL LAB 02
Gonzalez Polar Ampuero Alessio
Alessio.gonzalezpolar@ucsm.edu.pe
Universidad Católica de Santa María
Arequipa, Perú
Resumen- En este informe se realizarán los ejercicios propuestos en la primera guía, donde se
resolverán solamente los ejercicios que contengan dos variables, el cual será realizado usando
el metodo grafico explicado en clase.
I.INTRODUCCION
El algoritmo Simplex es un método numérico desarrollado para encontrar la solución óptima en
problemas de programación lineal, donde se busca maximizar o minimizar una función lineal
sujeta a restricciones lineales. El Simplex se basa en moverse a lo largo de las aristas de un polítopo
(un conjunto convexo de soluciones factibles) para encontrar la solución óptima. Sin embargo, el
Simplex clásico tiene limitaciones cuando no existe una solución factible inicial, o cuando las
restricciones de igualdad no cumplen la condición de ser linealmente independientes.
Aquí es donde entra en juego la penalización M. La penalización M es una técnica que se utiliza
para convertir un problema de programación lineal no factible en un problema factible. La idea
principal es agregar una cantidad ficticia (penalización) a la función objetivo que penaliza las
desviaciones con respecto a las restricciones. Esto "penaliza" las soluciones no factibles y permite
al algoritmo encontrar una solución factible antes de buscar la óptima.
El método Simplex con penalización M combina estos dos conceptos al incorporar la penalización
M en el algoritmo Simplex para resolver problemas no factibles inicialmente. A medida que el
algoritmo avanza, ajusta la penalización M de manera dinámica para acercarse gradualmente a una
solución factible. Una vez que se encuentra una solución factible, se elimina la penalización M y
se procede a buscar la solución óptima como en el Simplex clásico.
El informe consta de dos partes, la primera sección la cual reflejará todos los ejercicios resueltos
que contengan penalización M [1] y por último tendrá la sección de conclusiones y referencias.
II.
EJERCICIOS RESUELTOS
1. Implementar en Python, Java o C++ una función que capture la función objetivo
maximizada, las restricciones del tipo AX <= B y cree una matriz equivalente para la tabla
del método Simplex.
import numpy as np
def crear_matriz_simplex(funcion_objetivo, restricciones):
# Obtener el número de variables y restricciones
num_variables = len(funcion_objetivo)
num_restricciones = len(restricciones)
# Matriz de la tabla Simplex
matriz_simplex = np.zeros((num_restricciones + 1, num_variables +
num_restricciones + 1))
# Configurar la fila de la función objetivo
matriz_simplex[0, :num_variables] = -funcion_objetivo
matriz_simplex[0, -1] = 1 # Columna para el valor de la función
objetivo
# Configurar las filas de las restricciones
for i in range(num_restricciones):
matriz_simplex[i + 1, :num_variables] =
restricciones[i][:num_variables]
matriz_simplex[i + 1, num_variables + i] = 1 # Variable de
holgura
matriz_simplex[i + 1, -1] = restricciones[i][-1] # Lado
derecho de la restricción
return matriz_simplex
# Ejemplo
funcion_objetivo = [3, 2] # Maximizar 3x1 + 2x2
restricciones = [
[2, 1, 10], # 2x1 + x2 <= 10
[1, 1, 6],
# x1 + x2 <= 6
]
matriz_simplex = crear_matriz_simplex(funcion_objetivo, restricciones)
print(matriz_simplex)
2. Implementar en Python, Java o C++ una función que calcule cual es la fila y columna
pivote.
import numpy as np
def encontrar_pivote(matriz_simplex):
# Obtener dimensiones de la matriz
num_filas, num_columnas = matriz_simplex.shape
# Encontrar la columna pivote (variable de entrada)
columna_pivote = np.argmin(matriz_simplex[0, :-1])
# Inicializar una lista para almacenar los cocientes
cocientes = []
# Calcular los cocientes para cada fila
for i in range(1, num_filas):
if matriz_simplex[i, columna_pivote] > 0:
cociente = matriz_simplex[i, -1] / matriz_simplex[i,
columna_pivote]
cocientes.append(cociente)
else:
cocientes.append(np.inf) # Evitar divisiones por cero
# Encontrar la fila pivote (variable de salida) usando el cociente
mínimo
fila_pivote = np.argmin(cocientes) + 1 # Sumamos 1 para ajustar
el índice de la fila
return fila_pivote, columna_pivote
# Ejemplo de uso con una matriz de prueba
matriz_simplex_prueba = np.array([
[1, -1, 1, 0, 0, 3],
[3, 2, 0, 1, 0, 12],
[2, 1, 0, 0, 1, 10],
[-4, -3, 0, 0, 0, 0]
])
fila_pivote, columna_pivote = encontrar_pivote(matriz_simplex_prueba)
print("Fila pivote:", fila_pivote)
print("Columna pivote:", columna_pivote)
3. Implementar en Python, Java o C++ una función que tome como entrada una fila pivote y
transforme su pivote al valor 1.
import numpy as np
def pivotar_fila(matriz, fila_pivote):
num_filas, num_columnas = matriz.shape
pivote = matriz[fila_pivote, fila_pivote]
la fila pivote
# Valor del pivote en
# Convertir el pivote a número de punto flotante
pivote = float(pivote)
# Dividir toda la fila pivote por el valor del pivote para hacerlo
igual a 1
matriz[fila_pivote, :] /= pivote
# Actualizar las otras filas
for i in range(num_filas):
if i != fila_pivote:
factor = matriz[i, fila_pivote] # Factor para hacer 0 en
la columna del pivote
matriz[i, :] -= factor * matriz[fila_pivote, :]
# Ejemplo de uso con una matriz de prueba
matriz_prueba = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
], dtype=float) # Convertir la matriz a números de punto flotante
fila_pivote = 1
pivote
# Por ejemplo, seleccionamos la fila 1 como fila
print("Matriz original:")
print(matriz_prueba)
pivotar_fila(matriz_prueba, fila_pivote)
print("\nMatriz después de pivotar la fila:")
print(matriz_prueba)
4. Implementar en Python, Java o C++ una función que tome como entrada una fila no pivote
y transforme su valor en columna pivote a 0.
import numpy as np
def hacer_cero_columna_pivote(matriz, fila_no_pivote, columna_pivote):
# Obtener dimensiones de la matriz
num_filas, num_columnas = matriz.shape
# Calcular el factor necesario para hacer 0 en la columna pivote
factor = matriz[fila_no_pivote, columna_pivote]
# Actualizar la fila no pivote
matriz[fila_no_pivote, :] -= factor * matriz[columna_pivote, :]
# Matriz de prueba
matriz_prueba = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
], dtype=float) # Convertir la matriz a números de punto flotante
fila_no_pivote = 2
no pivote
columna_pivote = 1
# Por ejemplo, seleccionamos la fila 2 como fila
#lo mismo pero 1 como fila no pivote
print("Matriz original:")
print(matriz_prueba)
hacer_cero_columna_pivote(matriz_prueba, fila_no_pivote,
columna_pivote)
print("\nMatriz después de hacer cero la columna pivote:")
print(matriz_prueba)
5. Resolver los problemas que contengan penalización M
EJERCICIO 4.11
𝑚𝑖𝑛𝑖𝑚𝑖𝑐𝑒𝑠𝑒: 𝑍 = 𝑋 + 2𝑌
con las condiciones:
𝑋 + 3𝑌 ≥ 11
2𝑋 + 𝑌 ≥ 9
con: X, Xy no negativas
Aplicábamos el uso de variables artificiales
𝑋 + 3𝑌 + 𝑠1 ≥ 11
2𝑋 + 𝑌 + 𝑠2 ≥ 9
Despejamos las variables artificiales
𝑠1 = 11 − 𝑋 − 3𝑌 + 𝑑1
𝑠2 = 9 − 2𝑋 − 𝑌 + 𝑑2
Juntamos los datos despejados en la función objetivo quedando de la siguiente manera:
𝑍 − 𝑋 − 2𝑌 − 𝑀(11 − 𝑋 − 3𝑌 + 𝑑1) − 𝑀(9 − 2𝑋 − 𝑌 + 𝑑2) = 0
Factorizamos la función objetivo quedando de la siguiente manera
𝑍 − 𝑋 − 2𝑌 − 𝑀(11 − 𝑋 − 3𝑌 + 𝑑1) − 𝑀(9 − 2𝑋 − 𝑌 + 𝑑2) = 0
Creamos la tabla simplex inicial con la penalización M
Z
1
0
0
X
-10M
1
2
Y
-8M
3
1
D1
-M
0
-1
D2
-M
-1
0
R1
0
1
0
R2
0
0
1
BETA
0
11
9
Ubicamos la columna y fila pivote
Z
1
0
0
X
-10M
1
2
Y
-8M
3
1
D1
-M
0
-1
D2
-M
-1
0
R1
0
1
0
R2
0
0
1
BETA
0
11
9
/1 = 11
/2 = 6
R2
0
0
1
R2
0
0
1/2
BETA
0
11
9
BETA
0
11
9/2
R2
0
0
1/2
R2
5M
-1/2
1/2
BETA
0
11
9/2
BETA
45
13/2
9/2
Como el elemento pivote es 2 es necesario convertirlo
Z
1
0
0
Z
1
0
0
1/2(F3)
X
-10M
1
2
X
-10M
1
1
Y
-8M
3
1
Y
-8M
3
1/2
D1
-M
0
-1
D1
-M
0
-1/2
D2
-M
-1
0
D2
-M
-1
0
R1
0
1
0
R1
0
1
0
Ahora se convierte en 0 los valores que están en la columna pivote
Z
10M(F3)+(F1) 1
F3(-1) +(F2)
0
0
Z
1
0
0
X
-10M
1
1
X
0
0
1
Y
-8M
3
1/2
Y
-3M
5/2
1/2
D1
-M
0
-1/2
D1
-6M
1/2
-1/2
D2
-M
-1
0
D2
-M
-1
0
R1
0
1
0
R1
0
1
0
Como todavía existen valores positivos en la función objetivo se vuelve a buscar cual es
la columna y fila pivote
Z
1
0
0
X
0
0
1
Y
-3M
5/2
1/2
D1
-6M
1/2
-1/2
D2
-M
-1
0
R1
0
1
0
R2
5M
-1/2
1/2
BETA
45
13/2
9/2
/1/2 = 13
/-1/2 = -9
Convertimos en 1 el elemento pivote
F2(2/1)
Z
1
0
0
Z
1
0
0
X
0
0
1
X
0
0
1
Y
-3M
5/2
1/2
Y
-3M
5
1/2
D1
-6M
1/2
-1/2
D1
-6M
1
-1/2
D2
-M
-1
0
D2
-M
-2
0
R1
0
1
0
R1
0
2
0
R2
5M
-1/2
1/2
R2
5M
-1
1/2
BETA
45
13/2
9/2
BETA
45
13
9/2
R2
5M
-1
1/2
R2
0
-1
0
BETA
45
13
9/2
BETA
-195/2
13
11
Convertimos los valores de la columna pivote en 0, saliendo lo siguiente
Z
F2(-1/6)*(F1) 1
0
F2(1/2) +(F3) 0
Z
1
0
0
X
0
0
1
X
0
0
1
Y
-3M
5
1/2
Y
-5M/2
5
1
D1
-6M
1
-1/2
D1
M
1
0
D2
-M
-2
0
D2
-M/3
-2
-2
R1
0
2
0
R1
0
2
2
EJERCICIO 4.14
𝑚𝑖𝑛𝑖𝑚𝑖𝑐𝑒𝑠𝑒: 𝑍 = 14𝑥 + 13𝑦 + 11𝑤 + 13𝑣 + 13𝑠 + 12𝑝
con las condiciones:
𝑥 + 𝑦 + 𝑤 = 1200
𝑣 + 𝑠 + 𝑝 = 1000
𝑥 + 𝑣 = 1000
𝑦 + 𝑠 = 700
𝑤 + 𝑝 = 500
con: todas las variables no negativas
Despejamos las variables artificiales
𝑠1 = 𝑥 + 𝑦 + 𝑤 + 1200
𝑠2 = 𝑣 + 𝑠 + 𝑝 + 1000
𝑠3 = 𝑥 + 𝑣 + 1000
𝑠4 = 𝑦 + 𝑠 + 700
𝑠5 = 𝑤 + 𝑝 + 500
Juntamos los datos despejados en la función objetivo quedando de la siguiente manera:
𝑍 − 14𝑋 − 13𝑌 − 11𝑊 − 13𝑉 − 13𝑆 − 12𝑃 − 𝑀(1200 + 𝑋 + 𝑌 + 𝑊)
− 𝑀(1000 + 𝑉 + 𝑆 + 𝑃) − 𝑀(1000 + 𝑋 + 𝑉) − 𝑀(700 + 𝑌 + 𝑆) − 𝑀(500
+ 𝑊 + 𝑃)
Factorizamos la función objetivo quedando de la siguiente manera
Z -X(1200M)-Y(1000M)-W(1000M)-V(700)-S(500M)-P(14M) = 0
Creamos la tabla simplex inicial con la penalización M
Z
1
0
0
0
0
0
X
1200M
1
0
1
0
0
Y
1000M
1
0
0
1
0
W
1000M
1
0
0
0
1
V
700M
0
1
1
0
0
S
500M
0
1
0
1
0
P
14M
0
1
0
0
1
s1
0
1
0
0
0
0
s2
0
0
1
0
0
0
s3
0
0
0
1
0
0
s4
0
0
0
0
1
0
s5
0
0
0
0
0
1
BETA
0
1200
1000
1000
700
500
Ubicamos la columna y fila pivote
Z
1
0
0
0
0
0
X
-1200M
1
0
1
0
0
Y
-1000M
1
0
0
1
0
W
-1000M
1
0
0
0
1
V
-700M
0
1
1
0
0
S
-500M
0
1
0
1
0
P
-14M
0
1
0
0
1
s1
0
1
0
0
0
0
s2
0
0
1
0
0
0
s3
0
0
0
1
0
0
s4
0
0
0
0
1
0
s5
0
0
0
0
0
1
BETA
0
1200
1000
1000
700
500
/0 = 0
/1 = 1000
/0 = 0
/0 = 0
/1= 500
s5
0
0
0
0
0
1
s5
0
0
0
0
0
1
BETA
0
1200
1000
1000
700
500
BETA
0
1200
0
1000
700
500
Como el elemento pivote es 1, no es necesario convertirlo
Z
F6(-1/14)*(F1) 1
0
(0)F6(F3)
0
0
0
0
Z
1
0
0
0
0
0
X
1200M
1
0
1
0
0
X
-600/7M
1
0
1
0
0
Y
1000M
1
0
0
1
0
Y
-500/7M
1
0
0
1
0
W
1000M
1
0
0
0
1
W
-500/7M
1
0
0
0
1
V
700M
0
1
1
0
0
V
-50M
0
0
1
0
0
S
500M
0
1
0
1
0
S
-250/7M
0
0
0
1
0
P
14M
0
1
0
0
1
P
M
0
0
0
0
1
s1
0
1
0
0
0
0
s1
0
1
0
0
0
0
s2
0
0
1
0
0
0
s2
0
0
0
0
0
0
s3
0
0
0
1
0
0
s3
0
0
0
1
0
0
s4
0
0
0
0
1
0
s4
0
0
0
0
1
0
CUESTIONARIO
1. ¿Qué es el Método Simplex?
El Método Simplex es un algoritmo utilizado para resolver problemas de programación
lineal, una técnica matemática que se emplea para encontrar la mejor solución posible en
situaciones en las que se busca maximizar o minimizar una función lineal sujeta a un
conjunto de restricciones lineales.
2. Describe los pasos del Método Simplex
• Formulación del problema de programación lineal:
• Crear la tabla Simplex inicial
• Evaluar la solución actual (pivote)
• Selección de la variable de salida
• Actualizar la tabla Simplex
• Repetir el proceso
• Solución óptima
3. ¿Qué opinas sobre el Método Simplex?
El Método Simplex es ampliamente reconocido como uno de los algoritmos más
efectivos y poderosos para resolver problemas de programación lineal.
III.
CONCLUSIONES
1. La principal ventaja de la penalización M es su capacidad para abordar problemas de
programación lineal que no tienen una solución factible inicial. Al agregar penalizaciones
a las restricciones y a la función objetivo, el algoritmo puede comenzar su búsqueda incluso
en situaciones donde no hay soluciones factibles.
2. El método Simplex con penalización M está diseñado para buscar soluciones factibles a
medida que avanza. La penalización incentiva al algoritmo a ajustar gradualmente las
variables de decisión y las restricciones para acercarse a una solución factible. Esto es
particularmente útil en problemas con restricciones no linealmente independientes.
IV.
REFERENCIAS
[1] TÉCNICAS DE LAS VARIABLES ARTIFICIALES. (s.f.). Instituto Tecnológico de La
Laguna. http://www.itlalaguna.edu.mx/2014/Oferta%20Educativa/Ingenierias/Industrial/Plan
%201997-2004/Invoperaciones1/u2c.html
Related documents
Download