Manual del estudiante de Ingeniería en Sistemas de UTN/Investigación Operativa/Programación Lineal

De Wikilibros, la colección de libros de texto de contenido libre.

Contenido

[editar] Método Simplex

[editar] Descripción

Este método requiere contar con una solución básica factible inicial. A partir de este vértice se mueve a través de una secuencia de soluciones básicas factibles, que mejoran o mantienen el valor de la función objetivo anterior. En cada paso deben cumplirse las siguientes condiciones:

[editar] Condición de optimalidad

Significa que debe garantizarse que durante el procedimiento, ninguna solución puede ser peor que la anterior.

[editar] Condición de factibilidad

Significa que debe garantizarse que si se parte de una solución factible, sólo se hallarán soluciones factibles. El método requiere que el problema esté en su forma estándar.

[Max|Min] X_0 = \underline{c}^T \underline{x}
S.a:
\underline{\underline{A}} \underline{x}  = \underline{b}
\underline{x} \geq \underline{0}


[editar] Proceso iterativo

Para comenzar a trabajar, hace falta una solución básica factible. Si las restricciones son de menor o igual, una variable de holgura se sumará al lado izquierdo, ya que a ese lado, a lo sumo le sobrará algo para equiparar al derecho:

\sum_{i = 1}^n x_i a_{ij} \leq b_j \forall j
 \Downarrow
\sum_{i = 1}^n x_i a_{ij}+s_j = b_j \forall j

En este caso, una solución factible es x_i = 0 \forall i, de manera que:

\sum_{i = 1}^n x_i a_{ij}+s_j = b_j \forall j \Rightarrow

 0 + s_j = b_j \forall j

Entonces:

 s_j = b_j \forall j

De manera que se cumple la restricción de no negatividad, ya que

 s_j = b_j \geq 0 \forall j

Si, en cambio, aparece una restricción de mayor o igual, una variable de holgura se restará al lado izquierdo, ya que a ese lado, a lo sumo le faltará algo para equiparar al derecho:

\sum_{i = 1}^n x_i a_{ij} \geq b_j \forall j
 \Downarrow
\sum_{i = 1}^n x_i a_{ij} - s_j = b_j \forall j

En este caso, x_i = 0 \forall i no es una solución factible, ya que:

\sum_{i = 1}^n x_i a_{ij} - s_j = b_j \forall j \Rightarrow

 0 - s_j = b_j \forall j

Entonces:

 s_j = - b_j \leq 0 \forall j

De manera que no se cumple la restricción de no negatividad, entonces el punto resulta no factible.

Por último, si la restricción fuera de igualdad, no se agrega ninguna variable de holgura, por lo que x_i = 0 \forall i implicaría que  0 = b_j \forall j, lo cual resultaría inconsistente si \exists j / b_j \neq 0 .

El vector de variables de decisión puede considerarse compuesto de dos vectores, uno de variables básicas y otro de variables no básicas, así como la matriz de coeficientes y el vector de costos.


\underline{\underline{A}} = 
\underbrace{
\begin{bmatrix}
a_{1,1}  & \cdots & a_{1,n}\\
a_{2,1}  & \cdots & a_{2,n}\\
\vdots  &        & \vdots\\
a_{n,1}  & \cdots & a_{n,n}
\end{bmatrix}
}^{\begin{matrix}
	P_{x_1} & \cdots & P_{x_n}
	\end{matrix}}_B
\underbrace{
\begin{bmatrix}
a_{1,n+1}  & \cdots & a_{1,m}\\
a_{2,n+1}  & \cdots & a_{2,m}\\
\vdots  &        & \vdots\\
a_{n,n+1}  & \cdots & a_{n,m}
\end{bmatrix}
}^{	\begin{matrix}
	P_{x_n+1} & \cdots & P_{x_m}
	\end{matrix}}_N


\underline{x} = \left[ \begin{matrix}
	x_1 \\
	\vdots \\
	x_n\\
	x_{n+1}\\
	\vdots \\
	x_m
	\end{matrix}
	\right]
\begin{matrix}
\left.
        \begin{matrix}
	 \\
	 \\
	\\
	\end{matrix}
\right) \underline{x}_B
\\
\left.
        \begin{matrix}
	 \\
	 \\
	\\
	\end{matrix}
\right) \underline{x}_N
\end{matrix}

\underline{c} = \left[ \begin{matrix}
	c_{x_1} \\
	\vdots \\
	c_{x_n}\\
	c_{x_{n+1}}\\
	\vdots \\
	c_{x_m}
	\end{matrix}
	\right]
\begin{matrix}
\left.
        \begin{matrix}
	 \\
	 \\
	\\
	\end{matrix}
