# Programación lineal

La programación lineal (LP, también conocida como optimización lineal) es el campo de la programación matemática dedicado a maximizar o minimizar (optimizar) una función lineal, denominada función objetivo, de tal forma que las variables de dicha función estén sujetas a una serie de restricciones expresadas mediante un sistema de ecuaciones o inecuaciones también lineales. El método tradicionalmente usado para resolver problemas de programación lineal es el Método Simplex.
Los programas lineales son problemas que pueden ser expresados en su forma canónica como
    ${\begin{array}{ll}{\text{Encontrar un vector }}&{\mathbf {x}}\\{\text{que maximice }}&{\mathbf {c}}^{T}{\mathbf {x}}\\{\text{sujeto a}}&A{\mathbf {x}}\leq {\mathbf {b}}\\{\text{y}}&{\mathbf {x}}\geq {\mathbf {0}}\end{array}}$
donde ${\mathbf {x}}$ es el vector de variables que se desea determinar, ${\mathbf {c}}$ y ${\mathbf {b}}$ son vectores dados (con ${\mathbf {c}}^{T}$ indicando que los coeficientes de ${\mathbf {c}}$ son usados como una matriz de un solo renglón para que el producto matricial esté definido) y $A$ es una matriz dada. La función cuyo valor se va a maximizar o minimizar (en este caso ${\mathbf {x}}\mapsto {\mathbf {c}}^{T}{\mathbf {x}}$) es llamada función objetivo. Las desigualdades $A{\mathbf {x}}\leq {\mathbf {b}}$ y ${\mathbf {x}}\geq {\mathbf {0}}$ son las restricciones y forman la región factible o también conocida como región de factibilidad.

## Historia

Cronología :
| Año | Acontecimiento |
| 1826 | Joseph Fourier anticipa la programación lineal. Carl Friedrich Gauss resuelve ecuaciones lineales por eliminación "gaussiana". |
| 1902 | Gyula Farkas concibe un método para resolver sistemas de inecuaciones. |
| 1947 | George Dantzig publica el algoritmo simplex y John von Neumann desarrolló la teoría de la dualidad. Se sabe que Leonid Kantoróvich también formuló la teoría en forma independiente. |
| 1984 | Narendra Karmarkar introduce el método del punto interior para resolver problemas de programación lineal. |
El problema de la resolución de un sistema lineal de inecuaciones se remonta, al menos, a Joseph Fourier, después de quien nace el método de eliminación de Fourier-Motzkin. La programación lineal se plantea como un modelo matemático desarrollado durante la Segunda Guerra Mundial para planificar los gastos y los retornos, a fin de reducir los costos al ejército y aumentar las pérdidas del enemigo. Se mantuvo en secreto hasta 1947. En la posguerra, muchas industrias lo usaron en su planificación diaria.
Los fundadores de la técnica son George Dantzig, quien publicó el algoritmo simplex, en 1947, John von Neumann, que desarrolló la teoría de la dualidad en el mismo año, y Leonid Kantoróvich, un matemático de origen ruso, que utiliza técnicas similares en la economía antes de Dantzig y ganó el premio Nobel en economía en 1975. En 1979, otro matemático ruso, Leonid Khachiyan, diseñó el llamado Algoritmo del elipsoide, a través del cual demostró que el problema de la programación lineal es resoluble de manera eficiente, es decir, en tiempo polinomial. Más tarde, en 1984, Narendra Karmarkar, un matemático de origen indio, introduce un nuevo método del punto interior para resolver problemas de programación lineal, lo que constituiría un enorme avance en los principios teóricos y prácticos en el área.
El ejemplo original de Dantzig de la búsqueda de la mejor asignación de 70 personas a 70 puestos de trabajo es un ejemplo de la utilidad de la programación lineal. La potencia de computación necesaria para examinar todas las permutaciones a fin de seleccionar la mejor asignación es inmensa (factorial de 70, 70!) ; el número de posibles configuraciones excede al número de partículas en el universo. Sin embargo, toma sólo un momento encontrar la solución óptima mediante el planteamiento del problema como una programación lineal y la aplicación del algoritmo simplex. La teoría de la programación lineal reduce drásticamente el número de posibles soluciones factibles que deben ser revisadas.

## Forma estándar

La forma más usual e intuitiva de describir un problema de programación lineal es en su forma estándar, el cual consiste de tres partes:
* Una función lineal que se desea maximizar, por ejemplo
       $f(x,y)=c_{1}x+c_{2}y$
