En optimización matemática , el algoritmo simplex de Dantzig (o método simplex ) es un algoritmo popular para la programación lineal . [1]
El nombre del algoritmo se deriva del concepto de símplex y fue sugerido por TS Motzkin . [2] En realidad, no se utilizan símplices en el método, pero una interpretación del mismo es que opera sobre conos simpliciales , y estos se convierten en símplices propios con una restricción adicional. [3] [4] [5] [6] Los conos simpliciales en cuestión son las esquinas (es decir, las vecindades de los vértices) de un objeto geométrico llamado politopo . La forma de este politopo está definida por las restricciones aplicadas a la función objetivo.
George Dantzig trabajó en métodos de planificación para la Fuerza Aérea del Ejército de los EE. UU. durante la Segunda Guerra Mundial utilizando una calculadora de escritorio . Durante 1946, su colega lo desafió a mecanizar el proceso de planificación para distraerlo de aceptar otro trabajo. Dantzig formuló el problema como desigualdades lineales inspiradas en el trabajo de Wassily Leontief , sin embargo, en ese momento no incluyó un objetivo como parte de su formulación. Sin un objetivo, una gran cantidad de soluciones pueden ser factibles y, por lo tanto, para encontrar la "mejor" solución factible, se deben utilizar "reglas básicas" especificadas por los militares que describan cómo se pueden lograr los objetivos en lugar de especificar un objetivo en sí. La idea central de Dantzig fue darse cuenta de que la mayoría de estas reglas básicas se pueden traducir en una función objetivo lineal que debe maximizarse. [7] El desarrollo del método símplex fue evolutivo y se produjo durante un período de aproximadamente un año. [8]
Después de que Dantzig incluyera una función objetivo como parte de su formulación a mediados de 1947, el problema se volvió matemáticamente más manejable. Dantzig se dio cuenta de que uno de los problemas sin resolver que había tomado por error como tarea en la clase de su profesor Jerzy Neyman (y que en realidad resolvió más tarde), era aplicable para encontrar un algoritmo para programas lineales. Este problema implicaba encontrar la existencia de multiplicadores de Lagrange para programas lineales generales sobre un continuo de variables, cada una acotada entre cero y uno, y que satisfacían restricciones lineales expresadas en forma de integrales de Lebesgue . Dantzig publicó más tarde su "tarea" como tesis para obtener su doctorado. La geometría de columnas utilizada en esta tesis le dio a Dantzig una idea que le hizo creer que el método Simplex sería muy eficiente. [9]
El algoritmo simplex opera en programas lineales en forma canónica
con los coeficientes de la función objetivo, es la matriz transpuesta , y son las variables del problema, es una matriz p × n , y . Existe un proceso sencillo para convertir cualquier programa lineal en uno en forma estándar, por lo que el uso de esta forma de programas lineales no produce pérdida de generalidad.
En términos geométricos, la región factible definida por todos los valores de tales que y es un politopo convexo (posiblemente ilimitado) . Un punto extremo o vértice de este politopo se conoce como solución factible básica (SBF).
Se puede demostrar que para un programa lineal en forma estándar, si la función objetivo tiene un valor máximo en la región factible, entonces tiene este valor en (al menos) uno de los puntos extremos. [10] Esto en sí mismo reduce el problema a un cálculo finito ya que hay un número finito de puntos extremos, pero el número de puntos extremos es inmanejablemente grande para todos, excepto los programas lineales más pequeños. [11]
También se puede demostrar que, si un punto extremo no es un punto máximo de la función objetivo, entonces hay una arista que contiene el punto de modo que el valor de la función objetivo es estrictamente creciente en la arista que se aleja del punto. [12] Si la arista es finita, entonces la arista se conecta a otro punto extremo donde la función objetivo tiene un valor mayor, de lo contrario la función objetivo no está acotada por encima de la arista y el programa lineal no tiene solución. El algoritmo simplex aplica esta idea caminando a lo largo de las aristas del politopo hasta puntos extremos con valores objetivos cada vez mayores. Esto continúa hasta que se alcanza el valor máximo, o se visita una arista no acotada (concluyendo que el problema no tiene solución). El algoritmo siempre termina porque el número de vértices en el politopo es finito; además, dado que saltamos entre vértices siempre en la misma dirección (la de la función objetivo), esperamos que el número de vértices visitados sea pequeño. [12]
La solución de un programa lineal se logra en dos pasos. En el primer paso, conocido como Fase I, se encuentra un punto extremo inicial. Dependiendo de la naturaleza del programa esto puede ser trivial, pero en general se puede resolver aplicando el algoritmo símplex a una versión modificada del programa original. Los posibles resultados de la Fase I son que se encuentre una solución factible básica o que la región factible esté vacía. En este último caso el programa lineal se llama inviable . En el segundo paso, Fase II, se aplica el algoritmo símplex utilizando la solución factible básica encontrada en la Fase I como punto de partida. Los posibles resultados de la Fase II son una solución factible básica óptima o una arista infinita en la que la función objetivo no está acotada por encima. [13] [14] [15]
La transformación de un programa lineal a uno en forma estándar se puede realizar de la siguiente manera. [16] Primero, para cada variable con un límite inferior distinto de 0, se introduce una nueva variable que representa la diferencia entre la variable y el límite. La variable original se puede eliminar luego por sustitución. Por ejemplo, dada la restricción
Se introduce una nueva variable, , con
La segunda ecuación puede utilizarse para eliminar del programa lineal todas las restricciones de límite inferior que puedan cambiarse por restricciones de no negatividad.
En segundo lugar, para cada restricción de desigualdad restante, se introduce una nueva variable, llamada variable de holgura , para cambiar la restricción a una restricción de igualdad. Esta variable representa la diferencia entre los dos lados de la desigualdad y se supone que no es negativa. Por ejemplo, las desigualdades
son reemplazados por
Es mucho más fácil realizar manipulaciones algebraicas en desigualdades en esta forma. En desigualdades donde ≥ aparece como la segunda, algunos autores se refieren a la variable introducida comoexcedente variable
En tercer lugar, se elimina cada variable no restringida del programa lineal. Esto se puede hacer de dos maneras: una es despejando la variable en una de las ecuaciones en las que aparece y luego eliminando la variable por sustitución. La otra es reemplazar la variable con la diferencia de dos variables restringidas. Por ejemplo, si no tiene restricciones, entonces se escribe
La ecuación puede usarse para eliminar del programa lineal.
Cuando este proceso se complete, la región factible tendrá la forma
También es útil suponer que el rango de es el número de filas. Esto no produce ninguna pérdida de generalidad, ya que de lo contrario, el sistema tiene ecuaciones redundantes que se pueden descartar o el sistema es inconsistente y el programa lineal no tiene solución. [17]
Un programa lineal en forma estándar se puede representar como una tabla de la forma
La primera fila define la función objetivo y las filas restantes especifican las restricciones. El cero en la primera columna representa el vector cero de la misma dimensión que el vector (diferentes autores usan diferentes convenciones en cuanto al diseño exacto). Si las columnas de se pueden reorganizar de modo que contengan la matriz identidad de orden (el número de filas en ), entonces se dice que la tabla está en forma canónica . [18] Las variables correspondientes a las columnas de la matriz identidad se denominan variables básicas, mientras que las variables restantes se denominan variables no básicas o libres . Si los valores de las variables no básicas se establecen en 0, entonces los valores de las variables básicas se obtienen fácilmente como entradas en y esta solución es una solución factible básica. La interpretación algebraica aquí es que los coeficientes de la ecuación lineal representada por cada fila son , , o algún otro número. Cada fila tendrá una columna con valor , columnas con coeficientes y las columnas restantes con algunos otros coeficientes (estas otras variables representan nuestras variables no básicas). Al establecer los valores de las variables no básicas en cero, garantizamos en cada fila que el valor de la variable representada por a en su columna sea igual al valor en esa fila.
Por el contrario, dada una solución factible básica, las columnas correspondientes a las variables distintas de cero se pueden expandir a una matriz no singular. Si la tabla correspondiente se multiplica por la inversa de esta matriz, el resultado es una tabla en forma canónica. [19]
Dejar
sea una tabla en forma canónica. Se pueden aplicar transformaciones adicionales de adición de filas para eliminar los coeficientes cT.B.
de la función objetivo. Este proceso se denomina determinación de precios y da como resultado una tabla canónica
donde z B es el valor de la función objetivo en la solución factible básica correspondiente. Los coeficientes actualizados, también conocidos como coeficientes de costo relativo , son las tasas de cambio de la función objetivo con respecto a las variables no básicas. [14]
La operación geométrica de pasar de una solución factible básica a una solución factible básica adyacente se implementa como una operación pivote . Primero, se selecciona un elemento pivote distinto de cero en una columna no básica. La fila que contiene este elemento se multiplica por su recíproco para cambiar este elemento a 1, y luego se suman múltiplos de la fila a las otras filas para cambiar las otras entradas en la columna a 0. El resultado es que, si el elemento pivote está en una fila r , entonces la columna se convierte en la r -ésima columna de la matriz identidad. La variable para esta columna es ahora una variable básica, que reemplaza a la variable que correspondía a la r -ésima columna de la matriz identidad antes de la operación. En efecto, la variable correspondiente a la columna pivote entra en el conjunto de variables básicas y se llama variable entrante , y la variable que se reemplaza sale del conjunto de variables básicas y se llama variable saliente . La tabla todavía está en forma canónica pero con el conjunto de variables básicas cambiado por un elemento. [13] [14]
Sea un programa lineal dado por una tabla canónica. El algoritmo símplex procede realizando operaciones pivote sucesivas, cada una de las cuales da una solución factible básica mejorada; la elección del elemento pivote en cada paso está determinada en gran medida por el requisito de que este pivote mejore la solución.
Dado que la variable de entrada, en general, aumentará de 0 a un número positivo, el valor de la función objetivo disminuirá si la derivada de la función objetivo con respecto a esta variable es negativa. De manera equivalente, el valor de la función objetivo aumenta si se selecciona la columna pivote de modo que la entrada correspondiente en la fila objetivo de la tabla sea positiva.
Si hay más de una columna, de modo que la entrada en la fila objetivo es positiva, entonces la elección de cuál agregar al conjunto de variables básicas es algo arbitraria y se han desarrollado varias reglas de elección de variables de entrada [20], como el algoritmo Devex [21] .
Si todas las entradas en la fila objetivo son menores o iguales a 0, entonces no se puede elegir la variable de entrada y la solución es, de hecho, óptima. Se ve fácilmente que es óptima ya que la fila objetivo ahora corresponde a una ecuación de la forma
Al cambiar la regla de elección de la variable entrante para que seleccione una columna donde la entrada en la fila objetivo sea negativa, se cambia el algoritmo para que encuentre el mínimo de la función objetivo en lugar del máximo.
Una vez que se ha seleccionado la columna pivote, la elección de la fila pivote está determinada en gran medida por el requisito de que la solución resultante sea factible. En primer lugar, solo se consideran las entradas positivas en la columna pivote, ya que esto garantiza que el valor de la variable entrante no será negativo. Si no hay entradas positivas en la columna pivote, entonces la variable entrante puede tomar cualquier valor no negativo y la solución seguirá siendo factible. En este caso, la función objetivo no está acotada por debajo y no hay un mínimo.
A continuación, se debe seleccionar la fila pivote de modo que todas las demás variables básicas permanezcan positivas. Un cálculo muestra que esto ocurre cuando el valor resultante de la variable entrante es mínimo. En otras palabras, si la columna pivote es c , entonces se elige la fila pivote r de modo que
es el mínimo sobre todo r de modo que a rc > 0. Esto se llama prueba de razón mínima . [20] Si hay más de una fila para la que se alcanza el mínimo, se puede utilizar una regla de elección de variable eliminada [22] para realizar la determinación.
Consideremos el programa lineal
Con la adición de las variables de holgura s y t , esto se representa mediante la tabla canónica
donde las columnas 5 y 6 representan las variables básicas s y t y la solución factible básica correspondiente es
Las columnas 2, 3 y 4 se pueden seleccionar como columnas pivote; en este ejemplo, se selecciona la columna 4. Los valores de z resultantes de la elección de las filas 2 y 3 como filas pivote son 10/1 = 10 y 15/3 = 5 respectivamente. De estos, el mínimo es 5, por lo que la fila 3 debe ser la fila pivote. Al realizar el pivote se obtiene
Ahora las columnas 4 y 5 representan las variables básicas z y s y la solución factible básica correspondiente es
Para el siguiente paso, no hay entradas positivas en la fila de objetivos y, de hecho,
Por lo tanto, el valor mínimo de Z es −20.
En general, un programa lineal no se dará en la forma canónica y se debe encontrar una tabla canónica equivalente antes de que pueda comenzar el algoritmo simplex. Esto se puede lograr mediante la introducción de variables artificiales . Las columnas de la matriz identidad se agregan como vectores columna para estas variables. Si el valor b para una ecuación de restricción es negativo, la ecuación se niega antes de agregar las columnas de la matriz identidad. Esto no cambia el conjunto de soluciones factibles o la solución óptima, y garantiza que las variables de holgura constituirán una solución factible inicial. La nueva tabla está en forma canónica pero no es equivalente al problema original. Por lo tanto, se introduce una nueva función objetivo, igual a la suma de las variables artificiales, y se aplica el algoritmo simplex para encontrar el mínimo; el programa lineal modificado se llama problema de la Fase I. [23]
El algoritmo simplex aplicado al problema de la Fase I debe terminar con un valor mínimo para la nueva función objetivo ya que, al ser la suma de variables no negativas, su valor está acotado por debajo de 0. Si el mínimo es 0, entonces las variables artificiales pueden eliminarse de la tabla canónica resultante produciendo una tabla canónica equivalente al problema original. El algoritmo simplex puede entonces aplicarse para encontrar la solución; este paso se llama Fase II . Si el mínimo es positivo, entonces no hay solución factible para el problema de la Fase I donde las variables artificiales son todas cero. Esto implica que la región factible para el problema original está vacía, y por lo tanto el problema original no tiene solución. [13] [14] [24]
Consideremos el programa lineal
Esto está representado por la tabla (no canónica)
Introduzca las variables artificiales u y v y la función objetivo W = u + v , dando como resultado una nueva tabla
La ecuación que define la función objetivo original se mantiene en previsión de la Fase II.
Por construcción, u y v son ambas variables básicas ya que forman parte de la matriz de identidad inicial. Sin embargo, la función objetivo W actualmente supone que u y v son ambas 0. Para ajustar la función objetivo para que sea el valor correcto donde u = 10 y v = 15, agregue la tercera y cuarta filas a la primera fila dando
Seleccione la columna 5 como columna pivote, de modo que la fila pivote debe ser la fila 4 y la tabla actualizada sea
Ahora seleccione la columna 3 como columna pivote, para lo cual la fila 3 debe ser la fila pivote, para obtener
Las variables artificiales ahora son 0 y pueden eliminarse, obteniendo una tabla canónica equivalente al problema original:
Esto, fortuitamente, ya es óptimo y el valor óptimo para el programa lineal original es −130/7.
La forma de tabla utilizada anteriormente para describir el algoritmo se presta a una implementación inmediata en la que la tabla se mantiene como una matriz rectangular ( m + 1) por ( m + n + 1). Es sencillo evitar el almacenamiento de las m columnas explícitas de la matriz de identidad que aparecerán dentro de la tabla en virtud de que B es un subconjunto de las columnas de [ A , I ]. Esta implementación se conoce como el " algoritmo simplex estándar ". La sobrecarga de almacenamiento y cálculo es tal que el método simplex estándar es un enfoque prohibitivamente costoso para resolver grandes problemas de programación lineal.
En cada iteración simplex, los únicos datos requeridos son la primera fila de la tabla, la columna (pivotal) de la tabla correspondiente a la variable entrante y el lado derecho. Este último se puede actualizar utilizando la columna pivotal y la primera fila de la tabla se puede actualizar utilizando la fila (pivotal) correspondiente a la variable saliente. Tanto la columna pivotal como la fila pivotal se pueden calcular directamente utilizando las soluciones de sistemas lineales de ecuaciones que involucran la matriz B y un producto matriz-vector utilizando A . Estas observaciones motivan el " algoritmo simplex revisado ", para el cual las implementaciones se distinguen por su representación invertible de B . [25]
En los grandes problemas de programación lineal, A es típicamente una matriz dispersa y, cuando se aprovecha la dispersión resultante de B al mantener su representación invertible, el algoritmo símplex revisado es mucho más eficiente que el método símplex estándar. Los solucionadores símplex comerciales se basan en el algoritmo símplex revisado. [24] [25] [26] [27] [28]
Si los valores de todas las variables básicas son estrictamente positivos, entonces un pivote debe resultar en una mejora en el valor objetivo. Cuando este es siempre el caso, ningún conjunto de variables básicas ocurre dos veces y el algoritmo símplex debe terminar después de un número finito de pasos. Las soluciones factibles básicas donde al menos una de las variables básicas es cero se denominan degeneradas y pueden dar lugar a pivotes para los que no hay una mejora en el valor objetivo. En este caso, no hay un cambio real en la solución, sino solo un cambio en el conjunto de variables básicas. Cuando varios de estos pivotes ocurren en sucesión, no hay ninguna mejora; en grandes aplicaciones industriales, la degeneración es común y este " estancamiento " es notable. Peor que el estancamiento es la posibilidad de que el mismo conjunto de variables básicas ocurra dos veces, en cuyo caso, las reglas de pivote deterministas del algoritmo símplex producirán un bucle infinito o "ciclo". Si bien la degeneración es la regla en la práctica y el estancamiento es común, el ciclo es poco común en la práctica. En Padberg se presenta una discusión de un ejemplo de ciclo práctico . [24] La regla de Bland impide el ciclo y, por lo tanto, garantiza que el algoritmo simplex siempre termine. [24] [29] [30] Otro algoritmo pivotante, el algoritmo criss-cross nunca realiza ciclos en programas lineales. [31]
Las reglas de pivote basadas en la historia, como la regla de Zadeh y la regla de Cunningham, también intentan evitar el problema del estancamiento y el ciclo al realizar un seguimiento de la frecuencia con la que se utilizan determinadas variables y luego favorecer las variables que se han utilizado con menor frecuencia.
El método simplex es notablemente eficiente en la práctica y fue una gran mejora con respecto a métodos anteriores como la eliminación de Fourier-Motzkin . Sin embargo, en 1972, Klee y Minty [32] dieron un ejemplo, el cubo de Klee-Minty , que mostraba que la complejidad del peor caso del método simplex tal como lo formuló Dantzig es el tiempo exponencial . Desde entonces, para casi todas las variaciones del método, se ha demostrado que existe una familia de programas lineales para los que funciona mal. Es una pregunta abierta si existe una variación con el tiempo polinomial , aunque se conocen reglas de pivote subexponenciales. [33]
En 2014, se demostró [ cita requerida ] que una variante particular del método simplex es NP-poderosa, es decir, se puede utilizar para resolver, con sobrecarga polinómica, cualquier problema en NP implícitamente durante la ejecución del algoritmo. Además, decidir si una variable dada alguna vez entra en la base durante la ejecución del algoritmo en una entrada dada, y determinar el número de iteraciones necesarias para resolver un problema dado, son ambos problemas NP-difíciles . [34] Casi al mismo tiempo se demostró que existe una regla pivote artificial para la cual el cálculo de su salida es PSPACE-completo . [35] En 2015, esto se fortaleció para mostrar que el cálculo de la salida de la regla pivote de Dantzig es PSPACE-completo . [36]
El análisis y la cuantificación de la observación de que el algoritmo simplex es eficiente en la práctica a pesar de su complejidad exponencial en el peor de los casos ha llevado al desarrollo de otras medidas de complejidad. El algoritmo simplex tiene una complejidad de caso promedio en tiempo polinomial bajo varias distribuciones de probabilidad , y el desempeño promedio preciso del algoritmo simplex depende de la elección de una distribución de probabilidad para las matrices aleatorias . [37] [38] Otro enfoque para estudiar los " fenómenos típicos " utiliza la teoría de categorías de Baire a partir de la topología general y muestra que (topológicamente) "la mayoría" de las matrices se pueden resolver mediante el algoritmo simplex en un número polinomial de pasos. [ cita requerida ]
Otro método para analizar el desempeño del algoritmo simplex estudia el comportamiento de los peores escenarios bajo pequeñas perturbaciones: ¿son los peores escenarios estables bajo un pequeño cambio (en el sentido de estabilidad estructural ), o se vuelven manejables? Esta área de investigación, llamada análisis suavizado , se introdujo específicamente para estudiar el método simplex. De hecho, el tiempo de ejecución del método simplex en la entrada con ruido es polinomial en el número de variables y la magnitud de las perturbaciones. [39] [40]
Otros algoritmos para resolver problemas de programación lineal se describen en el artículo de programación lineal . Otro algoritmo de pivote de intercambio de base es el algoritmo criss-cross . [41] [42] Existen algoritmos de tiempo polinomial para programación lineal que utilizan métodos de puntos interiores: estos incluyen el algoritmo elipsoidal de Khachiyan , el algoritmo proyectivo de Karmarkar y los algoritmos de seguimiento de trayectorias . [15] El método Big-M es una estrategia alternativa para resolver un programa lineal, utilizando un símplex monofásico.
La programación lineal-fraccional (LFP) es una generalización de la programación lineal (PL). En la PL, la función objetivo es una función lineal , mientras que la función objetivo de un programa lineal-fraccional es un cociente de dos funciones lineales. En otras palabras, un programa lineal es un programa lineal-fraccional en el que el denominador es la función constante que tiene el valor uno en todas partes. Un programa lineal-fraccional se puede resolver mediante una variante del algoritmo simplex [43] [44] [45] [46] o mediante el algoritmo criss-cross [47] .
Estas introducciones están escritas para estudiantes de informática e investigación de operaciones :