\right) \underline{c}_B
\\
\left.
        \begin{matrix}
	 \\
	 \\
	\\
	\end{matrix}
\right) \underline{c}_N
\end{matrix}

El problema lineal puede escribirse

[Max|Min] X_0 = \underline{c}_B^T \underline{x}_B + \underline{c}_N^T \underline{x}_N
S.a:
\underline{\underline{B}} \underline{x}_B+\underline{\underline{N}} \underline{x}_N  = \underline{b}
\underline{x}_B, \underline{x}_N \geq \underline{0}

El valor de las variables básicas puede obtenerse a partir de las restricciones:

\underline{\underline{B}} \underline{x}_B+\underline{\underline{N}} \underline{x}_N = \underline{b}

Como las variables no básicas valen cero:

\underline{\underline{B}} \underline{x}_B+ \underbrace{\underline{\underline{N}} \underline{x}_N}_0 = \underline{b}

\underline{\underline{B}} \underline{x}_B = \underline{b} \Rightarrow

 \underline{x}_B = \underline{\underline{B}}^{-1} \underline{b}

Simplex encuentra un nuevo vértice asignando un valor no negativo a una de las variables actualmente no básicas. Esta variable que ingresa a la base, debe elegirse de tal manera que al hacerlo mejore la función objetivo. Se busca poner el nuevo valor[1] de X0 en función del valor anterior. Para eso, usamos los vectores \underline{x}_B y \underline{x}_N , que representan a las mismas variables que en la iteración anterior, pero cuyo valor será ahora un valor nuevo. Tenemos entonces la siguiente igualdad:

\underline{\underline{B}} \underline{x}_B+\underline{\underline{N}} \underline{x}_N = \underline{b}

Pero en este caso, las variables del vector \underline{x}_N no tienen necesariamente valor 0, por lo tanto no se puede anular el término \underline{\underline{N}} \underline{x}_N, entonces:

\underline{\underline{B}} \underline{x}_B = \underline{b} - \underline{\underline{N}} \underline{x}_N

 \underline{x}_B = \underline{\underline{B}}^{-1} \underline{b} - \underline{\underline{B}}^{-1} \underline{\underline{N}} \underline{x}_N

Quedan así los valores nuevos de \underline{x}_B en función de los valores de \underline{x}_B en la iteración anterior [2] y de \underline{\underline{B}}^{-1} \underline{\underline{N}} \underline{x}_N.

Se puede expresar ahora el nuevo valor de la función objetivo X0 en función de estos vectores viejos con valores nuevos:

 X_0 = \underline{c}^T \underline{x}

 X_0 = \underline{c}_B^T \underline{x}_B + \underline{c}_N^T \underline{x}_N

 X_0 = \underline{c}_B^T (\underline{\underline{B}}^{-1} \underline{b} - \underline{\underline{B}}^{-1} \underline{\underline{N}} \underline{x}_N) + \underline{c}_N^T \underline{x}_N

 X_0 =  \underline{c}_B^T \underline{\underline{B}}^{-1} \underline{b} - \underline{c}_B^T \underline{\underline{B}}^{-1} \underline{\underline{N}} \underline{x}_N + \underline{c}_N^T \underline{x}_N

 X_0 =  \underline{c}_B^T \underline{\underline{B}}^{-1} \underline{b} - (\underline{c}_B^T \underline{\underline{B}}^{-1} \underline{\underline{N}}  - \underline{c}_N^T ) \underline{x}_N

Representando el segundo término componente a componente [3]:

 X_0 =  \underline{c}_B^T \underline{\underline{B}}^{-1} \underline{b} -
             \sum_{j \in VNB} \left[ (\underline{c}_B^T \underline{\underline{B}}^{-1} \underline{P}_j  - c_j ) x_j \right]

Donde:

 X_0 =  \underbrace{\underline{c}_B^T \underline{\underline{B}}^{-1} \underline{b}}_{X_0 \text{ de la iteracion anterior}} -
             \sum_{j \in VNB} \left[ ( \underbrace{\underline{c}_B^T \underline{\underline{B}}^{-1} \underline{P}_j}_{z_j}  - c_j ) x_j \right]

Queda así expresado el nuevo valor de X0 en función del valor anterior:

 X_0 =  \underline{c}_B^T \underline{\underline{B}}^{-1} \underline{b} -
             \sum_{j \in VNB} \left[ ( z_j  - c_j ) x_j \right]

Garantizar que el segundo término no empeore el nuevo valor significa garantizar que en la nueva iteración la función objetivo no empeore. Cambiando el valor de una sola variable (en realidad, vamos a controlar el valor de cada una por separado), se puede controlar el valor del término completo. Esto es así porque entre los nuevos valores de las variables no básicas de la iteración anterior, sólo uno de ellos será diferente de 0 en la iteración nueva, y como todos los valores deben ser positivos, se puede fijar un signo para el término zjcj de tal manera que se garantice optimalidad.

