1. Introducción

Un problema de programación lineal (PPL) es una situación compleja en la que el responsable debe tomar decisiones del tipo:

de modo que se cumpla con ciertas limitaciones, como:

y de manera que, tanto la función objetivo (a maximizar o minimizar), como las limitaciones se pueden escribir como ecuaciones lineales en las variables de decisión.

Una forma estándar en la que todo PPL puede escribirse es:

\[ \begin{array}{rrrrrrrrc} \text{max } z = &c_1 x_1 & + & c_2 x_2 & + & \cdots & + & c_n x_n & &\\ \text{s.a:} & & & & & & & & & \\ &a_{11} x_1 & + &a_{12} x_2 & + &\cdots & + &a_{1n} x_n & = &b_1 \\ &a_{21} x_1 & + & a_{22} x_2 & + & \cdots & + & a_{2n} x_n & = & b_2 \\ & \vdots & \vdots &\vdots & \vdots &\ddots & \vdots &\vdots & \vdots &\vdots \\ &a_{m1} x_1 & +& a_{m2} x_2 & + &\cdots & +& a_{mn} x_n & =& b_m \\ & x_1, & & x_2, & & \ldots, & & x_n & \geq & 0 \end{array} \]

donde:

La resolución “manual” de un PPL pasa por:

2. El algoritmo SIMPLEX

Se llama región factible al conjunto de valores de todas las variables de decisión que cumplen las restricciones del PPL. Se denota con la letra \(F\)

El algoritmo Simplex (George B. Dantzig, 1947) se basa en esto último. Mediante sencillas operaciones:

  1. Sale de un punto extremo de \(F\) (tabla simplex inicial).
  2. Desde un punto extremo de \(F\) puede chequear si la función objetivo mejora en puntos extremos adyacentes, y se puede pasar a cualquiera de ellos (actualizar tabla simplex).
  3. Se detiene si mingún punto extemo adyacente mejora la función objetivo, dando la solución óptima (o indicando la no existencia de solución).

Existen muchas implementaciones del algoritmo simplex, y algunos permiten tratar el PPL sin estar en forma estándar, lo cual quita trabajo al usuario.

Este algoritmo no está exento de inestabilidad numérica, ya que se calculan divisiones con valores que pueden ser muy pequeños en el denominador.

3. Función simplex() del package boot

Sirve para problemas de tamaño no muy grande (leer Nota en la ayuda help(simplex)). Instalar y cargar package previamente.

4 Función lp() del package lpSolve

Se trara de otra función para resolver PPLs, pero más completa pues admite variables enteras (programación entera) y variables binarias (programación 0-1). Para usarla hay que instalar y cargar el package previamente.

4. Ejercicios evaluables

4.1. Un PPL queda modelizado como:

\[ \begin{array}{rl} \text{max} &x_1 + 5x_2 - x_3 \\ \text{s.a} & \\ & x_1 + x_2 + x_3 \geq 100 \\ & 5x_1 - x_2 + 8x_3 \leq 500 \\ & - x_1 + x_2 + 2x_3 = 0 \\ & 2x_1 + x_2 + 12x_3 \leq 800 \\ & x_1, x_2, x_3 \geq 0 \end{array} \] 4.1.1 Resuelve el PPL con las dos funciones de R: escribe el valor óptimo de la función objetivo y los valores de las variables de decisión que consiguen ese óptimo.

library(boot)
library(lpSolve)
# AQUÍ TU CÓDIGO

ESCRIBE LA SOLUCIÓN (VARIABLES Y SUS VALORES) Y EL VALOR ÓPTIMO ENCONTRADO, O BIEN SI NO SE ENCUENTRA, COMENTAR LO QUE HA PASADO

4.1.2 Resuelve el PPL con las dos funciones de R, SI EL OBJETIVO FUERA MINIMIZAR LA FUNCIÓN OBJETIVO (valga la redundancia)

# AQUÍ TU CÓDIGO

ESCRIBE LA SOLUCIÓN (VARIABLES Y SUS VALORES) Y EL VALOR ÓPTIMO ENCONTRADO, O BIEN SI NO SE ENCUENTRA, COMENTAR LO QUE HA PASADO

4.1.3 Resuelve (como sea posible) el PPL DE MINIMIZAR, SUPONIENDO ADEMÁS QUE LAS VARIABLES \(x_1\) Y \(x_2\) REPRESENTAN NÚMEROS DE PERSONAS, Y NO PUEDEN TOMAR VALORES NO ENTEROS.

# AQUÍ TU CÓDIGO

ESCRIBE LA SOLUCIÓN (VARIABLES Y SUS VALORES) Y EL VALOR ÓPTIMO ENCONTRADO, O BIEN SI NO SE ENCUENTRA, COMENTAR LO QUE HA PASADO

4.2. Un PPL queda modelizado como:

\[ \begin{array}{rl} \text{min} &15 x + 10y\\ \text{s.a} & \\ & y \leq 50 \\ & 1.5 x - y \geq 20 \\ & x_1, x_2 \geq 0 \end{array} \]

4.2.1 Resuelve el PPL con las dos funciones de R el PPL: escribe el valor óptimo de la función objetivo y los valores de las variables de decisión que consiguen ese óptimo.

# AQUÍ TU CÓDIGO

ESCRIBE LA SOLUCIÓN (VARIABLES Y SUS VALORES) Y EL VALOR ÓPTIMO ENCONTRADO, O BIEN SI NO SE ENCUENTRA, COMENTAR LO QUE HA PASADO

4.2.2 Resuelve el PPL con las dos funciones de R, SI EL OBJETIVO FUERA MAXIMIZAR LA FUNCIÓN OBJETIVO (valga la redundancia)

# AQUÍ TU CÓDIGO

ESCRIBE LA SOLUCIÓN (VARIABLES Y SUS VALORES) Y EL VALOR ÓPTIMO ENCONTRADO, O BIEN SI NO SE ENCUENTRA, COMENTAR LO QUE HA PASADO

4.2.3 Como se trata de tan solo dos variables, representa gráficamente la región factible y la curva de nivel \(z=0\) y comenta los resultados obtenidos en 4.2.1 y 4.2.2.

Ayuda: la función abline(a,b,h,v) añade rectas a un plot, que se pueden indicar con término independiente y pendiente (a, b) o bien con la ordenada en el origen, si es horizontal (h) o bien con la abcisa, si es vertical (v).

# AQUÍ TU CÓDIGO
plot(x=0, y=0, xlim=c(0,100), ylim=c(0,100))

# LA RECTA x=0
# LA RECTA y=0
# LA RECTA y=50
# LA RECTA 1.5x-y=20
# LA CURVA DE NIVEL z=0 PARA z=15x+10y

COMENTARIO DE LOS RESULTADOS DE 4.2.1 Y 4.2.2 A PARTIR DE LA FIGURA.