¿Qué métodos de optimización debe conocer todo informático?

Tres contendientes vienen a mi mente:

1.) Newton-Raphson y sus variantes. Estos métodos iterativos “reducen” un gradiente hasta que convergen. Para mí este es EL algoritmo número uno que hace brillar la computadora.

2.) Programación cuadrática: muchos problemas del mundo real se pueden replantear como un problema de optimización de una función cuadrática con restricciones lineales (como los límites superior / inferior de las variables). Dependiendo de las restricciones, puede existir una solución “analítica” (hasta una inversión de matriz). Si no, uno tiene que confiar en métodos iterativos que toman prestadas ideas de 1). Entonces, QP no es realmente un algoritmo único, sino una clase de problemas. Y saber cómo replantear un problema de optimización como QP es tremendamente útil y no hacerlo puede ser muy vergonzoso.

3.) Algoritmos de muestreo aleatorio (evolutivo). La diferencia clave para 1 y 2 es que no es necesario calcular derivados y, por lo tanto, estos funcionan en funciones de recuadro negro. Las funciones de recuadro negro devuelven un valor para cada entrada, pero se desconoce la relación entre la entrada y la salida. El dominio de la función se muestrea aleatoriamente (“explore”) y la optimización progresa al enfocar las muestras futuras en regiones del dominio donde la función ha devuelto valores pequeños (“exploit”). Si bien este enfoque es ineficientemente ineficaz en las funciones convexas (utilice 1 o 2 en su lugar), puede proporcionar una solución razonable en muchas funciones no convexas (“resistentes”). Entre estos algoritmos, se debe mencionar el recocido simulado porque es muy básico e instructivo. Personalmente, soy un fanático de la estrategia evolutiva de adaptación de matriz de covarianza (CMA-ES), porque utiliza el hermoso truco para aprender una aproximación cuadrática local de la función basada en una muestra aleatoria, y luego NO toma el camino más empinado , pero explora la planitud en su lugar.

Debe utilizar los distintos tipos de estructuras de datos y algoritmos, por ejemplo, fusionar, ordenar, ordenar rápidamente, ordenar burbujas, etc., y cuándo son las mejores situaciones para usarlos. También debe saber cuáles de sus herramientas usar para resolver problemas particulares, por ejemplo, elegir el idioma correcto, las bases de datos para usar en un proyecto en particular. Idealmente, debe saber un poco sobre la arquitectura de varios tipos de computadoras para saber para qué está creando aplicaciones y cómo el hardware afectará la forma en que la aplicación funcionará para el usuario final.