Vous êtes sur la page 1sur 11

Informe: Programacin lineal

MTODO SIMPLEX MAZIMIZACIN


El mtodo smplex cuya gran virtud es su sencillez, es un mtodo muy prctico, ya
que solo trabaja con los coeficientes de la funcin objetivo y de las restricciones.
Ilustraremos su funcionamiento mediante un ejemplo, pero previamente
mostraremos las reglas de decisin para determinar la variable que entra, la que
sale, la gran M, y cmo determinar que estamos en el ptimo; Todas stas reglas de
decisin fueron deducidas del mtodo algebraico, solamente que aqu se han
acomodado para ser usadas en el tipo de tablero smplex que se usar.

Criterio de decisin

Maximizar

Gran M en la funcin objetivo - MXj

Minimizar
+MXj

Variable que entra

La ms negativa de los Zj - Cj La ms positiva de los Zj - Cj

Variable que sale

La menos positiva de los b/a ,


La menos positiva de los b/a ,
Siendo a > 0 , de lo contrario
Siendo a > 0 , de lo contrario
no restringe a la variable que
no restringe
entra

Solucin ptima

Cuando todos los Zj Cj > 0

Cuando todos los Zj Cj < 0

Tipos de restricciones

Restricciones (
Se aade una variable de holgura, con costo (o ganancia) en la funcin
objetivo igual a 0.
Ejm:
2X1 - 4X2 <= 1, queda:
2X1 - 4X2 + X3 = 1 Cj de X3 en la funcin objetivo ser 0.
Restricciones (
Se resta una variable de exceso, con costo (o ganancia) en la funcin
objetivo igual a 0, y se suma una variable artificial con costo +M M
segn sea maximizacin o minimizacin.Ejm:
2X1 + 3X2 >= 1, queda:
2X1 + 3X2 - X3 + X4= 1 Cj de X3 en la funcin objetivo ser 0. y Cj de
X4 (artificial) es (M
Restricciones =Se le aade una variable artificial con costo +M M
segn sea maximizacin o minimizacin.Ejm:
2X1 + 3X2 = 8, queda:

2X1 + 3X2 + X3= 8 Cj de X3 en la funcin objetivo ser (M


Adicionalmente se presentan las siguientes notas a tener en cuenta:
Si en el tablero simplex de la solucin ptima queda al menos una variable de
supervit artificial dentro de las variables bsicas, con un valor > 0 , el
problema no tiene solucin, esto quiere decir que al menos existen dos
restricciones excluyentes, por lo tanto no existe rea de soluciones factible y
menos una solucin , en ste caso se debe revisar la formulacin del
problema.
Si al escoger la variable que sale, ninguna de las variables bsicas restringe
el crecimiento de la variable no bsica escogida para entrar, el problema
tiene solucin indeterminada y se debe revisar la formulacin en busca de
una nueva restriccin que no se tuvo en cuenta en la formulacin inicial.
Si en el tablero simplex del ptimo, al menos una de las variables no bsicas
tiene coeficiente cero (0) en la funcin objetivo, esto es su Zj Cj = 0, el
problema tiene mltiples soluciones y se nos est ofreciendo una de ellas.

Ejemplo 1
Siendo Xi la cantidad a producir del producto i.
Maximizar Z = X1 + X2 {Ganancia total en soles}
S.A.
5X1 + 3X2 <= 15 {Horas disponibles dep. A}
3X1 + 5X2 <= 15 {Horas disponibles dep. B}
Xj >= 0 ; j = 1, 2
Los problemas de Maximizacin, con todas sus restricciones <= y con la
condicin de no negatividad, se le llama Forma Estndar Forma
Norma
Aqu debemos conseguir una solucin bsica factible, empleando
las variables de holgura y/o artificiales, quedando
el sistema de ecuaciones as:
Maximizar Z = X1 + X2
S.A.
5X1 + 3X2 + X3 = 15
3X1 + 5X2 + X4 = 15
Xj >= 0 ; j = 1,2,3,4
Las variables bsicas son aquellas cuyos coeficientes forman
la matriz unitaria.
En este caos accidentalmente son las variables de holgura X3 y X4.
A continuacin construimos la siguiente tabla:

Cj

1
V.B. b

b/a
a>0

X X X X
1 2 3 4

X3

1
5
5

15/5=3

X4

1
3
5

15/3=5

0 -1 -1 0

Zj - Cj

El valor de la funcin objetivo Z, se encuentra frente a la casilla de Zj


Cj , en ste caso vale cero (0) y se calcula multiplicando el vector fila (en
la tabla es la columna inmediatamente anterior a la de las variables
bsica V.B.) que contiene los coeficientes de las variables bsicas en la
funcin objetiva original por el vector columna de los trminos
independientes b
CXB = Vector fila de los coeficientes en la funcin objetivo original de las
variables bsicas actuales, sus valores se encuentran en la primera
columna del tablero.
b = Vector columna de los trminos independientes de las restricciones,
que al mismo tiempo son los valores de las variables bsicas actuales, sus
valores se encuentran bajo la columna denominada b
CXB = (0,0) ; b = (15,15)" Z = CXB * b = (0)(15) + (0)(15) = 0
El valor de los Zj Cj se calcula multiplicado el vector fila CXB por el
vector apuntador aj dela columna de la variable j-sima, menos el Cj, esto
es:
Zj Cj = CXB. aj Cj ;
Los clculos se efectan as:
Z1 C1 = CXB a1 C1 = (0,0).(5,3)" - 1 = (0)(5)+(0)(3) 1 = -1
Z2 C2 = CXB a2 C2 = (0,0).(3,5)" - 1 = (0)(3)+(0)(5) 1 = -1
Z3 C3 = CXB a3 C3 = (0,0).(1,0)" - 0 = (0)(1)+(0)(0) 0 = 0
Z4 C4 = CXB a4 C4 = (0,0).(0,1)" - 0 = (0)(0)+(0)(1) 0 = 0
A continuacin se indican la variable que sale y la variable que entra:

La variable que tiene Zj-Cj ms negativo es X1 X2. Se escoge al azar


X1.
En esta iteracin b/a da: 15/5 = 3 y 15/3 = 5;

Lo que significa que la variable bsica X3 restringe el crecimiento de la


variable que entra, X1, hasta 3 (no la deja tomar valores superiores a 3) y
la variable bsica X4 restringe el crecimiento de la variable que entra X1
hasta 5 (no la deja tomar valores superiores a 5).
Por supuesto la variable bsica que restringe ms el crecimiento de
la variable que entra X1, es X3 , por lo tanto, es la variable bsica
escogida para salir.
La fila de la variable bsica escogida para salir se divide por el elemento
que se encuentra en la interseccin de dicha fila con la columna de la
variable que entra, la fila resultante es la fila pivote y se coloca en un
nuevo tablero, desde el que se suman mltiplos de la fila pivote a las
dems filas del tablero anterior de tal forma que se eliminen de cada una
de ellas la variable escogida para entrar, en nuestro caso X1 ,
esteprocedimiento se denomina, hacer un uno (1) en la interseccin y el
resto de la columna ceros (0), por lo tanto en dicha columna aparecer un
vector unitario, el procedimiento se repite en cada iteracin, hasta que
todos los Zj Cj sean mayores iguales a cero en el caso de maximizar
menores iguales a cero en el caso de minimizar.
A continuacin se muestran todas las iteraciones y en cada fila los valores
por los cuales fueron multiplicadas para ser sumadas a otras filas, ello se
expresa como sumar mltiplos de una fila a otra.
Fjese que se suman mltiplos de las restricciones a la funcin objetivo
para eliminar las variables bsicas de ella.
Cj

V.B.

X1

X2

X3

X4

X1

3/5

1/5

X4

16/5 -3/5 1

-2/5

Zj - Cj

1/5

b/a
a>0
5
15/8

Variable que entra X2


Variable que sale X4
Cj

X1

X2

X3

X4
0

V.B.

X1

15/
1
8

5/16

X2

15/
0
8

-3/16 5/16

15/
0
4

1/8

Zj Cj

1/8

b/a
a>0

Solucin ptima:
X1* = 15/8
X2* = 15/8
Z * = 15/4
La solucin es nica: X1 * = 15/8 ; X2 * = 15/8 ; Z* = 14/4

IMPLEMENTACIN
El cdigo fuente esta realizado en Java con GUI que cuenta con solo una clase
llamada Interfaz.java

Para el botn Mostrar:


En las cajas de texto se deben llenar el nmero de restricciones y el nmero
de variables correspondiente.

restricciones = Integer.parseInt(txtRestriccion.getText());
variables = Integer.parseInt(txtVariable.getText());
DefaultTableModel modelo = new DefaultTableModel();
modelo.setRowCount(restricciones + 1);
modelo.setColumnCount(variables + restricciones + 2);
array = new Object[variables + restricciones + 2];
EtiquetaX = new Object[variables + restricciones];
for (int i = 1; i < array.length - 1; i++) {
if (i < variables + 1) {
array[i] = "X" + i;
EtiquetaX[i - 1] = "X" + i;
} else {
array[i] = "S" + (i - variables);
EtiquetaX[i - 1] = "S" + (i - variables);
}
}
EtiquetaY = new Object[restricciones + 1];
for (int i = 0; i < restricciones; i++) {
modelo.setValueAt("S" + (i + 1), i, 0);
EtiquetaY[i] = "S" + (i + 1);
}
modelo.setValueAt("Z", restricciones, 0);
EtiquetaY[restricciones] = "Z";
array[array.length - 1] = "SOL";
modelo.setColumnIdentifiers(array);
table.setModel(modelo);

La accin del botn Aceptar en realidad nos redimensiona la tabla segn las
restricciones y variables, de manera que debemos adecuar nuestro problema
en las celdas de las tablas, esto requiere un conocimiento previo del mtodo
simplex.

Para el botn Solucin:


La accin del botn Solucin resuelve nuestro problema con el mtodo
simplex, las operaciones realizadas se almacenan en el arreglo bidimensional
Matriz, este deber al final mostrar en una tabla el resultado, con ayuda de
los mtodos de columna pivote, fila pivote, y a partir del cual efecta
operaciones gaussianas.

DefaultTableModel modeloSolucion = new DefaultTableModel();


Matriz = new double[restricciones + 1][restricciones + variables + 1];
for (int i = 0; i < (restricciones + 1); i++) {
for (int j = 0; j < (restricciones + variables + 1); j++) {
Matriz[i][j] = Double.parseDouble(table.getValueAt(i, j +
1).toString());
}
}
while (ComprobarResultado() != true) {
EtiquetaY[FilaPivote()] = EtiquetaX[ColumnaPivote()];
NuevaTabla(FilaPivote(), ColumnaPivote());
modeloSolucion.setColumnCount(restricciones + variables + 2);
modeloSolucion.setRowCount(restricciones + 1);
modeloSolucion.setColumnIdentifiers(array);
for (int i = 0; i < (restricciones + 1); i++) {
modeloSolucion.setValueAt(EtiquetaY[i], i, 0);
for (int j = 0; j < (restricciones + variables + 1); j++) {
modeloSolucion.setValueAt(Matriz[i][j], i, j + 1);
}
}
tablaSol.setModel(modeloSolucion);
}

Mtodos de la Clase:
-Mtodo Columna Pivote
public int ColumnaPivote() {
int pos = 0;
double aux = Matriz[restricciones][0];
for (int i = 1; i < restricciones + variables; i++) {
if (aux > Matriz[restricciones][i]) {
aux = Matriz[restricciones][i];
pos = i;
}
}
return pos;
}

-Mtodo Fila Pivote

public int FilaPivote() {


int columna = ColumnaPivote();
double temp = 0, razon = Matriz[0][variables +
restricciones] / Matriz[0][columna];
int pos = 0;
for (int i = 1; i < restricciones; i++) {
if (Matriz[i][columna] != 0) {
temp = Matriz[i][variables + restricciones] /
Matriz[i][columna];
if (razon > temp && temp >= 0) {
razon = temp;
pos = i;
}
}
}
return pos;
}

-Mtodo Comprobar Resultado


public boolean ComprobarResultado() {
boolean result = true;
for (int i = 0; i < restricciones + variables; i++) {
if (Matriz[restricciones][i] < 0) {
result = false;
break;
}
}
return result;
}

-Mtodo Nueva Tabla

public void NuevaTabla(int Fila, int Columna) {


double pivote = Matriz[Fila][Columna], temp = 0;//-for (int i = 0; i < restricciones + variables + 1; i++) {
Matriz[Fila][i] = Matriz[Fila][i] / pivote;
}
for (int i = 0; i < restricciones + 1; i++) {
temp = Matriz[i][Columna];
for (int j = 0; j < variables + restricciones + 1; j++) {
if (i != Fila) {
Matriz[i][j] = Matriz[i][j] - temp * Matriz[Fila][j];
} else {
break;
}
}
}
}

Casos de prueba:
Para un:
Z=40X1+60X2
Restricciones:
2X1+X2<=70
X1+X2<=40
X1+3X2<=90
X1,X2>=0
Maximizar:

Solucin:
X1=15
X2=25

Z=2100

Otro Caso de prueba: Con 2 restricciones


Para un:
Z=50X1+80X2
Restricciones:
X1+2X2<=120
X1+X2<=90
X1,X2>=0
Maximizar:

Solucin:
X1=60
X2=30
Z=5400

Vous aimerez peut-être aussi