[editar] Condición de optimalidad

Para mejorar la función objetivo respecto del valor anterior, dado que

 \underline{X}_0 =  \underline{X}_{0 \text{anterior}} -
             \sum_{j \in VNB} \left[ ( z_j  - c_j ) x_j \right] , y ya que zjcj será diferente de cero para un solo j, deberá buscarse el mejor valor de zjcj, que será:

  • zjcj > 0 si es un problema de minimización, ya que esto disminuirá el valor de la función objetivo.
  • zjcj < 0 si es un problema de maximización, ya que esto aumentará el valor de la función objetivo.

Se elegirá el más positivo o el más negativo en cada caso, e ingresará la variable xj a la base. Esto garantizará que la función objetivo no empeore al realizar este paso.

[editar] Condición de factibilidad

Luego, una de las variables que estaban en la base debe salir. Las condiciones que deben cumplirse para la variable que sale de la base son:

  • Todas las variables que eran básicas en la iteración anterior deben permanecer con valores no negativos.
  • La variable saliente tomará el valor de 0.

Como habíamos caracterizado a  \underline{x}_B como el vector viejo con valores nuevos, la primera restricción puede representarse:

 \underline{x}_B = \underline{\underline{B}}^{-1} \underline{b} - \underline{\underline{B}}^{-1} \underline{\underline{N}} \underline{x}_N \geq \underline{0} [4]

En este punto, xj ya está elegido, y es el único valor distinto de 0 en  \underline{x}_N, de manera que:

 \underline{x}_B = \underline{\underline{B}}^{-1} \underline{b} - \underline{\underline{B}}^{-1} \underline{P}_j x_j \geq \underline{0}

Tomando la condición elemento por elemento:

 \left( \underline{x}_B \right)_i = \left( \underline{\underline{B}}^{-1} \underline{b}\right)_i - \left( \underline{\underline{B}}^{-1} \underline{P}_j \right)_i x_j \geq \underline{0}  \forall i \in VB

Este conjunto de condiciones limita el valor de xj:

x_j \leq \frac{ \left( \underline{\underline{B}}^{-1} \underline{b}\right)_i}{\left( \underline{\underline{B}}^{-1} \underline{P}_j \right)_i}  \forall i \in VB

La condición que más limite el valor de xj será la que en definitiva fije su valor. El elemento que debe salir de la base (hacerse 0), es aquel que fija el valor de xj. Sea i la posición del elemento saliente dentro del vector  \underline{x}_B :

 i = \stackrel{\text{min}}{ _{i \in \text{VB}_r}} \left[ \frac{ \left( \underline{\underline{B}}^{-1} \underline{b}\right)_i}{\left( \underline{\underline{B}}^{-1} \underline{P}_j \right)_i}  \right]

Siendo VBr el conjunto de variables básicas que restringen el valor de xj, que son aquellas con índice i tal que  \left( \underline{\underline{B}}^{-1} \underline{P}_j \right)_i > 0 . Esto es así porque, como  \left( \underline{\underline{B}}^{-1} \underline{b}\right)_i es el valor anterior del vector de variables básicas en la posición i, es decir  \left( \underline{\underline{B}}^{-1} \underline{b}\right)_i = (\underline{x}_B)_{i \text{anterior}} , y por eso será siempre no-negativo, entonces, si  \left( \underline{\underline{B}}^{-1} \underline{P}_j \right)_i \leq 0 , la condición  \left( \underline{x}_B \right)_i = \left( \underline{\underline{B}}^{-1} \underline{b}\right)_i - \left( \underline{\underline{B}}^{-1} \underline{P}_j \right)_i x_j \geq \underline{0} se cumplirá en todo caso para ese i particular, de manera que la condición en dicha posición i no restringe el valor de xj.

Si a  \underline{\underline{B}}^{-1} \underline{P}_j lo llamamos  \underline{\alpha _j}, se puede expresar el valor del índice saliente como:

 i = \stackrel{\text{min}}{ _{i}} \left[ \frac{(\underline{x}_B)_{i \text{anterior}}}{\left(\underline{\alpha _j} \right)_i}  \right]  \forall i / \left(\underline{\alpha _j} \right)_i > 0



^  Es decir, el valor en el próximo punto, el de la siguiente iteración.

^  \underline{x}_{B anterior} = \underline{\underline{B}}^{-1} \underline{b}

^  Siendo VNB el conjunto de los índices correspondientes a las variables no-básicas.

^  Se utiliza esta nomenclatura para expresar que todos los elementos de  \underline{x}_B deberán ser mayores que cero.

Herramientas personales