Você está na página 1de 11

Indice general

0.1.
0.2.
0.3.
0.4.
0.5.
0.6.
0.7.
0.8.
0.9.

Introduccion . . . . . . . . . . . . . . .
Definiciones . . . . . . . . . . . . . . .
Teoremas Importantes . . . . . . . . .
Una introduccion al metodo simplex .
Descripcion del Problema . . . . . . .
Modelamiento del problema . . . . . .
Solucion del Problema . . . . . . . . .
Codigo Python del programa a utilizar
Solucion del problema con el programa

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.

. 1
. 1
. 2
. 2
. 3
. 4
. 5
. 6
. 10

INDICE GENERAL

0.1.

Introducci
on

El m
etodo simplex es un metodo analtico de solucion de problemas de programacion lineal capaz de
resolver modelos mas complejos que los resultados mediante metodo grafico sin restriccion en el n
umero
de variables.
El m
etodo simplex es un metodo iterativo que permite ir mejorando la solucion en cada paso. La
razon matematica de esta mejora radica en que el metodo consiste en caminar del vertice de un poliedro
a un vertice vecino de manera que aumente o disminuya (seg
un la funcion objetivo) dado que el n
umero
de vertices que presenta un poliedro solucion es finito siempre se hallara solucion.

0.2.

Definiciones

Iteraci
on: Acto de repetir un proceso con el fin de alcanzar una meta objetivo o resultado.
Antes de empezar a discutir el metodo simplex en cualquiera de sus formas recordemos que cualquier
problema puede ser llevado a su forma estandar compacta.
(PL) min ct x
Ax = b
x 0
Donde son dados cRn , bRm , ARmn con mn. En la funci
on objetivo ct x, la variable x se le
conoce como variable de decisi
on y c como vector de costos. As el conjunto de restricciones
P = {x/Ax = b, x0} es un poliedro cerrado y se llama conjunto factible. La matriz A se conoce
como la matriz de coeficientes t
ecnicos y b como el vector de recursos. Donde se maximiza o se
minimiza el objetivo, las restricciones son igualdades y las variables son no negativas. Caso contrario
procedemos de la siguiente manera:
Si una restriccion es de la forma ai1 x1 + ai2 x2 + + ain xn bi convertirlo en una restriccion de
igualdad mediante la adicion de una variable de holgura no negativa si la restriccion resultante
es ai1 x1 + ai2 x2 + + ain xn + si =bi donde si 0.
Si la restriccion es de la forma ai1 x1 + ai2 x2 + + ain xn bi convertirlo en una restriccion de
igualdad restando una variable excedente no negativa si la restriccion resultante es
ai1 x1 + ai2 x2 + + ain xn si =bi donde si 0.
Si alguna de las variables xj es irrestricta en signo, reemplazarlo por la xj xj donde xj 0 y
xj 0.

0.3.

Teoremas Importantes

1. Sea P = {x/Ax = b; x0} y sea xP , entonces x es punto extremo de P x es solucion factible


basica asociada a alguna base B de A.
t

2. Si el vector de costos relativos o reducidos es no negativo (C 0) entonces la solucion basica


factible asociada a dicha base es optima.

AL METODO

0.4. UNA INTRODUCCION


SIMPLEX

0.4.

Una introducci
on al m
etodo simplex

Una propiedad general del metodo simplex es que resuelve la programacion lineal en iteraciones as cada
iteracion desplaza la solucion a un nuevo punto esquina que tiene potencial de mejorar la funcion objetivo
el proceso termina cuando ya no se puedan realizar mejoras.
El metodo simplex implica calculos tediosos y voluminosos lo que hace que la computadora sea una
herramienta esencial para resolver los problemas de programacion lineal por consiguiente las reglas
computacionales del metodo simplex se adaptan para facilitar el calculo automatico. Si tenemos el
siguiente problema expresado en forma compacta:
(PL) min ct x
Ax = b
x 0
Ahora supongamos que A es de rango m, entonces admite una representaci
( A=
) [B|N ]
( on)en la forma
CB
XB
ahora
con BRnn invertible consecuencia de esto tenemos lo siguiente: X =
yC=
X
C
N
N
[
]
XB
desarrollando Ax = [B|N ]
=BXB + N XN = b=XB = B 1 b B 1 N XN De esto a las variables
XN
del vector XB se les denomina variables basicas y a las del vector XN se les denomina no basicas.
A la matriz B invertible se le denomina base y si por u
ltimo se cumple B 1 b0, se dice base factible.
Luego podemos reformular nuestro problema a resolver como sigue:
(PL) min CB t XB + CN t XN
BXB + N XN = b
XB

