Los 10 algoritmos mas importantes del ultimo siglo

B

Nombrados por los editores de SIAM (Society for Industrial and Applied Mathematics)
https://www.siam.org/pdf/news/637.pdf

Traducción

Algos es la palabra griega para el dolor. Algor es latín, tener frío. Ninguna es la raíz de algoritmo, que deriva de al-Khwarizmi, el nombre del erudito árabe del siglo IX cuyo libro al-Jabr wa muqabalah ha involucionado hasta llegar a los libros de texto de álgebra de la escuela secundaria de hoy. Al-Khwarizmi hizo hincapié en la importancia de los procedimientos metodológicos para la solución de problemas. Si todavía estuviera por aquí, sin duda alguna estaría impresionado por los avances en la aproximación algorítmica a los problemas.

Algunos de los mejores algoritmos de la era del ordenador se destacan en la edición de enero / febrero de 2000, de Computing in Science & Engineering, una publicación conjunta del Instituto Americano de Física y la IEEE Computer Society. Los editores invitados Jack Dongarra de la Universidad de Tennessee y el Laboratorio Nacional de Oak Ridge y Francis Sullivan, del Centro de Ciencias de la Computación en el Instituto de Análisis de Defensa han hecho una lista de lo que consideran el "Top Ten Algoritmos del siglo".

"Tratamos de reunir los 10 algoritmos con la mayor influencia en el desarrollo y la práctica de la ciencia y la ingeniería en el siglo 20", Dongarra y Sullivan escriben. Al igual que con cualquier top, sus selecciones y no selecciones están destinadas a la controversia, reconocen. Cuando se trata de elegir el mejor algoritmo, no parece haber ningún algoritmo.

Sin más preámbulos, aquí está la lista CISE top-10, en orden cronológico. (Fechas y nombres asociados con los algoritmos deben leerse como aproximaciones de primer orden. La mayoría de los algoritmos toman forma a través del tiempo, con muchos colaboradores.)

Método de Monte Carlo

En 1946 John Von Neumann, Stanislau Ulam, y Nick Metropolis, todos en el laboratorio nacional de Los Álamos (donde se realizó el proyecto Manhattan) diseñan el algoritmo Metropolis, también conocido como método de Monte Carlo.

La idea es obtener soluciones aproximadas a problemas con una cantidad ingente de grados de libertad (aka variables) simulando un proceso aleatorio. Dada la fama del ordenador para cálculos determinísticos, es irónico que uno de los primeros grandes algoritmos fuera aleatorio.

Extendiéndome (yo) sobre el funcionamiento, la manera en que funciona es relativamente simple. Queremos mirar el área que hay dentro de una superficie (una curva por ejemplo). Generamos puntos aleatorios en una superficie mayor y miramos la proporción de puntos que quedan dentro del volumen que queremos medir. Esta proporción tiende en promedio a estar relacionada con el volumen.

Método del Simplex para programación lineal

En 1947 George Dantzig de la RAND corporation creó el algoritmo del Simplex para programación lineal. En términos de propagación, este es uno de los algoritmos más exitosos: Domina el mundo de la industria, donde la supervivencia económica se basa en la habilidad de optimizar beneficios con unos límites al presupuesto y otras restricciones. (Por supuesto se requieren modificaciones a este método pero este fue el que marcó el inicio.) El método del Simplex es una manera elegante de llegar a las respuestas óptimas. En algunos casos extremos puede ser muy lento, pero en la práctica suele ser muy eficiente -- lo cual dice algo sobre la naturaleza de la computación.

Este algoritmo trata de buscar el máximo de una función lineal dado un conjunto de restricciones lineales. En bachillerato social es lo que se hace de mirar la recta paralela qué vértice del polígono toca. Básicamente es lo mismo en n dimensiones, tenemos un polítopo formado por las intersecciones de hiperplanos y hay que mirar de todos los "vértices" en cual la función es mayor o menor.

Métodos de iteración en subespacios de Krylov