* Restricciones lineales de la forma:
       ${\begin{aligned}a_{11}x_{1}+a_{12}x_{2}&\leq b_{1}\\a_{21}x_{1}+a_{22}x_{2}&\leq b_{2}\\a_{31}x_{1}+a_{32}x_{2}&\leq b_{3}\end{aligned}}$
* Variables no negativas, por ejemplo
       ${\begin{aligned}x_{1}&\geq 0\\x_{2}&\geq 0\end{aligned}}$
El problema es usualmente representado en forma matricial como
    $\max\{{\mathbf {c}}^{T}{\mathbf {x}}:{\mathbf {x}}\in \mathbb {R} ^{n}\land A{\mathbf {x}}\leq {\mathbf {b}}\land {\mathbf {x}}\geq {\mathbf {0}}\}$
que también puede ser escrito como
    ${\begin{array}{rcc}\max :&&{\mathbf {c}}^{T}{\mathbf {x}}\\s.a:&&A{\mathbf {x}}\leq {\mathbf {b}}\\&&{\mathbf {x}}\geq {\mathbf {0}}\end{array}}$
o simplemente como
    $\left\{{\begin{array}{rcc}{\text{Maximizar}}&&{\mathbf {c}}^{T}{\mathbf {x}}\\{\text{Sujeto a}}&&A{\mathbf {x}}\leq {\mathbf {b}}\\&&{\mathbf {x}}\geq {\mathbf {0}}\end{array}}\right.$
Otras formas, como problemas de minimización, problemas con restricciones de otra forma, así como problemas que involucran variables negativas pueden se escritos mediante un problema equivalente en su forma estándar.

### Variables

El vector ${\mathbf {x}}\in \mathbb {R} ^{n}$ tiene como entradas a las variables $x_{i}$ ($i=1,2,\dots ,n$) y estas son llamadas variables de decisión; para la forma estándar de un modelo de programación lineal, estas son números reales mayores o iguales a cero, es decir, $x_{i}\geq 0$.
En caso de que se requiera que el valor resultante de las variables sea un número entero entonces se trata de un problema de Programación Entera y cuando se requiera que el valor resultante de las variables solo tome dos valores, por ejemplo, $0$ o $1$, entonces se trata de un problema de Programación Binaria

## Forma aumentada (variables de holgura)

Los problemas de programación lineal en su forma estándar pueden ser convertidos a su forma aumentada para aplicar el algoritmo símplex. Esta forma introduce variables no negativas llamadas variables de holgura para así reemplazar en las restricciones las desigualdades en igualdades. Los problemas pueden ser escritos en la siguiente forma matricial:
    ${\begin{array}{cl}\max &z\\s.a:&{\begin{pmatrix}1&-{\mathbf {c}}^{T}&0\\0&{\mathbf {A}}&{\mathbf {I}}\end{pmatrix}}{\begin{pmatrix}z\\{\mathbf {x}}\\{\mathbf {s}}\end{pmatrix}}={\begin{pmatrix}0\\{\mathbf {b}}\end{pmatrix}}\\&{\mathbf {x}},{\mathbf {s}}\geq {\mathbf {0}}\end{array}}$
donde ${\mathbf {s}}$ son las variables de holgura, ${\mathbf {x}}$ son las variables de decisión y $z$ es la variable a maximizar.

## Forma no estándar

La forma estándar de un modelo de programación lineal es cuando se tiene el modelo
${\begin{array}{rcc}\max :&&{\mathbf {c}}^{T}{\mathbf {x}}\\s.a:&&A{\mathbf {x}}\leq {\mathbf {b}}\\&&{\mathbf {x}}\geq 0\end{array}}$
como formas no estándar, se tienen los siguientes casos
* Cuando se desee minimizar la función objetivo.
       ${\begin{array}{rcc}\min :&&{\mathbf {c}}^{T}{\mathbf {x}}\\s.a:&&A{\mathbf {x}}\leq {\mathbf {b}}\\&&{\mathbf {x}}\geq {\mathbf {0}}\end{array}}$
* Cuando las restricciones son de la forma:
       ${\begin{array}{rcc}\max :&&{\mathbf {c}}^{T}{\mathbf {x}}\\s.a:&&A{\mathbf {x}}\geq {\mathbf {b}}\\&&{\mathbf {x}}\geq {\mathbf {0}}\end{array}}$
    o
       ${\begin{array}{rcc}\max :&&{\mathbf {c}}^{T}{\mathbf {x}}\\s.a:&&A{\mathbf {x}}={\mathbf {b}}\\&&{\mathbf {x}}\geq {\mathbf {0}}\end{array}}$
* Cuando las variables son negativas o pueden tomar cualquier valor.
       ${\begin{array}{rcc}\max :&&{\mathbf {c}}^{T}{\mathbf {x}}\\s.a:&&A{\mathbf {x}}\leq {\mathbf {b}}\\&&{\mathbf {x}}<{\mathbf {0}}\end{array}}$
    o
       ${\begin{array}{rcc}\max :&&{\mathbf {c}}^{T}{\mathbf {x}}\\s.a:&&A{\mathbf {x}}\leq {\mathbf {b}}\end{array}}$
* Combinaciones de los tres casos anteriores.

## Teoría
### Existencia de soluciones óptimas

Geométricamente, las restricciones lineales definen la región factible, que es un poliedro convexo. Una función lineal es una función convexa, por lo que un mínimo local es un mínimo global; una función lineal es también una función cóncava, así que todo máximo local es también un máximo global.
Como las funciones lineales no son ni estrictamente convexas ni estrictamente cóncavas, las soluciones óptimas no son necesariamente únicas.
Si la región factible es acotada y no vacía, entonces existirá al menos una solución óptima, puesto que una función lineal es continua y por lo tanto alcanza un máximo en cualquier región cerrada y acotada. Sin embargo, puede no existir una solución óptima en dos situaciones. En primer lugar, si la región factible es vacía, es decir, si ningún punto verifica todas las restricciones, entonces el problema es no factible. En segundo lugar, si la región factible no está acotada en la dirección del gradiente de la función objetivo, el problema es no acotado, y se pueden encontrar puntos que verifican todas las restricciones y con un valor tan alto como queramos de la función objetivo.

## Programación entera

En algunos casos se requiere que la solución óptima se componga de valores enteros para algunas de las variables. La resolución de este problema se obtiene analizando las posibles alternativas de valores enteros de esas variables en un entorno alrededor de la solución obtenida considerando las variables reales. Muchas veces la solución del programa lineal truncado está lejos de ser el óptimo entero, por lo que se hace necesario usar algún algoritmo para hallar esta solución de forma exacta. El más famoso es el método de 'Ramificar y Acotar' o Branch and Bound por su nombre en inglés. El método de Ramificar y Acotar parte de la adición de nuevas restricciones para cada variable de decisión (acotar) que al ser evaluado independientemente (ramificar) lleva al óptimo entero.

## Aplicaciones

La programación lineal constituye un importante campo de la optimización por varias razones, muchos problemas prácticos de la investigación de operaciones pueden plantearse como problemas de programación lineal. Algunos casos especiales de programación lineal, tales como los problemas de flujo de redes y problemas de flujo de mercancías se consideraron en el desarrollo de las matemáticas lo suficientemente importantes como para generar por sí mismos mucha investigación sobre algoritmos especializados en su solución. Una serie de algoritmos diseñados para resolver otros tipos de problemas de optimización constituyen casos particulares de la más amplia técnica de la programación lineal. Históricamente, las ideas de programación lineal han inspirado muchos de los conceptos centrales de la teoría de optimización tales como la dualidad, la descomposición y la importancia de la convexidad y sus generalizaciones. Del mismo modo, la programación lineal es muy usada en la microeconomía, la ingeniería y la administración de empresas, ya sea para aumentar al máximo los ingresos o reducir al mínimo los costos de un sistema de producción. El aprendizaje de la metodología programación lineal es importante en la formación del ingeniero industrial y el administrador porque le da herramientas para mejorar la toma de decisiones en las empresas, lo que llevará a mejorar los procesos de las mismas. Algunos ejemplos son la mezcla de alimentos, la gestión de inventarios, la cartera y la gestión de las finanzas, la asignación de recursos humanos y recursos de máquinas, la planificación de campañas de publicidad, etc.
Otros son:
* Optimización de la combinación de cifras comerciales en una red lineal de distribución de agua.
* Aprovechamiento óptimo de los recursos de una cuenca hidrográfica, para un año con afluencias caracterizadas por corresponder a una determinada frecuencia.
* Soporte para toma de decisión en tiempo real, para operación de un sistema de obras hidráulicas;
* Solución de problemas de transporte.

## Ejemplo

Este es un caso curioso, con solo 6 variables (un caso real de problema de transporte puede tener fácilmente más de 1000 variables) en el cual se aprecia la utilidad de este procedimiento de cálculo.
Existen tres minas de carbón cuya producción diaria es:
* La mina "a" produce 40 toneladas por día;
* La mina "b" produce 40 t/día; y,
* La mina "c" produce 20 t/día.
En la zona hay dos centrales termoeléctricas que consumen:
* La central "d" consume 40 t/día de carbón; y,
* La central "e" consume 60 t/día
Los costos de mercado, de transporte por tonelada son:
* De "a" a "d" = 2 monedas
* De "a" a "e" = 11 monedas
* De "b" a "d" = 12 monedas
* De "b" a "e" = 24 monedas
* De "c" a "d" = 13 monedas
* De "c" a "e" = 18 monedas
Si se preguntase a los pobladores de la zona cómo organizar el transporte, tal vez la mayoría opinaría que debe aprovecharse el precio ofrecido por el transportista que va de "a" a "d", porque es más conveniente que los otros, debido a que es el de más bajo precio.
En este caso, el costo total del transporte es:
* Transporte de 40 t de "a" a "d" = 80 monedas
* Transporte de 20 t de "c" a "e" = 360 monedas
* Transporte de 40 t de "b" a "e" = 960 monedas
* Total 1.400 monedas.
Sin embargo, formulando el problema para ser resuelto por la programación lineal se tienen las siguientes ecuaciones:
* Restricciones de la producción:
    $X_{a\to d}+X_{a\to e}\leq 40$ $[{\mbox{T/dia}}]\,\!$ $X_{b\to d}+X_{b\to e}\leq 40$ $[{\mbox{T/dia}}]\,\!$ $X_{c\to d}+X_{c\to e}\leq 20$ $[{\mbox{T/dia}}]\,\!$
* Restricciones del consumo:
    $X_{a\to d}+X_{b\to d}+X_{c\to d}\geq 40$ $[{\mbox{T/dia}}]\,\!$ $X_{a\to e}+X_{b\to e}+X_{c\to e}\geq 60$ $[{\mbox{T/dia}}]\,\!$
* La función objetivo será:
    $2X_{a\to d}+11X_{a\to e}+12X_{b\to d}+24X_{b\to e}+13X_{c\to d}+18X_{c\to e}=Min!$
La solución de costo mínimo de transporte diario resulta ser:
* X$_{b-d}$ = 40 resultando un costo de 12 x 40 = 480 monedas
* X$_{a-e}$ = 40 resultando un costo de 11 x 40 = 440 monedas
* X$_{c-e}$ = 20 resultando un costo de 18 x 20 = 360 monedas
* Total 1.280 monedas.
120 monedas menos que antes.
Ahora bien, las aplicaciones,por ejemplo, en productos de combinaciones convexas y desigualdades (de Kantorovich) pueden ser retratadas de la siguiente forma:
Sean λi y μi (i = 1,2,…, N) constantes reales y θi (i = 1,2,…, N) variables no negativas que satisfagan Σθi = 1. Se muestra que el problema del extremo (N - 1) -dimensional de encontrar el máximo y mínimo globales del producto (Σθiλi) (Σθiμi) se puede reducir a un problema unidimensional definido en el límite del polígono convexo atravesado por el pares ordenados (λi, μi). Para un conjunto dado de λi′s positivos (λ1⩾λ2⩾ ⋯ ⩾λN> 0), la desigualdad de Kantorovich establece que max {(Σθiλi) (Σθiμi)} = (λ1 + λN) 24λ1λN y min {(Σθiλi) (Σθiμi )} = 1 si μi = 1λi, i = 1,2,…, N. Se muestra que la nueva técnica anterior se puede utilizar para identificar exactamente cuánto pueden variar los μi de los valores de Kantorovich μi = 1 / λi sin invalidar los límites de Kantorovich. Sea νmax = sup (x, x) = 1 {(x, Ax) (x, Bx)} y νmin = inf (x, x) = 1 {(x, Ax) (x, Bx)}, donde x es un vector complejo N-dimensional, y A y B son dos matrices hermitianas definidas positivas N × N. Para el caso especial en el que B = A-1, la desigualdad de Kantorovich implica que νmaxνmin = [κ (A) +1] 24κ (A), donde κ (A) es el número de condición espectral de A. Se muestra que, en general, νmaxνmin⩾max {[κ (A) +1] 24κ (A), [κ (B) +1] 24κ (B)}.