Subido por erick.padilla2508

KKT

Anuncio
Universidad tamaulipeca Campus Reynosa
Informe de práctica
Tema:
Karush – Kuhn – Tucker (KKT)
Curso:
Posgrado en Sistemas de producción y calidad.
Materia:
Métodos cuantitativos
Introducción:
Las condiciones de Karush-Kuhn-Tucker (también conocidas como las condiciones KKT o Kuhn-Tucker) son
requerimientos necesarios y suficientes para que la solución de un problema de programación matemática sea óptima.
Objetivo:
El objetivo de la siguiente práctica es analizar, entender y facilitar la optimización de los procesos dentro de la
manufactura para dicho objetivo se plantea un ejercicio para aprender y aumentar la experiencia en optimización de
procesos.
 Para el siguiente ejercicio se utilizó el programa Spyder (Python 3.7) en el cual se programó el siguiente
código:
#%% OPTIMIZACION KKT
import numpy as np
import sympy as sp
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.axes3d import Axes3D
from matplotlib import cm
### DETERMINAR ENTRADA DE INFORMACION ###
x1 = sp.Symbol('x1')
x2 = sp.Symbol('x2')
z1 = sp.Symbol('z1')
z2 = sp.Symbol('z2')
z3 = sp.Symbol('z3')
x10 = float(input('Digite la interaccion de x1:'))
x20 = float(input('Digite la interaccion de x1:'))
z10 = float(input('Digite la interaccion de z1:'))
z20 = float(input('Digite la interaccion de z2:'))
z30 = float(input('Digite la interaccion de z3:'))
def f(x1,x2):
return((x1**2)+(x2**2)-(17*x1)-(35*x2))
def g1(x1,x2):
return(x1+x2-17.25)
def g2(x1,x2):
return(-x1)
def g3(x1,x2):
return(-x2)
F = f(x1,x2)+(z1*g1(x1,x2))+(z2*g2(x1,x2))+(z3*g3(x1,x2))
### CONDICIONES ESTACIONARIAS
F1 = sp.diff(F,x1)
F2 = sp.diff(F,x2)
### CONDICIONES DE HOLGURA
F3 = z1*(g1(x1,x2))
F4 = z2*(g2(x1,x2))
F5 = z3*(g3(x1,x2))
### DETERMINAR DERIVADAS
F1x1 = sp.diff(F1,x1)
F1x2 = sp.diff(F1,x2)
F1z1 = sp.diff(F1,z1)
F1z2 = sp.diff(F1,z2)
F1z3 = sp.diff(F1,z3)
F2x1 = sp.diff(F2,x1)
F2x2 = sp.diff(F2,x2)
F2z1 = sp.diff(F2,z1)
F2z2 = sp.diff(F2,z2)
F2z3 = sp.diff(F2,z3)
F3x1 = sp.diff(F3,x1)
F3x2 = sp.diff(F3,x2)
F3z1 = sp.diff(F3,z1)
F3z2 = sp.diff(F3,z2)
F3z3 = sp.diff(F3,z3)
F4x1 = sp.diff(F4,x1)
F4x2 = sp.diff(F4,x2)
F4z1 = sp.diff(F4,z1)
F4z2 = sp.diff(F4,z2)
F4z3 = sp.diff(F4,z3)
F5x1 = sp.diff(F5,x1)
F5x2 = sp.diff(F5,x2)
F5z1 = sp.diff(F5,z1)
F5z2 = sp.diff(F5,z2)
F5z3 = sp.diff(F5,z3)
i=0
while i<100:
i = i+1
xi = np.matrix([[x10],[x20],[z10],[z20],[z30]])
V = np.matrix([[float(F1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))],
[float(F2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))],
[float(F3.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))],
[float(F4.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))],
[float(F5.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))]])
J = np.matrix([[float(F1x1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F1x2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F1z1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F1z2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F1z3.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))],
[float(F2x1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F2x2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F2z1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F2z2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F2z3.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))],
[float(F3x1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F3x2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F3z1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F3z2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F3z3.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))],
[float(F4x1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F4x2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F4z1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F4z2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F4z3.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))],
[float(F5x1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F5x2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F5z1.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F5z2.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30})),
float(F5z3.subs({x1:x10,x2:x20,z1:z10,z2:z20,z3:z30}))]])
J_inv = np.linalg.inv(J)
xn = xi-(J_inv*V)
x10 = xn[0,0]
x20 = xn[1,0]
z10 = xn[2,0]
z20 = xn[3,0]
z30 = xn[4,0]
else:
if (g1(x10,x20)<=0)&(g2(x10,x20)<=0)&(g3(x10,x20)<=0):
c1 = ' Factible '
else :
c1 = ' No Factible '
if (z10<=0)&(z20<=0)&(z30<=0):
c2 = ' Maximo '
elif (z10>=0)&(z20>=0)&(z30>=0):
c2 = ' Minimo '
else:
c2 = '
'
print('----------------------------------------------------------------------')
print('| P(x1,x2) | z(zi,z2,z3) | Factibilidad | CKKT |')
print('----------------------------------------------------------------------')
print('|PC1('+str(round(x10,2))+','+str(round(x20,2))+')|
'+'Z('+str(round(z10,2))+','+str(round(z20,2))+','+str(round(z30,2))+') |'+c1+'|'+c2+'|')
print('----------------------------------------------------------------------')
xs = np.linspace(-100,100)
ys = np.linspace(-100,100)
X, Y = np.meshgrid(xs,ys)
Fs = f(X,Y)
fig = plt.figure()
axes1 = fig.add_subplot(1,1,1,projection='3d')
axes1.plot_surface(X,Y,Fs,cmap=cm.hot)
axes1.set_xlabel('$x$')
axes1.set_ylabel('$y$')
axes1.set_zlabel('$F(x,y)$')
plt.show()
print('----------------------------------------------------------------------')
El cual lo que hace es que resolver la Función, indicarnos si es factible o no y al ingresar 5 valores los cuales significan en
el código x1:5, x2:10, z1:15, z2:-10,z3:-5 nos arroja una tabla y una gráfica como la siguientes:
---------------------------------------------------------------------| P(x1,x2) | z(zi,z2,z3) | Factibilidad | CKKT |
---------------------------------------------------------------------|PC1(0.0,17.25)| Z(0.5,-16.5,0.0) | Factible |
|
----------------------------------------------------------------------
----------------------------------------------------------------------
Descargar