Desarrollado en 1950 por Magnus Hestenes, Eduard Stiefel, y Cornelius Lacnzos. Este algoritmo busca resolver la (a priori) simple ecuación Ax = B donde A es una matrix nxn enorme, y b es un vector. La idea es resolver ecuaciones relativamente más simples con matrices "cercanas" a A de manera iterativa:

[; K x{i+1} = K x{i} + b - A x_{i} ;]

Estas matrices K salen del estudio de los subespacios de Krylov (un matemático ruso), generados por las potencias de una matriz aplicada a un vector "inicial" que es el residuo [; r{0}= b - A x{0} ;] . Lacnzos encontró una manera inteligente de generar una base ortogonal para el subespacio cuando la matriz es simétrica. Hestenes y Stiefel mejoraron este método usando el famoso método de los gradientes conjugados, para sistemas simétricos y definidos positivos. Durante las siguientes décadas numerosos investigadores han mejorado y extendido estos algoritmos. Actualmente (2000) hay algoritmos para sistemas no simétricos : GMRES y Bi-CGSTAB.

Descomposición computacional de matrices

En 1951 Alston Householder del laboratorio nacional de Oak Ridge formaliza esta aproximación. La idea es descomponer la matriz A como productos de otras matrices más simples, que permiten mayor eficiencia en los cálculos (sobre todo si hay que repetirlos muchas veces) y mayor control del error que producimos al realizarlos. El ejemplo más típico es el método LU, donde descomponemos A en el producto de L y U donde L es una matriz triangular por debajo con todos los elementos de la diagonal 1, y U es una matriz triangular por arriba.

Compilador de Fortran

En 1957 John Backus lideró un equipo de IBM desarrollando el compilador optimizador de Fortran. La creación de Fortran podría ser considerada una de las grandes piedras de toque de la computación. Por fin los científicos podían tener una manera estándar de programar sin tener que ir a lenguaje máquina, y aunque para los estándares de ahora el compilador no es gran cosa, en aquella época los informáticos se sorprendían de lo fino que hilaba el compilador.

Algoritmo QR

Entre 1959 y 1961 J.G.F. Francis de Ferranti Ltd., Londres, encontró un método estable para computar los valores propios de una matriz nxn. Es relativamente fácil transformar cualquier matriz en una matriz "casi triangular por arriba" (excepto la subdiagonal inferior). Pero hasta que se desarrolló el método QR era casi imposible quitar esos últimos elementos que no son cero sin caer en una avalancha de errores. El método QR descompone una matriz en un producto de Q (matriz ortogonal) y R (matriz triangular por arriba), y lo que se hace a partir de este método es ir pasando de QR a RQ (y volver a descomponer RQ), con unos detallitos para acelerar la convergencia. A mitades de los años 60, lo que una vez fueron problemas gargantuescos se habían convertido en tareas rutinarias.

Quicksort

Presentado en 1962 por Tony Hoare de Elliott Brothers, Ltd., Londres. Poner N números en orden descendente o ascendente parece algo mundano. El problema es encontrar maneras de hacerlo rápidamente. El algoritmo de Hoare usa la clásica técnica de "divide y vencerás". Elige un elemento como pivote, separa el resto en pilas de elementos "grandes" y "pequeños", y repite para cada pila. Aunque es posible tener que hacer todas las N(N-1)/2 comparaciones, en promedio Quicksort corre en O(Nlog(N)) pasos. Su simplicidad ha convertido Quicksort en el ejemplo modélico de la teoría de complejidad computacional.

Nota: Sí, Mergesort es más rápido en el peor caso, pero hay otras cosas a considerar. Si estáis interesados, aquí se discute. Tambien esta heapsort que en la practica es mas rapido, tal y como comenta #9 .

FFT

Desarrollado en 1965 por James Cooley y John Tukey (IBM y Princeton Universtiy) FFT o Fast Fourier Transform (transformada rápida de Fourier) es posiblemente EL algoritmo más importante del último siglo.
La idea es parecida a Quicksort: Dividir el problema recursivamente y pasar de hacer O(N2) pasos a O(NlogN). Pero la manera de hacerlo no es tan evidente como Quicksort. El desarrollo de este algoritmo fue lo que impulsó al estudio más detenido de la complejidad de ciertos programas y algoritmos (i.e. vieron que la manera más obvia no siempre es la mejor). Las aplicaciones de FFT son innumerables, desde las matemáticas teóricas (descomposición en factores) hasta el procesado de señal.