0
XN

0
Ahora si reemplazamos XB en la funcion objetivo tenemos:
(PL) min CB t (B 1 b B 1 N XN + CN t XN )
XB + B 1 N XN = B 1 b
XB

0
XN

0
Por u
ltimo:
(PL) min CB t B 1 b + (CN t CB t B 1 N )XN
XB + B 1 N XN = B 1 b
XB

0
XN

INDICE GENERAL

4
La funcion objetivo general
Z(X) = CB t XB + CN t XN
Coincide con:

b N ) = CB t B 1 b + (CN t CB t B 1 N )XN
Z(X

b N ) y se obtiene que el punto


para xP . As
minimizar Z(X) es equivalente a minimizar Z(X
( para
)
1
B b
extremo X =
es optimo cuando CN t CB t B 1 N 0 puesto que
0
Z(X) = CB t XB + CN t XN = CB t B 1 bCB t B 1 b + (CN t CB t B 1 N )XN
para todo XN 0.
Usaremos las siguientes notaciones:
1. t = B 1 b sera denominado vector de multiplicadores.
t

2. CN = CN t CB t B 1 N sera el costo a reducir.

0.5.

Descripci
on del Problema

La fabrica de juguetes TOYS KIDS produce 6 juguetes a partir de 6 materias primas, cada uno caracterizado por una diferente combinacion de estas materias primas, la tabla adjunta muestra le beneficio por
unidad de producto que se produzca .Como debe realizarse la produccion para maximizar el beneficio
total usando solo el actual inventario de materia prima? .
Producto
Acero
Madera
Plastico
Goma
Vidrio
Pintura
Beneficio

0.6.

Skaters Esquiador
1
4
4
5

3
2

2
4
1
4
30
45

Super-Heroe

3
8
1
2
1
24

Futbolista
4

2
2
4
26

Bombera
2
1
1
1
2
3
24

Playa Inventario

800

1160

1780
5
1050
4
1360
4
1240
30

Modelamiento del problema

En este modelo estan planteadas todas las configuraciones posibles que equivalen a cada juguete, por
tanto consideraremos las siguientes variables..
Primero identifiquemos las variables a usar:
x1 := Cantidad unidades de skaters.
x2 := Cantidad unidades de esquiadores.
x3 := Cantidad unidades de s
uper-heroes.

0.6. MODELAMIENTO DEL PROBLEMA


x4 := Cantidad unidades de futbolistas.
x5 := Cantidad unidades de bomberos.
x6 := Cantidad unidades de playas.
Entonces el problema a maximizar quedara planteado de la siguiente manera:
max{30x1 + 45x2 + 24x3 + 26x4 + 24x5 + 30x6 } ,
Modelando las restricciones, se tendra:
Para la primera restricci
on:
x1 + 4x2 + x4 + 2x5 800
Para la segunda restricci
on:
4x1 + 5x2 + 3x3 + x5 1160
Para la tercera restricci
on:
3x2 + 8x3 + x5 1780
Para la cuarta restricci
on:
2x1 + x3 + 2x4 + x5 + 5x6 1050
Para la quinta restricci
on:
2x1 + 4x2 + 2x3 + 2x4 + 2x5 + 4x6 1360
Para la sexta restricci
on:
x1 + 4x2 + x3 + 4x4 + 3x5 + 5x6 1240
Con todo esto, el problema de programacion lineal sera:
max{30x1 + 45x2 + 24x3 + 26x4 + 24x5 + 30x6 }
x1 + 4x2 + x4 + 2x5 800
4x1 + 5x2 + 3x3 + x5 1160
3x2 + 8x3 + x5 1780
2x1 + x3 + 2x4 + x5 + 5x6 1050
2x1 + 4x2 + 2x3 + 2x4 + 2x5 + 4x6 1360
x1 + 4x2 + x3 + 4x4 + 3x5 + 5x6 1240

INDICE GENERAL

0.7.

Soluci
on del Problema

Pasamos el problema a su forma estandar, a


nadiendo las respectivas variables de holgura.
La restriccion 1 tiene la forma as que se agrega la variable de holgura X7 .
La restriccion 2 tiene la forma as que se agrega la variable de holgura X8 .
La restriccion 3 tiene la forma as que se agrega la variable de holgura X9 .
La restriccion 4 tiene la forma as que se agrega la variable de holgura X10 .
La restriccion 4 tiene la forma as que se agrega la variable de holgura X11 .
La restriccion 4 tiene la forma as que se agrega la variable de holgura X12 .
Teniendo lo siguiente:
max{30x1 + 45x2 + 24x3 + 26x4 + 24x5 + 30x6 }

x1 + 4x2 + 0x3 + x4 + 2x5 + 0x6 + 1x7 + 0x8 + 0x9 + 0x10 + 0x11 + 0x12 = 800
4x1 + 5x2 + 3x3 + 0x4 + x5 + 0x6 + 0x7 + 1x8 + 0x9 + 0x10 + 0x11 + 0x12 = 1160
3x2 + 0x2 + 8x3 + 0x4 + x5 + 0x6 + 0x7 + 0x8 + 1x9 + 0x10 + 0x11 + 0x12 = 1780
2x1 + 0x2 + x3 + 2x4 + x5 + 5x6 + 0x7 + 0x8 + 0x9 + x10 + 0x11 + 0x12 = 1050
2x1 + 4x2 + 2x3 + 2x4 + 2x5 + 4x6 + 0x7 + 0x8 + 0x9 + 0x10 + x11 + 0x12 = 1360
x1 + 4x2 + x3 + 4x4 + 3x5 + 4x6 + 0x7 + 0x8 + 0x9 + 0x10 + 0x11 + x12 = 1240
x1 , x2 , x3 , x4 , x5 , x6 0

0.8.

C
odigo Python del programa a utilizar

Trabajaremos con el metodo de la inversa explcita


from numpy import *
from sys import exit
def ingresa_matriz(n,m):
### Ingreso de datos de la matriz A
print "Ingrese los elementos de la matriz A fila por fila con un espacio luego enter"
A = [[0.0]*m for i in range(n)]
aux = [[0.0]*m for i in range(n)]
for i in range(n):
temp = raw_input()
A[i] = temp.split()
for j in range(m):
A[i][j] = float((A[i][j]))


0.8. CODIGO
PYTHON DEL PROGRAMA A UTILIZAR
if A == aux:
exit(Matriz nula, vuelva a escribir la matriz)
return A
def ingresa_vec_objetivo(M):
### Ingreso de datos del vector objetivo (C)
n=len(M[0])
print Ingrese los,n,elementos del vector objetivo de forma horizontal
temp=raw_input()
corta=temp.split()
c=[]
for i in range(n):
c.append(float((corta[i])))
return c

def ingresa_vector(M):
### Ingreso de datos del vector independiente (b)
n = len(M)
print Ingrese los ,n, elementos del vector b de forma vertical
b=[]
for i in range(n):
b.append([0])
for i in range(n):
b[i][0]=float((raw_input()))
return b
###
###
###
###

Para calcular la inversa de una matriz A


from numpy import *
Inversa=linalg.inv(A)
y la puedes usar con tus funciones

def escoge_columna(A,h,n):
b=[] ### "n" es numero de filas de la Matriz A
for i in range(n): ### devolver
a la columna "h-1" de la matriz A
b.append([0])
for i in range(n):
b[i][0]=float((A[i][h-1]))
return b

def elige_h(c,m):

INDICE GENERAL

8
###
###
###
h=0
for

Te devuelve la posicion "i" del vector C para que entre la columna h=i de C
la columna que entrar
a ser
a "h-1"
en la posici
on "r" de B (otra funci
on hallar
a eso)
i in range (m):
if (c[i]<0):
h=i
return h+1

def elige_r(b,a,n):
### Devuelve la posici
on "i" en la cual b[i][0]/a[i][0] es el m
nimo
### La posici
on "r" que se necesitar
a ser
a el "i"
minimo=float(b[0][0])/float(a[0][0])
r=0
for i in range (n):
if (a[i][0]>0):
if (float(b[i][0])/float(a[i][0])<minimo):
r=i
return r+1

def cambia_columna(A,B,r,h,n):
### Reemplaza la columna "r" de B por la columna "h" de A
for i in range (n):
temp=float((A[i][h-1]))
B[i][r-1]=temp
return B
def vector_c_basico(Cb,c,r,h):
### Devolver
a la parte b
asica del vector Cb
###intercambiando el elemento de la posici
on "r" de "c"
### por el elemento de la posici
on "h" en C
### Retornar
a un vector de dimensi
on 1 x n, siendo n la dimensi
on de la matriz b
asica
c[r-1]=float((Cb[h-1]))
return c

print
print
print

*********************************************************
Algoritmo Simplex - M
etodo de las Inversas Expl
citas
*********************************************************

print Ingrese la Matriz A


print -------------------


0.8. CODIGO
PYTHON DEL PROGRAMA A UTILIZAR
n = int(input("Ingrese el n
umero de filas: "))
m = int(input("Ingrese el n
umero de columnas: "))
A=ingresa_matriz(n,m)
print Ingrese el vector b
print -------------------
b=ingresa_vector(A)
print Ingrese el vector C
print -------------------
Cb=ingresa_vec_objetivo(A)
h=0
r=0
c=[0,0,0,0]
no_acotado=False
optimo=False
B=[[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]
while (optimo==False and no_acotado==False):
Bi=matrix(B).I### Binv es ela inversa de B
print Bi
Ut = dot(c,Bi) ### producto de las matrices
print "Ut :",Ut
UtA=dot(Ut,A) ### producto de las matrices
print "UtA: ",UtA
Ct=Cb-UtA
tempCt=Ct.T ### transpuesta de Ct para poder comparar los valores
print "Ct: ",Ct
condicion1=True
for i in range (m):
if(tempCt[i]<0):
condicion1=False
break
if (condicion1==True):
optimo=True
print optimo

INDICE GENERAL

10
else:
h=elige_h(tempCt,m) ### se elige la posici
on h
###de los Cb[i], el primero que sea <0
print "h: ",h
br=dot(Bi,b) ### producto de las matrices
print "br: ",br

ah=escoge_columna(A,h,n) ### escoge la columna h de A,


###devuelve un vector columna
###ah=matrix(ah)
print "ah: ",ah
ahr=dot(Bi,ah) ### producto de matrices
print "ahr: ",ahr
print Bi
condicion2=True
for i in range (len(ahr[0])):
if(ahr[i]>0):
condicion2=False
break
if (condicion2==True):
no_acotado=True
else:
r=elige_r(br,ahr,n) ### se elige la posici
on r
entre el minimo de los br[i]/ahr[i]###
print "r: ",r
B=cambia_columna(A,B,r,h,n)
print B
temp=float((Cb[h-1]))
c[r-1]=temp
print ""
print ""
print array(B)
print ""
print ""
print B
print Ct

DEL PROBLEMA CON EL PROGRAMA


0.9. SOLUCION
print no_acotado
print optimo

0.9.

Soluci
on del problema con el programa

11

Você também pode gostar