Complejidad Computacional del M´etodo Simplex
y M´etodos de Puntos Interiores
*
Omar Trejo - 119711
Octubre, 2013
1.
Tiempo Exponencial
La idea general del m´etodo Simplex para resolver problemas de programa-ci´on lineal es recorrer las aristas, v´ertice por v´ertice, de un pol´ıtopo (regi´on factible) revisando su optimalidad en cada paso. La cantidad m´axima de v´ erti-ces dados por el sistema Ax ≤ b (que define el pol´ıtopo del problema), donde A ∈ Rmxn, es n
m, aunque cotidianamente se prueba un n´umero menor que ´este. Sin embargo, el hecho de que la cantidad de pruebas necesarias est´e relacionada a una expresi´on combinatoria indica un posible problema con la complejidad computacional del algoritmo.
1.1.
Problema Klee-Minty
El ejemplo utilizado cotidianamente para demostrar la complejidad exponen-cial del m´etodo Simplex es el problema Klee-Minty. La idea b´asica es deformar un hipercubo de tal manera que el m´etodo deba recorrer todas las aristas antes de llegar al punto ´optimo. Inicialmente fue propuesto en 1972 por Klee y Minty con la forma
maximizar
x yn
s.a. yj−1≤ yj ≤ 1 − yj−1, j = 2, . . . , n,
yj ≥ 0, j = 1, . . . , n.
Poco despu´es Chv´atal propuso[3] el cambio de variable x1 = y1, xj = (−1/)yj−1+ yj, lo que permite formular el problema como es m´as
popular-*Este documento no contiene un tratado riguroso de los m´etodos. Se crea a manera de
Figura 1: Politopos de Klee-Minty de dos y tres dimensiones[4]. mente conocido, maximizar x n X k=1 10n−kxk s.a. 2 j−1 X k=1 10j−kxk+ xj ≤ 100j−1, j = 1, . . . , n, xj≥ 0, j = 1, . . . , n.
Los resultados del problema Klee-Minty, utilizando el algoritmo programado y mostrado en la secci´on C´odigo, son
Dimensiones Iteraciones 3 50 5 47 6 31 8 35 10 45
Esto claramente muestra la complejidad exponencial del m´etodo. Por lo mis-mo, muchos de los esfuerzos comenzaron a enfocarse en m´etodos de puntos interiores, los cuales exhib´ıan caracter´ısticas deseables como complejidad poli-nomial.
2.
M´
etodos de Puntos Interiores
Los m´etodos de puntos interiores han sido foco de atenci´on desde que se mostr´o que existen problemas de complejidad exponencial para el m´etodo Sim-plex, y existe una variedad ´estos.1 En esta secci´on explicaremos brevemente el
1Un contraste interesante es que el m´etodo Simplex genera su complejidad del n´umero de
m´etodo elipsoidal y el m´etodo primal-dual infalible, y dejaremos de lado los dem´as por cuestiones de espacio. La tabla[4] presentada continuaci´on resume la informaci´on.
A˜no M´etodo Autor Caracter´ıstica
1947 Simplex Dantzig Eficiente en la pr´actica
1979 Elipsoidal Khachiyan Ineficiente en la pr´actica
1990 Primal-Dual Kojima, Mizuno, Yoshise M´etodo Dominante Infactible
2.1.
M´
etodo Elipsoidal de Khachiyan
2.1.1. ¿En qu´e consiste?La idea b´asica del m´etodo elipsoidal se deriva de investigaciones previas, durante los a˜nos sesenta y setenta, dentro de lo que era la Uni´on Sovi´etica. De manera burda, la idea es encerrar la regi´on de inter´es en una sucesi´on de elipsoides que decrecen de tama˜no cada vez m´as. La contribuci´on de Khachiyan fue demostrar en sus dos publicaciones -publicadas en 1979 y 1980- que bajo ciertas condiciones el m´etodo tiene complejidad polinomial para problemas de programaci´on lineal.
2.1.2. ¿C´omo se construye el punto inicial y la sucesi´on de elipsoi-des?
El m´etodo construye una elipsoide inicial que cubre P , el conjunto de fac-tibilidad, completamente. Se toma el centro de ese elipsoide y se identifica si se encuentra dentro de la regi´on factible P . Si se encuentra dentro, el proble-ma es factible, si no se encuentra dentro se puede construir un elipsoide nuevo (en tiempo polinomial), tomando en cuenta la variable que corresponde a la restricci´on de ATx ≤ b que es violada, que cubra completamente la mitad del elipsoide anterior del lado donde se encuentra P . Procedemos de esta manera hasta que se encuentra un centro dentro de la regi´on factible, o se alcanza el n´umero m´aximo de iteraciones disponibles (el resultado en este caso ser´ıa que el problema es no factible).
2.1.3. ¿Por qu´e es un m´etodo polinomial?
Bajo dos condiciones, que explicaremos a continuaci´on, Bertismas y Tsitsiklis mostraron[5] que el m´etodo elipsoidal resuelve problemas de programaci´on lineal en tiempo O(m4log(R/r)). Antes de definir las condiciones debemos definir el conjunto poli´edrico del problema (representaci´on del problema de programaci´on lineal de manera vectorial):
P = {x ∈ Rm: aTjx ≤ cj, j = 1, . . . , n} su complejidad debido al n´umero de variables en el problema.
Figura 2: Elipsoides con y sin regi´on factible[8].
Si P 6= ∅ el problema tiene soluci´on. Las dos condiciones para que el algoritmo converja en tiempo polinomial son:
1. ∃ x0∈ Rm
, ∃ r ∈ R, r > 0, t.q. P ⊂ S(x0, R) = {x ∈ Rm: kx − x0k ≤ R}, 2. ∃ r ∈ R, r > 0 conocido t.q. si Y 6= ∅ =⇒ S(x∗, r) ⊂ Y,
donde S(y, r) es una bola con centro en y y radio r. La primer condici´on implica que P est´a acotado. La segunda condici´on implica que si P es no vac´ıo, entonces su interior tampoco es vac´ıo; i.e. existe un sentido de densidad.
Dado que tenemos un sentido de densidad, podemos construir cualquier elip-soide necesaria. La parte computacionalmente m´as compleja del m´etodo es preci-samente la construcci´on del elipsoide de volumen m´ınimo. Sin embargo, sabemos que este proceso es de complejidad polinomial, por lo que, de manera burda, podemos extender esto al hecho de que el m´etodo es de complejidad polinomial. En la teor´ıa se pueden construir (con aritm´etica exacta) sucesiones infinitas de elipsoides, pero en la pr´actica (aritm´etica de precisi´on finita) se establece una cota al n´umero de iteraciones que si es superada el problema se considera que ´este es infactible.
2.1.4. ¿Cu´al es la relevancia te´orica del m´etodo y por qu´e no es pr´actica su implementaci´on para programaci´on lineal?
La relevancia te´orica del m´etodo reside en el hecho de que antes de la publi-caci´on del mismo no se hab´ıan logrado clasificar los problemas de programaci´on lineal en alguno de los conjuntos de problemas P o N P, i.e. los que se pueden resolver en tiempo polinomial y los que no, respectivamente. Se cre´ıa que es-tos problemas no tienen una complejidad tal que deben ser clasificados en N P, pero nadie hab´ıa conseguido demostrar su pertenencia a P hasta que Kachiyan public´o su m´etodo elipsoidal. Adem´as el m´etodo sirve para construir algorit-mos para problemas de optimizaci´on convexa, que son m´as generales que los de programaci´on lineal.
La experiencia computacional muestra que las iteraciones necesarias para resolver problemas de programaci´on lineal usando este m´etodo se encuentran muy cercanas al l´ımite te´orico superior. Esto significa que pr´acticamente el al-goritmo no es muy bueno. El m´etodo Simplex, aunque tiene una complejidad exponencial, en la pr´actica la experiencia muestra que son necesarias muchas menos iteraciones que el l´ımite te´orico m´aximo, haci´endolo un candidato para aplicaciones pr´acticas.
2.2.
M´
etodo Primal-Dual Infactible de Kojima, Mizuno &
Yoshie
2.2.1. ¿En qu´e consiste?
El m´etodo consiste en tomar un punto nuevo en cada iteraci´on a lo largo de la direcci´on de Newton, en la direcci´on de la trayectoria central, como lo hacen otros m´etodos de puntos interiores. La diferencia es que ´este m´etodo no requiere que los puntos est´en dentro de la regi´on factible. ´Este m´etodo aplica pasos largos y distintos entre el los problemas primal y dual, y se caracteriza por convergencia global en tiempo polinomial2
2.2.2. ¿C´omo se construye el punto inicial y la sucesi´on de puntos? Dado que es un m´etodo infactible, tenemos que no es necesario construir un punto inicial, i.e. cualquier punto (xi, yi, zi) en el espacio, con xi ≥ 0, zi ≥ 0, converger´a eventualmente a una soluci´on. Es necesario notar que hay casos en programaci´on no-lineal donde ´esta soluci´on puede ser no-´optima, pero en el caso de programaci´on lineal, siempre converger´a a una soluci´on ´optima.
La sucesi´on de puntos se construye utilizando los problemas primal y dual P : minimizar x c Tx s.a. Ax = b, x ≥ 0 D : maximizar y,z b Ty s.a. ATy + z = c, z ≥ 0 En cada iteraci´on se resuelve el sistema
A 0 0 0 AT I Zk 0 Xk ∆x ∆y ∆z = − Axk− b ATyk+ zk− c XkZk− µe
donde Zk y Xk son las matrices con la diagonal igual a zk y xk, respecti-vamente. Cada una de las restricciones (ecuaciones del sistema lineal) vienen
2Para ser rigurosos deber´ıamos definir los conceptos direcci´on de Newton, trayectoria
cen-tral, pasos largos, problema primal y problema dual. Sin embargo, por cuestiones de espacio no profundizaremos en ellos.
de la b´usqueda de cerar la brecha en la restricci´on de factibilidad de P , la res-tricci´on de factibilidad de D y la restricci´on de la brecha entre los problemas, XkZk= µe, respectivamente. Posteriormente se actualizan las variables
(xk+1, yk+1, zk+1) = (xk, yk, zk) + α(∆x, ∆y, ∆z)
Los detalles t´ecnicos, por ejemplo como escoger α en cada iteraci´on, la ob-tenci´on de la factibilidad, la convergencia global o la identificaci´on de la no-factibilidad, no ser´an explicados en este documento. Sin embargo, esto no sig-nifica que carezcan de gran importancia.
2.2.3. ¿Por qu´e es un m´etodo polinomial?
Aunque el c´alculo de cada iteraci´on es significativamente m´as alto que el m´etodo Simplex, cada iteraci´on conlleva progreso mucho m´as significativo hacia el ´optimo, suponiendo que existe. Adem´as es un camino mucho m´as directo (si-gue el llamado central path). La complejidad del algoritmo radica en la soluci´on de un sistema de ecuaciones lineales que, aunque puede ser complicado, sabe-mos que podesabe-mos hacer en tiempo polinomial, por lo que el algoritmo tambi´en muestra tiempo polinomial3.
2.2.4. ¿Cu´al es la relevancia del m´etodo y por qu´e es pr´actica su implementaci´on para programaci´on lineal?
El m´etodo se encuentra dentro de los m´as populares hoy en d´ıa y exhibe los mejores resultados pr´acticos. En promedio le toma entre 23 y 25 iteraciones resolver los problemas m´as complejos (con soluci´on) que existen hoy en d´ıa en programaci´on lineal. Adem´as, te´oricamente es importante el m´etodo porque no se restringe a comenzar con puntos dentro de la regi´on factible, lo que puede presentar un problema en s´ı mismo.
3.
C´
odigo - M´
etodo Simplex Revisado
El c´odigo aqu´ı presentado es una peque˜na variaci´on del m´etodo Simplex que utiliza un tableu m´as peque˜no porque no guarda espacio para las columnas B de A = [N |B] que contienen la identidad en cada iteraci´on. En realidad no es necesario almacenar ´esta identidad. La utilizaci´on de este m´etodo es para mejorar el desempe˜no en el RAM de la computadora4.
/*
* Programacion Lineal - Metodo Simplex Revisado * Omar Trejo Navarro
* 119711 *
3Claramente esta es una implicaci´on burda y es necesario sustentarla de manera rigurosa,
pero dicha prueba no ser´a presentada en este texto.
* r := y = maximizar, n = minimizar
* nv := numero de variables de funcion objetivo * nr := numero de restricciones
* t := tableu
* tipo := 1 = maximizar, -1 = minimizar * ai := auxiliar para inputs
* optimo := true = alcanzado, false = no alcanzado * xmax := maximo de coeficientes de funcion objetivo * bamin := mininmo de b_i/a_ij
* aux := variable auxiliar
* rp := indice del renglon pivote * cp := indice de la columna pivote * error := true = no acotado, false = acotado * CMAX := maxima cantidad de restricciones * VMAX := maxima cantidad de variables * */ #include <stdio.h> #include <math.h> #define CMAX 10 #define VMAX 10 int nr, nv, rp, cp;
bool optimo, error;
double t[CMAX][VMAX];
void datos() {
/*
* Obtener los datos del problema */
char r;
int i, j;
double tipo, ai;
printf("\n Programacion Lineal - Metodo Simplex Revisado\n");
do { printf("\n Maximizar [s/n] ? "); scanf(" %c", &r); if (r == 'S' || r == 's') tipo = 1; else if (r == 'N' || r == 'n') tipo = -1; else
printf("\n [!] Error. Debe indicar si (s) o no (n).\n\n" )←-;
} while (r != 'S' && r != 's' && r != 'N' && r != 'n'); printf(" Cantidad de variables ? "); scanf(" %d", &nv); printf(" Cantidad de restricciones ? "); scanf(" %d", &nr);
// Funcion objetivo
printf("\n Funcion objetivo:\n");
for (j = 1; j <= nv; j++) {
printf(" Coeficiente de la variable %d ? ", j); scanf(" %lf", &ai);
t[1][j + 1] = ai * tipo; }
scanf(" %lf", &ai); t[1][1] = ai * tipo;
// Restricciones
for (i = 1; i <= nr; i++) {
printf("\n Restriccion %d:\n", i);
for (j = 1; j <= nv; j++) {
printf(" Coeficiente de la variable %d ? ", j); scanf(" %lf", &ai);
t[i + 1][j + 1] = -ai; }
printf(" Constante de restriccion ? "); scanf(" %lf", &t[i + 1][1]);
}
// Indices de las variables
for (j = 1; j <= nv; j++) t[0][j + 1] = j; for (i = nv + 1; i <= nv + nr; i++) t[i - nv + 1][0] = i; } void pivotear() { /*
* Hacer el cambio de pivotear */
double bamin, aux, xmax;
int i, j; xmax = 0;
// maximo {costos reducidos}
for (j = 2; j <= nv + 1; j++) { if (t[1][j] > 0 && t[1][j] > xmax) { xmax = t[1][j]; cp = j; } } bamin = 1000000; // minimo {b_i/a_ij} for (i = 2; i <= nr + 1; i++) { if (t[i][cp] < 0) {
aux = fabs(t[i][1] / t[i][cp]);
if (aux < bamin) { bamin = aux; rp = i; } } } // Cambio de indices aux = t[0][cp]; t[0][cp] = t[rp][0]; t[rp][0] = aux; } void actualizar() { /* * Actualizar el tableu */ int i, j; for (i = 1; i <= nr + 1; i++)
if (i != rp) for (j = 1; j <= nv + 1; j++) if (j != cp) t[i][j] -= t[rp][j] * t[i][cp] / t[rp][cp]; t[rp][cp] = 1.0 / t[rp][cp]; for (j = 1; j <= nv + 1; j++) if (j != cp) t[rp][j] *= fabs(t[rp][cp]); for (i = 1; i <= nr + 1; i++) if (i != rp) t[i][cp] *= t[rp][cp]; } void revisar() { /*
* Revisar optimalidad del tableu */ int i, j; optimo = true; error = false; // Revisar si es no-acotado for (i = 2; i <= nr + 1; i++) if (t[i][1] < 0)
// TODO: Avisar que es no acotado
error = true;
// Revisar si es optimo
if (error == false)
for (j = 2; j <= nv + 1; j++)
// TODO: Revisar si hay solucion multiple
if (t[1][j] > 0) optimo = false; }
void simplex() {
/*
* Metodo Simplex Revisado */
while (optimo == false) { pivotear(); actualizar(); revisar(); } } void resultados() { /*
* Presentar los resultados */ int i, j; printf("\n Resultados:\n"); if (error == false) { for (i = 1; i <= nv; i++) for (j = 2; j <= nr + 1; j++) if (t[j][0] == 1 * i) printf(" Variable %d: %f\n", i, t[j][1]); printf(" Funcion objetivo: %f\n\n", t[1][1]);
printf(" No hay solucion.\n\n"); } int main() { datos(); simplex(); resultados(); }
Referencias
[1] Stephen J. Wright, Primal-Dual Interior Point Methods, Argonne National Laboratory, SIAM, 1997.
[2] Mokhtar S. Bazaraa, John J. Jarvis, Hanif D. Sherali, Linear Programming and Network Flows, Wiley, 2010.
[3] Steven R. Dunbar, Worst Case and Average Case Behavior of the Simplex Algorithm, University of Nebraska-Lincoln, Department of Mathematics. [4] A. Deza, E. Nematollahi & T. Terlaky, How good are interior point methods?,
McMaster University, Advanced Optimization Laboratory, 2005.
[5] Yinyu Ye, The Ellipsoid (Kachiyan) Method, Department of Management Science and Engineering, Stanford University.
[6] Robert G. Bland, Donald Goldfarb & Michael J. Todd The Ellipsoid Method: A Survey, Cornell University, Ithaca, New York, 1981.
[7] Masakazu Kojima, Nimrod Megiddo & Shinji Mizuno A primal-dual infeasi-ble interior point algorithm for linear programming, Mathematical Program-ming, North-Holland, 1992.
[8] Steffen Rebennack Ellipsoid Method, Encyclopedia of Optimization, Sprin-ger, 2008.