Algoritmo para la detección de relación de enteros

Creado por Helaman Ferguson y Rodney Forcade de Brigham Young University.
El problema es viejo: Dada una lista de números reales [; x_1, x_2, dots, x_n ;] tenemos que encontrar una lista de enteros [; a_1, a_2, \dots, a_n ;] (no todos igual a cero) tales que [; x_1a_1 + \dots x_na_n = 0 ;] o , si no es posible encontrarlos, decirlo. Para n = 2 el algoritmo de Euclides resuelve el problema, simplemente encontrando los términos de la fracción continua si [; x_1/x_2 ;] es racional. La generalización de Ferguson y Forcade es mucho más difícil de implementar (y de entender), pero mucho más poderosa. Su algoritmo de detección se ha usado, por ejemplo, para encontrar los coeficientes de los polinomios que siguen los puntos de bifurcación tercero 3.544090 y cuarto 3.564407 del mapa logístico ) (el último polinomio tiene grado 120, para que os hagáis una idea). También se usa para simplificar cálculos con los diagramas de Feynman en teoría cuántica de campos.

Fast Multipole Algorithm

Desarrollado en 1987 por Leslie Greengard y Vladimir Rokhlin de Yale University.
Este algoritmo resuelve uno de los mayores problemas del problema (valga la redundancia) de N-cuerpos. En el problema de N-cuerpos intentamos encontrar la dinámica que siguen N cuerpos donde todos influyen a todos los otros (por ejemplo galaxias o planetas). Parece que como mínimo para resolverlo necesitamos N2 computaciones (una para cada par de partículas). El algoritmo Fast Multipole lo hace con O(N) computaciones. Lo hace aproximando la influencia de todos los cuerpos lejanos como un cuerpo muy grande y no puntual. Se realiza una descomposición jerárquica del espacio para definir grupos cada vez más grandes conforme nos alejamos del cuerpo (esta descomposición no es trivial y de hecho hacerlo inteligentemente es lo que permite este O(N)). Una de las ventajas de este método es que tenemos estimaciones rigurosas del error cometido, cosa que no pasa en muchos otros métodos.

Y hasta aquí hemos llegado! Si tenéis dudas sobre algún algoritmo, o queréis aportar otro algoritmo que vosotros consideréis más influyente, aquí estaré para discutirlo :) .

13
guner

Estoy emocionado.

Para mi tesis desarrollo un Monte Carlo para simulación de transporte electrónico en FORTRAN. 2/10 :D

Edit: Te falta la barra invertida en \dots [; \dots ;]

1 2 respuestas
B

#2 creo que abrire un hilo en plan "en qué estáis trabajando?" para que podamos comentar estas cosas, porque me parece muy interesante que todos tengamos nuestros proyectos y tal y podríamos aprender mucho. En cualquier caso... Qué es transporte electrónico? xD

1 1 respuesta
guner

#3 me parece una idea cojonuda.

Pues transporte de electrones XD. Nos referimos al comportamiento de los electrones dentro de semiconductores o metales (en mi caso grafeno). Básicamente consideramos la estructura de bandas del material, los campos eléctricos externos e internos por la redistribución de carga y las interacciones con las imperfecciones u oscilaciones de la red. Al final lo que podemos hacer es simulación de dispositivos (transistores, diodos...) de caracerísticas arbitrarias.

1
Fyn4r

Oh, la FFT :qq:

El quicksort creo que me hicieron codificarlo en unos 4 lenguajes distintos xD

1 respuesta
Ulmo

Me ha sorprendido no encontrar anda de Markov models, ¿es porque no son un algoritmo por sí mismos? Pese a ello sí que tienen unas reglas fijas y creo que actualmente se utilizan muchísimo para aproximaciones al óptimo de problemas altamente costosos.

