Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. 3. Programación Lineal Entera. 3.1 Problemas de Transporte. Los problemas de asignación y transporte son un caso particular de la programación lineal entera. De hecho, a menudo no es necesario imponer la condición de que las variables sean enteras, sino que por la propia construcción del problema viene implícito. Tienen un algoritmo propio de cálculo, que es una adaptación del método simplex. Aunque son llamados problemas de transporte, en realidad se pueden aplicar a infinidad de tipos de problemas. El problema de transporte se caracteriza por: oi di 1 1 2 2 cij n • • • • • • m Una serie de nodos de origen. Una serie de nodos de destino. Unas rutas de transporte de elemento a transportar. Un coste unitario de transporte desde el origen i hasta el destino j. Asociado a cada origen, oi es la oferta o capacidad del origen i. Se está obligado a satisfacer la demanda dj de cada uno de los destinos. Sea xij la cantidad transportada desde el origen i al destino j. El problema de transporte se puede formular como: min ∑ cij x ij i, j ⎧∑ x ij ≤ oi ⎪ j ⎪ s.a. ⎨∑ x ij ≥ d j ⎪i ⎪x ≥ 0 ⎩ ij i = 1, 2, K , n j = 1, 2, K , m En algunos casos habrá que añadir la restricción x ij ∈ Z ∀i, j es decir, que las xij sean enteras. No obstante, en muchos casos esta restricción estará implícita y no será necesaria. Si sumamos las n primeras restricciones tenemos que: ∑ ∑ x ij ≤ ∑ oi i j i = oT Si sumamos las m siguientes tenemos que: ∑ ∑ x ij ≥ ∑ d j i j j 1 de 25 = dT Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Encadenando ambas, para que un problema de transporte tenga solución, debe cumplirse: dT ≤ oT En la práctica esta condición no suele darse, siendo habitual el caso contrario. Si oT ≤ dT se crea un nodo de origen con oferta dT − oT con costos de transporte nulos. Cuando dT = oT el problema se dice balanceado o equilibrado. Para homogeneizar técnicas, si se da el caso contrario, oT ≥ dT , se crea un nodo de destino con demanda oT − dT . De esta forma el exceso de oferta va a un destino ficticio. Los costes de transporte también serán nulos. Para un problema de transportes balanceado se puede añadir la restricción oT=dT, lo que implica que la formulación quede como: ∑ cij x ij min i, j ⎧∑ x ij = oi ⎪ j ⎪ s.a. ⎨∑ x ij = d j ⎪i ⎪x ≥ 0 ⎩ ij i = 1, 2, K , n j = 1, 2, K , m Propiedad. Todo problema de transportes balanceado tiene solución óptima finita. Demostración. Esta demostración se realizará en dos pasos. • • Se demuestra que siempre tiene solución factible. Se demuestra que no es un problema ilimitado. La conjunción de ambas demostraciones implica que existe solución óptima finita. Si encontramos un punto que satisfaga ambas condiciones, se demostrará que existe solución óptima finita. Seleccionaremos un punto tal que sea proporcional a oi y a dj tal como: x ij0 = oi ⋅ d j ∀i, j dT Se comprueba si es factible, para lo cual el punto debe satisfacer las restricciones: ∑ xij0 = ∑ i como dT=oT entonces, ∑ x ij0 = i dj dT oi ⋅ d j i dT = dj dT ∑ oi i = dj dT ⋅ oT ⋅ oT = d j es decir, cumple la segunda restricción. Análogamente podemos comprobar que también cumple la primera restricción: ∑ x ij0 = ∑ j j oi ⋅ d j dT = oi dT ∑ dj j Por tanto, podemos concluir que el punto es factible. 2 de 25 = oi ⋅ dT = oi dT Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Ahora se debe comprobar que el problema no es ilimitado. Para ello tendremos en cuenta que la cantidad transportada desde un origen i a un destino j será igual o menor que la cantidad transportada total, de forma que: x ij ≤ ∑ xij i, j = oT Además, según las restricciones: x ij ≥ 0 por tanto: 0 ≤ x ij ≤ oT Es decir, el recorrido de cada variable está acotado y, por tanto, la región factible también está acotada, resultando entonces que el problema no es ilimitado. 3.1.1 Formato de tabla para un problema de transporte. Representaremos el problema en forma de tabla, de manera que cada fila de la tabla corresponde a un origen y cada columna a un destino. ORÍGENES DESTINOS Distinguiremos entre dos tipos de casillas: Casilla NO Básica: Corresponde a variables no básicas. cij Coste zij-cij Elemento del Renglón z Casilla Básica: Corresponde a variables básicas. cij Coste B xij Valor de la Variable Definición: Un ciclo en una tabla de transportes es un conjunto ordenado de casillas que verifican: 1. La primera y la última casilla coinciden. 2. Cada casilla comparte con la siguiente la fila o la columna. 3. No existen más de dos casillas consecutivas que compartan fila o columna. 3 de 25 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Por ejemplo: 1 5 2 4 3 Un ejemplo de lo que no sería un ciclo podría ser: 1 6 2 5 3 4 Puede trazarse el camino del ciclo de forma que cuando se cambia de horizontal a vertical estamos en una casilla del ciclo. Las otras casillas no forman parte del ciclo. Propiedad: Un conjunto de columnas de la matriz de coeficientes de un problema de transportes es linealmente dependiente si y solo si se puede formar un ciclo con alguna de sus respectivas casillas Esta propiedad responde a la pregunta de cuántas ecuaciones del problema de transportes son linealmente independientes, es decir, cuántas variables básicas obtendremos. Por ejemplo tengamos es siguiente caso, con n filas y m columnas, en las que las casillas sombreadas tienen valor no nulo: Habrá entontes m+n-1 variables básicas, ya que no se va poder formar un ciclo con ellas. 3.1.2 Métodos de generación de soluciones básicas factibles. a) Método de la esquina noroeste. Tengamos el siguiente ejemplo, con las siguientes disponibilidades y demandas: 35 50 30 45 Comprobamos que está balanceado: 20 ∑ oi 30 = 125 = ∑ dj 4 de 25 30 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. A la primera casilla más al noroeste le ponemos una B y la utilizamos tanto como me permitan la oferta y la demanda. 35 B 35 50 30 45 20 30 30 Como también interesa que no haya ciclos, es conveniente que no haya ninguna casilla en la misma fila (o en la misma columna). Se tacha la fila y se actualiza la columna (o viceversa): Se repite hasta que haya elegidas m+n-1 casillas, en este caso 4+3-1=6 Tenemos m+n-1 casillas y además linealmente independientes, por lo que tenemos una solución básica factible. Este método no tiene en cuenta los costos y puede resumirse como sigue: 1. Elegir la casilla más al noroeste y hacerla básica a valor máximo entre la oferta de esa fila y la demanda de su columna. 2. Tachar la fila o columna donde de haya alcanzado el mínimo. 3. Actualizar la oferta y la demanda y volver al paso 1. b) Método de Vöguel. Una forma de mejorar el método de la esquina noroeste sería ir definiendo ordenadamente como variables básicas aquellas casillas con menor coste. Sin embargo esta solución no siempre da resultados aceptables, ni siquiera mejores que el de la esquina noroeste. 5 de 25 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. A modo de ejemplo, consideremos la siguiente tabla: 1 2 3 1000 1 1 1 1 Si eligiéramos las casillas según su coste, tendríamos la siguiente tabla: 1 B 2 1 3 1 B 1000 0 1 1 B 1 1 1001 El coste de esta tabla sería 1.001. Fácilmente podríamos encontrar otra tabla de menor coste como la siguiente: 1 B 2 0 3 1 B 1 B 1000 1 1 1 1 5 El coste es esta nueva tabla es de 5. La diferencia entre ambas estriba en que al haber elegido la casilla con coste 1, hemos perdido la oportunidad de elegir cualquier elemento de la misma fila o columna (dependiendo de cuál se satisfaga completamente). A esta pérdida de oportunidad se le asigna un coste (coste de oportunidad). Cuanto mayor sea ese coste de oportunidad, más importancia tendrá elegir entre uno u otro. El método de Vogüel tiene en cuenta este tipo de penalizaciones y se estructura de la siguiente forma: • Para cada fila y columna se calcula la penalización o costes de oportunidad como la diferencia entre los dos costos más pequeños. • Se elige la casilla más barata. • Se hace básica esa casilla con el valor mínimo que satisfaga la oferta o la demanda. Ejemplo: Tengamos la siguiente tabla de partida: 8 6 10 9 9 12 13 7 14 9 16 5 45 20 30 6 de 25 35 50 40 30 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Calculamos la penalización para cada una de las filas y columnas: 1 2 2 4 3 3 2 8 6 10 9 9 12 13 7 14 9 16 5 45 20 35 50 40 30 30 En este caso la máxima penalización corresponde a la tercera fila. Se elige la casilla más barata (la sombreada). Se hace básica con el valor mínimo que satisface, en este caso, la demanda y se actualizan las columnas: 1 3 2 6 10 9 9 12 13 7 14 9 16 5 2 2 4 3 8 35 50 B 30 45 20 30 40 10 30 Se vuelven a calcular las penalizaciones, exceptuando aquellas filas o columnas ya satisfechas, en este caso, la cuarta columna. 1 3 3 2 2 3 2 2 8 6 10 9 9 12 13 7 14 9 16 5 35 50 B 40 10 30 45 20 30 30 La casilla sombreada es la elegida. Puede observarse cómo al haber satisfecho una columna, y habiéndose eliminado ésta del cálculo de las penalizaciones, no varían las penalizaciones por columnas, pero sí por filas. 5 4 Damos valor a la casilla sombreada y actualizamos valores: 1 3 3 2 2 2 3 2 8 6 10 9 9 12 13 7 14 9 16 5 8 6 10 9 9 12 13 7 14 9 16 5 B 35 50 B 40 10 10 30 45 20 30 30 10 Calculamos las penalizaciones. Ahora las penalizaciones por fila no variarán, pero sí las penalizaciones por columna. 1 6 3 3 3 2 1 5 4 2 2 3 2 5 4 45 B 10 20 10 30 7 de 25 35 50 B 30 30 40 10 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Satisfacemos los valores mínimos: 1 1 2 8 6 9 12 14 9 2 3 2 5 4 6 3 3 3 B 9 13 7 16 5 4 2 3 5 35 10 B 10 45 20 10 Calculamos nuevamente las penalizaciones: 1 6 3 1 2 2 10 2 2 4 8 6 9 12 14 9 50 B 30 30 30 3 3 B 4 2 3 5 2 2 4 8 6 B 9 13 7 16 5 35 B 12 30 30 9 B 9 13 7 16 5 45 10 20 10 30 1 1 6 3 3 3 40 10 35 25 50 5 40 10 35 25 50 5 40 10 2 10 45 14 25 50 B 10 9 10 2 10 10 45 20 30 10 Damos valor a la variable y actualizamos filas y columnas: 1 6 3 3 3 1 2 40 10 B 25 B 30 30 Y finalizamos la tabla: 2 2 2 4 3 2 5 4 8 6 B 10 10 9 B 12 13 B 7 5 9 45 9 25 45 14 2 B B 16 10 20 10 5 30 B 30 30 3.1.3 Resolución de los problemas de Transporte. Una vez se haya encontrado una solución básica factible, se aplica el test de optimalidad. Tenemos el problema: min ∑ cij x ij ⎧∑ x ij ≤ oi ⎪ j s.a. ⎨ ⎪∑ x ij ≤ d j ⎩i i = 1,2, K , n j = 1,2, K , m 8 de 25 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. El dual de este problema es: ∑ oi ui + ∑ d jv j max i j ⎧u1 + v1 ≤ c11 ⎪ ⎪M ⎪u1 + v m ≤ c1m ⎪ ⎪u2 + v1 ≤ c21 ⎪ s.a. ⎨M ⎪u + v ≤ c m 2m ⎪ 2 ⎪M ⎪ ⎪un + v m ≤ c nm ⎪ui ; v i libres ⎩ Es decir: max ∑ oi ui + ∑ d jv j i j ⎧⎪ui + v j ≤ c ij s.a. ⎨ ⎪⎩ui ; v i libres i = 1,2, K , n j = 1,2, K , m La condición de holgura complementaria dice que si xij es básica y no nula: ui + v j = c ij Como tenemos n+m-1 variables básicas, tenemos n+m-1 ecuaciones con m+n incógnitas, por lo que se trata de un sistema compatible indeterminado, el cual es sencillo de resolver. Tomemos como ejemplo el problema anterior, con la solución básica factible obtenida por el método de Vöguel: 8 6 B 10 10 9 B B 9 B 7 25 12 13 45 5 14 B 9 16 5 10 B 30 Al ser un sistema compatible indeterminado, todas las soluciones estarán en función del valor de una de ellas. Por comodidad, siempre se asignará a u1 el valor 0. x12 es básica → u1 + v 2 = c12 → v2 = 6 x13 es básica → u1 + v3 = c13 → v3 = 10 Así continuaríamos con todos los valores que quedan expresados en la siguiente tabla: ui 8 6 B 10 10 9 B 12 vj 13 B 7 0 3 5 9 6 9 25 45 14 B B 16 10 6 5 10 9 de 25 B 30 2 3 1020 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Además, para las variables no básicas debe cumplirse que: z ij − cij = ui + v j − cij ≤ 0 Estos valores se corresponden con los coeficientes de esas variables en el renglón z. Se calculan estos valores y se ponen en las variables no básicas: ui 8 6 B 10 10 -2 9 B 13 45 B 7 10 6 3 -2 B 16 -5 6 0 -7 5 -3 9 vj 9 25 12 14 B 5 B 3 30 2 -3 10 1020 Como todos los coeficientes son menores que cero, puede concluirse que esta tabla es óptima, ya que se ha encontrado un x, u y un v que verifican las condiciones de holgura complementarias. Partamos ahora de la solución básica factible hallada por el método de la esquina noroeste: 8 B 6 B 12 10 9 35 9 10 B 13 20 14 B 7 B 5 20 9 16 10 B 30 Calculamos los valores de ui, vj y los valores de zij-cij: ui 8 B 6 B 12 35 9 10 5 14 9 2 20 B 9 -2 8 vj 10 13 16 6 11 20 10 12 0 -8 B 7 B 5 1 -5 30 1 B 4 Esta tabla no es óptima, ya que algunos de los coeficientes del renglón z de las variables no básicas son mayores que cero, por lo que se debe pivotar. Elegimos para pivotar la casilla que tenga mayor coeficiente del renglón z, en este caso la casilla que está sombreada. Si pretendemos aumentar el valor de esa casilla, necesariamente alguna de la misma columna debe disminuir. La única que puede disminuir es una casilla básica, pues es la única variable que tiene valor. Al disminuir, otra de la misma fila debe aumentar. La única variable que puede aumentar es una variable básica, ya que si no estaríamos introduciendo dos variables en la misma iteración. En definitiva estamos creando un ciclo, tal y como se muestra en la siguiente tabla: 8 B 6 35 9 B 20 B - 9 -2 9 2 12 10 14 10 5 13 20 16 6 + 10 de 25 10 -8 B + 7 B - 5 -5 B 30 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Vemos cómo lo máximo que se puede aumentar a la variable que introducimos es lo máximo que alguna de las variables del ciclo pueda disminuir. En este caso 10. Quedando la tabla: 8 B 6 B 12 10 9 35 9 10 B 13 B 10 14 9 10 7 30 B 16 5 10 9 30 B Realizamos el test de optimalidad: ui 8 B 6 B 12 35 9 10 B 13 B 10 14 vj 2 5 9 30 B 16 -2 0 1 1 7 5 B -8 10 -6 30 8 11 12 7 -2 Creamos el ciclo: ui 8 35 9 10 B - 9 10 + 5 B 12 + 14 vj 6 10 9 2 B - 13 B 16 0 -2 B 7 30 1 1 5 B -8 10 -6 30 8 11 12 7 -2 Se pivota, obteniendo la nueva tabla: 8 B 6 25 9 B 10 9 10 B 12 13 B 20 7 30 14 9 10 B 16 5 10 9 30 B Realizamos nuevamente el test de optimalidad: ui 8 B 6 B 12 25 9 10 20 14 vj B -3 8 B 7 30 -5 9 B 10 6 16 Creamos el ciclo: 11 de 25 1 -4 5 -1 12 0 -7 2 13 B 30 2 3 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Se pivota para obtener la nueva tabla: 8 6 B 10 10 B 9 12 13 45 14 B 9 B 7 25 5 9 10 B 16 5 30 B Que sabemos que es solución óptima ya que es la solución básica factible que se halló mediante el método de Vöguel que ya se vio que era óptima. 3.1.4 Resumen del método de transporte. Paso 0: Encontrar una solución básica factible. Paso 1: Calcular ui, vj soluciones del sistema de ecuaciones ui + v j = c ij ∀i, j siendo xij variables básicas Paso 2: Para las casillas no básicas, calcular ui + v j − cij = z ij Si zij≤0 la tabla es óptima. Paso 3: Seleccionar como variable de entrada la variable no básica con mayor zij (entre los positivos). Paso 4: Formar un ciclo con la casilla que entra y con variables básicas. Paso 5: Marcar alternativamente con (+) y con (–) las casillas que formen el ciclo empezando por un signo (+) en la casilla que entra. Paso 6: Calcular τ como el mínimo de los valores de las casillas marcadas con signo (–) en el ciclo. Paso 7: Sumar τ al valor de las casillas marcadas con signo (+) en el ciclo y restarlo a las casillas con signo (–). Paso 8: Marcar como básica la casilla que entra y desmarcar como básica una de las casillas que hayan quedado con valor 0. Volver al paso 1. Propiedad: Si a los costos de una fila o una columna de un problema de transportes balanceado se le suma o le resta una cantidad, la solución óptima no cambia. Demostración: tengamos un problema de transportes balanceado con unos costes tales que: ⎪⎧c ij + k si i = 1 ~ cij = ⎨ ⎪⎩cij si i ≠ 1 → se ha aumentado la 1ª fila La nueva función objetivo será: ~ z = ~ ∑ cij ⋅ x ij i, j = ~ ~ ∑ cij ⋅ x ij + ∑ cij ⋅ xij i =1 j = i ≠1 j = ∑ cij ⋅ x ij i, j ∑ (cij i =1 j ) + k ⋅ x ij + ∑ cij ⋅ x ij = ∑ cij ⋅ xij i ≠1 j + k ⋅ o1 = z original + cte Por tanto la solución óptima no cambia. 12 de 25 i, j + k ∑ x ij = i =1 j Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Propiedad: Si oi y dj son enteras, entonces, el problema de transportes tiene, al menos, una solución entera. Esta propiedad puede comprobarse observando los métodos de cálculo, ya que si oi y dj son enteras, tanto en el método de la esquina noroeste como en el método de Vöguel, dan soluciones básicas factibles enteras. Al aplicar después el método de transportes, cada una de las tablas obtenidas es entera. Si hubiera soluciones múltiples, no todas serían enteras, ya que todo el segmento que uniera ambos puntos sería solución óptima. 3.1.5 Problemas de Trasbordo. En problemas reales, pueden existir nodos de trasbordo que sean trasbordo puro o realicen además funciones de oferta o demanda. Los tipos de nodos que pueden existir en un problema de transporte son: • Nodos de origen puro: Los que ofertan mercancías y no demanda. Pueden enviar pero no recibir. • Nodos de destino puro: Los que demandan pero no ofertan. Pueden recibir pero no enviar. • Nodos de trasbordo: Pueden recibir y enviar. A su vez se dividen en: o o o Trasbordo puro: No ofertan y no demandan. Todo lo que reciben sale. Demanda: No ofertan pero demandan. Oferta: Ofertan pero no demandan. Un ejemplo de problema de trasbordo sería el siguiente: 10 1 20 2 15 3 4 5 10 1 Nodos que ofertan 6 25 6 Nodos que demandan 7 10 4 Nodos de trasbordo puros Para expresar este problema como una tabla de transporte, duplicaremos los nodos que simultáneamente envían y reciben (uno el que recibe y otro el que suministra), situando los nodos que ofertan en las filas y los nodos que demandan en las columnas: 2 4 5 1 2 3 4 5 13 de 25 6 7 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Se colocan las disponibilidades y las demandas, teniendo en cuenta que los nodos que no ofertan tienen disponibilidad cero y los que no demandan tienen demanda cero. En este caso: Los nodos 4 y 5 tienen oferta 0. Los nodos 2 y 4 tienen demanda 0. 2 4 5 6 7 1 10 2 20 3 15 4 0 5 0 0 0 10 25 10 Se balancea el problema si no lo estuviera. En este caso el problema ya está balanceado, ya que oT = dT. Se completan los costes, teniendo en cuenta que: Para las rutas imposibles, el coste es M (si el problema fuera de maximización el coste sería –M) Para trasportes al mismo nodo, el coste es 0. 2 1 2 3 4 5 4 5 6 7 3 5 M 4 M 0 4 3 M M M M 5 M 12 M 0 M 2 3 M 4 0 M 6 0 0 10 10 20 15 0 0 25 10 A priori no sabemos cuánta cantidad se va a transbordar, por ejemplo, por el nodo 4. Habría que prever que, como mínimo, pudiera ser trasbordada toda la mercancía a través del nodo 4. Para realizar esta previsión, en todos los nodos de trasbordo se añade tanto a la demanda como a la oferta la cantidad total a trasportar (oferta o demanda total). 2 1 2 3 4 5 4 5 6 7 3 5 M 4 M 0 4 3 M M M M 5 M 12 M 0 M 2 3 M 4 0 M 6 0+45 0+45 10+45 14 de 25 25 10 20+45 15 0+45 0+45 10 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Si en la fila del nodo 4, en la intersección con su propia columna (casilla sombreada) hubiera algún valor xij, esto quiere decir que la cantidad que realmente se ha trasbordado a través del nodo 4 es de oT – xij. La tabla, tal como está planteada, es un problema de transporte convencional. La solución sería: 2 1 2 3 4 5 4 3 5 5 6 7 M 4 B M 3 M M M 12 10 10 0 B 4 45 M B 65 20 M 5 B 15 15 M 0 B M 2 25 M 4 45 0 45 B 3 15 B 40 55 M B 5 6 25 B 5 10 45 45 Analizando el resultado en los nodos de trasbordo: x22 = 45. Por tanto la cantidad que realmente se ha trasbordado a través del nodo 2 es 45 – 45 = 0. Es decir, no se ha trasbordado mercancía a través del nodo 2. x42 = 25. A través de 4 se ha trasbordado una cantidad de 45 – 25 = 20. x53 = 40. El trasbordo en el nodo 5 ha sido de 45 – 40 = 5. 3.1.6. Análisis de sensibilidad en una tabla de transportes. Para realizar el análisis de sensibilidad (o el análisis paramétrico) en el vector de costes se opera de forma análoga al método simplex: A un coste determinado se le da valor en función a un parámetro, se calculan los ui y los vj y se halla los intervalos en los que se cumple la condición de optimalidad. Para los casos restantes, el proceso es construir la tabla simplex asociada, y a través de ahí realizar el análisis de sensibilidad. Para construir la tabla simplex: En primer lugar debemos saber cuáles son las variables básicas. Estas variables básicas serán aquellas casillas que han tomado valor en la tabla de transporte. En el caso del ejemplo anterior: x11 x12 x13 x14 x15 x21 x22 x23 x24 x25 x14 x21 x22 x33 x42 x44 x45 x53 x55 15 de 25 … Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. El vector del lado derecho b será aquel formado por los valores de cada casilla básica. x11 x12 x13 x14 x15 x21 x22 x23 x24 x25 … x14 x21 x22 x33 x42 x44 x45 x53 x55 Las columnas de las variables básicas será tal que tendrá un 1 en la fila que coincida con ella misma y en el resto 0. El coeficiente del renglón z de esa columna es siempre 0. x14 x21 x22 x33 x42 x44 x45 x53 x55 10 45 20 15 25 15 5 40 5 x11 x12 x13 x14 x15 x21 x22 x23 x24 x25 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 … 10 45 20 15 25 15 5 40 5 Para las columnas de las variables no básicas, el coeficiente del renglón z es el que proporciona la tabla calculando los ui y los vj y obteniendo el elemento zij. En este caso, para la primera columna, z11=–5. Esta casilla, si tuviera valor, formaría un ciclo con el resto de las variables básicas. El ciclo sería el siguiente: 2 1 3 + 2 0 - 3 4 5 4 5 5 6 M 4 - -5 B 45 4 + M M M 0 - B 3 7 B M 10 10 M M M 12 65 20 5 B 15 15 M B 2 + 25 4 45 M 0 45 B 40 55 B 3 15 M B 5 6 25 B 5 10 45 45 Al poder establecerse un ciclo, la casilla x11 podría expresarse como combinación lineal del resto de las casillas del ciclo. Esto, traducido a la tabla simplex quiere decir que la columna x̂11 puede expresarse como combinación lineal de las columnas que forma el ciclo. En este caso, según los signos del ciclo: 16 de 25 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. ˆ11 − x ˆ14 + x ˆ44 − x ˆ42 + x ˆ22 − x ˆ21 = 0 x ˆ11 = x ˆ14 − x ˆ44 + x ˆ42 − x ˆ22 + x ˆ21 x Por tanto, la columna en la tabla simplex quedaría: x14 x21 x22 x33 x42 x44 x45 x53 x55 x11 x12 x13 x14 x15 x21 x22 x23 x24 x25 1 1 0 1 0 1 -1 0 0 0 0 0 1 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 -5 0 0 … 10 45 20 15 25 15 5 40 5 Repitiendo este proceso para el resto de las columnas, obtendríamos la tabla simplex asociada al problema de trasporte. Una vez completada esta tabla, se realiza el análisis de sensibilidad correspondiente. 3.2 Problemas de asignación. Los problemas de asignación son un caso particular de los problemas de trasporte. Un ejemplo clásico de problema de asignación es aquel en el que existen n máquinas y m tareas. Si n ≠ m se crean ficticios. Cada máquina ejecuta una única tarea y cada tarea se ejecuta en una única máquina. Los valores de los coeficientes y las variables en este tipo de problemas serán tal que: cij será el coste de ejecutar la tarea i en la máquina j. ⎧1 si i se ejecuta en j xij ⎨ ⎩0 en caso contrario El problema se formula de la siguiente forma: min ∑c ij xij i, j ∑x ij =1 ∀i ∑x ij =1 ∀j ⎧ ⎪ j ⎪ ⎪ s.a. ⎨ i ⎪x ⎪ ij ⎪x ⎩ ij ≥0 ∈ {0,1} La primera restricción modela la necesidad de que una tarea se ejecuta únicamente en una máquina. La segunda restricción hace referencia a que en una máquina sólo se ejecuta una tarea. La última restricción está implícita en el método de resolución. 17 de 25 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Dado que xij será 1 solo si es básica, y en caso contrario sería 0, no es necesario disponer el valor de las variables básicas en las casillas. De este modo, una tabla de asignación será una tabla de costos, en donde se enmarcarán las casillas básicas. Por ejemplo: 7 3 0 0 5 2 1 2 0 2 0 8 2 0 4 4 0 1 3 6 8 10 1 3 0 Propiedad: Si una tabla de asignación es tal que: a) cij ≥ 0 ∀i, j b) Se pueden elegir n ceros, uno en cada fila y columna Entonces una solución óptima del problema consiste en hacer básicas (a valor 1) a las casillas de las ceros elegidos. Para resolver una tabla de asignación se empleará el algoritmo húngaro de asignación: 1) Hacer ceros. a) Restar a cada fila su mínimo. b) Restar a cada columna su mínimo. 2) Encuadrar ceros. a) b) c) d) En la fila o columna con menor número de ceros libres, encuadrar uno. Tachar los ceros de la fila y columna del cero encuadrado. Repetir los dos pasos anteriores mientras queden ceros libres. Si se ha encuadrado un cero en cada fila y columna se tiene la asignación óptima. 3) Tachar ceros con menor número de líneas. a) b) c) d) e) Marcar las filas sin ceros encuadrados. Marcar las columnas con cero tachado en fila marcada. Marcar las filas con cero encuadrado en columna marcada. Repetir los dos pasos anteriores mientras se realicen nuevas marcas. Sobrerrayar las filas no marcadas y las columnas marcadas. 4) Mover ceros. a) b) c) d) Calcular el mínimo de los elementos no sobrerrayados. Restar dicho mínimo a los elementos no sobrerrayados. Sumar dicho número a los elementos sobrerrayados dos veces. Repetir desde el paso Encuadrar ceros. Ejemplo: Supongamos la siguiente tabla: 12 7 6 5 10 8 5 9 6 8 6 13 9 6 10 10 5 8 9 12 11 12 5 6 3 18 de 25 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Restamos a cada fila su mínimo: 7 2 1 0 5 3 0 4 1 3 0 7 3 0 4 5 0 3 4 7 8 9 2 3 0 Restamos seguidamente a cada columna su mínimo: 7 2 0 0 5 3 0 3 1 3 0 7 2 0 4 5 0 2 4 7 8 9 1 3 0 De esta forma hemos conseguido al menos un cero en cada fila y columnas. Pasamos a encuadrar ceros. Empezamos por filas. La fila 2 sólo tiene un cero, así que lo encuadramos y tachamos el resto de ceros que haya en la misma fila y columna que ese cero: 7 2 0 0 5 3 0 3 1 3 0 7 2 0 4 5 0 2 4 7 8 9 1 3 0 7 2 0 0 5 3 0 3 1 3 0 7 2 0 4 5 0 2 4 7 8 9 1 3 0 7 2 0 0 5 3 0 3 1 3 0 7 2 0 4 5 0 2 4 7 8 9 1 3 0 La fila 5 tiene un único cero: La columna 1 tiene un único cero: 19 de 25 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. La columna 3 tiene un único cero: 7 2 0 0 5 3 0 3 1 3 0 7 2 0 4 5 0 2 4 7 8 9 1 3 0 Como no tenemos un cero enmarcado en cada fila y columna (la fila 4 no tiene ceros enmarcados), pasamos al paso Tachar ceros con el menor número de líneas. Marcamos las filas sin ceros enmarcados: 7 2 0 0 5 3 0 3 1 3 0 7 2 0 4 5 0 2 4 7 8 9 1 3 0 x Marcamos las columnas con un cero tachado en la fila marcada: x 7 2 0 0 5 3 0 3 1 3 0 7 2 0 4 5 0 2 4 7 8 9 1 3 0 x Marcamos las filas con cero encuadrado en la columna marcada: x 7 2 0 0 5 3 0 3 1 3 0 7 2 0 4 5 0 2 4 7 8 9 1 3 0 20 de 25 x x Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Como ya no podemos seguir marcando filas y columnas, pasamos a sobrerrayar las filas no marcadas y las columnas marcadas: x 7 2 0 0 5 3 0 3 1 3 0 7 2 0 4 5 0 2 4 7 8 9 1 3 0 x x Calculamos el mínimo de los elementos no sobrerrayados. En este caso 1. El paso Mover ceros equivale a restar a las filas marcadas (las no sobrerrayadas) el mínimo valor, para así obtener nuevos ceros. Además, para que no aparezcan valores negativos (o se pierdan los ceros que ya tenemos) hay que sumar esa misma cantidad a las columnas marcadas (las sobrerrayadas). Realizando esta operación tendríamos: 7 3 0 0 5 2 0 2 0 2 0 8 2 0 2 4 0 1 3 6 8 10 1 3 0 7 3 0 0 5 2 0 2 0 2 0 8 2 0 2 4 0 1 3 6 8 10 1 3 0 Volvemos a encuadrar ceros: Que sí es solución del problema, ya que tenemos ceros encuadrados en cada fila y columna. Para calcular el valor de la función objetivo, hay que sumar los costes de las casillas básicas (las encuadradas) en la tabla original. En este caso: 12 7 6 5 10 8 5 9 6 8 6 13 9 6 10 10 5 8 9 12 11 12 5 6 3 Es decir, el valor de la función objetivo es z*=6+6+6+5+3=26. 21 de 25 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. 3.3 Problemas de Programación Lineal Entera. Definición: Un problema de programación lineal se dice de programación lineal entera si alguna o todas las variables están sujetas a la condición de tomar valores enteros. Esta condición es llamada condición de integridad. Un problema de programación lineal entera se dice puro si todas las variables deben tomar valores enteros y c, A y b son enteros. Cualquier otro problema de programación lineal entera se dice mixto. Definición: Dado un problema de programación lineal entera (PE), el problema que se obtiene de él eliminando las condiciones de integridad es su correspondiente problema relajado (PR). La región factible de un problema de programación lineal entera es la que resulta de la intersección de la región factible del problema relajado con las coordenadas enteras: Los métodos de resolución pueden ser muy complicados y largos desde el punto de vista operativo, por lo que se simplificará el problema por zonas. Las relaciones entre el problema entero (PE) y su relajado (PR) son: PE PR Infactible Infactible Ilimitado Ilimitado Solución Óptima Solución Óptima No Ilimitado Ejemplo del Algoritmo de ramificación y acotación. Tengamos el problema: max 2 x1 + x2 ⎧5x1 + 8 x2 ≤ 68 ⎪ ⎪ x1 − x2 ≤ 2 s.a. ⎨ ⎪ x2 ≤ 6 ⎪ x ≥ 0 Enteras ⎩ i → 22 de 25 ⎛ 6.46 ⎞ ⎟⎟ x * = ⎜⎜ ⎝ 4.46 ⎠ z * = 17,38 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. Representamos de forma genérica la región factible de este problema, así como su punto óptimo: x2 5 4 x1 Podemos afirmar que en el intervalo abierto (4,5) no vamos a encontrar soluciones enteras para x2. Por tanto dividiremos la región factible en dos: x2 x2 5 5 4 4 x1 x1 Para poder resolverse es necesario dividir el problema en dos, uno para cada área resultante. En realidad, lo que hemos hecho es añadir una nueva restricción ya que el área inferior sería la resultante de añadir la condición x2 ≤ 4 y la superior la de añadir la condición x2 ≥ 5 . Expresamos estos problemas en forma de árbol: 23 de 25 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. A partir de la rama PR21, cualquier solución entera que se hallara, sería peor que la solución PR1, ya que el valor de la función objetivo de PR21 es menor que la de PR1 y al añadir restricciones a PR21 obtendremos valores objetivos o iguales o peores a PR21, pero nunca mejores. Por tanto marcamos ese nodo como terminal y no seguimos profundizando en la rama PR21. ⎛6 ⎞ Por tanto la solución del problema es: x * = ⎜⎜ ⎟⎟ ⎝ 4⎠ Algoritmo: z * = 16 Paso 0: – Resolver el problema relajado. – Si la solución verifica la condición de integridad, problema resuelto. – En caso contrario se construye el primer nodo del árbol a partir de la solución obtenida. – Se ramifica construyendo los dos problemas. Paso 1: – Resolver alguno de los problemas asociados a nodos no terminales. – Si la solución obtenida verifica la condición de integridad y es mejor que todas las anteriores, marcarla como mejor solución. Paso 2: – Marcar los nodos terminales y ramificar a partir de los nodos no terminales. – Volver a Paso 1. Un nodo es terminal cuando: La solución verifica la condición de integridad. El problema resultante es infactible. El valor objetivo asociado a ese nodo es peor que la mejor solución ya encontrada. Ejemplo: max 2 x1 + 3x2 + 8 x3 ⎧2 x1 − 4x2 + 6 x3 ≤ 9 ⎪ ⎪⎪ x + 1 x + 3x ≤ 5 3 s.a. ⎨ 1 2 2 ⎪x ≥ 0 ⎪ i ⎪⎩ x i ∈ Z Existen dos estrategias a la hora de completar cualquier árbol. Una de ellas es completarlo por niveles, de forma que no se avanza al nivel siguiente hasta que no se ha completado el nivel actual. La segunda estrategia es completar por profundidad, de forma que no se cambia de rama hasta que no se ha llegado hasta un nodo terminal. La estrategia de profundidad suele requerir menos evaluaciones, ya que se puede encontrar relativamente pronto una solución entera de forma que cualquier rama con valor objetivo menor puede ser desechada. No obstante, este problema lo resolveremos por niveles. 24 de 25 Serafín Rondán. Investigación Operativa. Tema 3. Programación Lineal Entera. El árbol desarrollado sería: Si en vez de exigir que las variables fueran enteras, se exigieran que fueran múltiplos de, por ejemplo 3, lo único que habría que cambiar es la forma en la que se dividen las regiones, ya que los límites de acotación (la nueva restricción añadida) en cada rama deberían ser múltiplos de 3. 25 de 25