1 respuesta
B

#2 corregido, al darle a enviar se me salio y al volver se habian quitado por error de la web xD.
#5 una cosa que no comentan en el articulo y es que algunos de estos algoritmos no solo son rapidos de por si sino que tambien paralelizan muy bien. Bueno en general el articulo no habla de paralelizacion que yo creo que fue uno de los grandes cambios de finales de siglo.
#6 yo diria que es porque es toda una teoria que evoluciono de los metodos de Monte Carlo (en plan Markov Chain Monte Carlo, Metropolis-Hastings, Simulated Annealing etc.)

1 respuesta
nomechordas

La FFT es el grial, es la vida... todavía tengo que mirar un día como funciona por dentro, a ver qué tipo de brujería lleva. Aunque con lo cómo que es tirar de Matlab...

1 respuesta
Marjoram

#7 Ya que mencionas mergesort igual podrías mencionar heapsort como algoritmo de ordenamiento, que aunque suele tener el mismo límite de tiempo suele ser más rápido cuando se lleva a la práctica :P

1 respuesta
B

Me acuerdo que elegi hacer el proyecto de una asigatura sobre metodo de montecarlo por eso que se uso para la bomba atomica y tal.
Aun me arrepiento de haberlo cogido, todo eran probabilidades y no habia manrra de sacarlo xdd

B

#8 recuérdame que ponga la explicación correspondiente del Princeton Companion for Mathematics, que a mí me lo aclaró un montón!

#9 toda la razón, ahora lo añado.

spyro512

fucking FFT, que tengo mi último examen de la carrera en dos semanas y va de transmisión de datos, teoría de la información y demás

7 días después
Puyover

Qué recuerdos. A mi me tocó implementar la descomposición LU, la factorización de Cholesky, Monte Carlo y Newton-Raphson para la asignatura de análisis numérico. Lo hice por gusto en realidad, pero quedó un programita bastante potable con su interfaz gráfica y demás.

1 respuesta
B

#13 este semestre soy asistente en esa asignatura jaja.

Perrofeo

Me cago en fortran actualmente. Estudiando física en 2014 y vamos, hasta que se jubile el profesor que da la asignatura de metodos computacionales vamos a estar estudiando fortran en la UNEX.

Que habrá sido un idioma importante y tal, pero hoy en día hay idiomas más útiles.

1 2 respuestas
B

#15 fortran realmente es muy rapido y en algunos tests es mas rapido que C para cosas de algebra... Pero la diferencia es infima, y por facilidad de desarrollo yo me quedo con C. Ademas paralelismo en Fortran siempre me ha parecido mucho mas mierdero que en C.

1 respuesta
Boujack

#16 #15

Yo estudie fortram95 en "programacion", ingeniero mecanico....

Leoshito

Este año de carrera he aprendido el simplex y el LU, y sinceramente no los veían tan 'maravillosos'. Aunque sí es cierto que simplifican las cosas una barbaridad.

Vitov

Interesante, gracias.

Calzeta

No consigo encontrar la viñeta de SMBC en la que se proponía encontrar el punto G mediante métodos de Monte Carlo... pero os hacéis una idea.

1
T-1000

demasiado complicado para mi mente.

3 meses después
Frezz

Estoy pensando en leer algún libro majo sobre algoritmia estas navidades, si puede ser relacionado con la programación en computadoras en la actualidad, tenéis alguna recomendación?

1 respuesta
B

#22 si no te he respondido para domingo recuerdamelo! Algo en particular que te llame? Complejidad, analisis numerico, high performance computing?

1 respuesta
Frezz

#23 Ya me recomendaron uno (Algoritmos Computacionales de Sara Baase y Alan Van Gelder), pero me vale otro, los leeré ambos y alguno más, habrá tiempo.

Sobre complejidad me da algo de respeto porque no estoy muy puesto aún, pero me da igual, en principio buscaba algo que hablara de historia y evolución, y lo de high performance computing me interesa.

Usuarios habituales