Como dice Paul, sin más información, es difícil dar consejos sin suposiciones.
Con 10-20 variables y costosas evaluaciones de funciones, la tendencia es recomendar algoritmos de optimización sin derivados. Voy a estar en total desacuerdo con el consejo de Paul: generalmente necesita un gradiente de precisión mecánica a menos que esté utilizando algún tipo de método especial (por ejemplo, el descenso de gradiente estocástico en el aprendizaje automático explotará la forma del objetivo para llegar a un nivel razonable estimaciones de gradiente).
Cada paso cuasi-Newton tendrá la forma:
H~( xk) dk= - ∇ f( xk) ,
donde es una aproximación de la matriz de Hesse, d k es la dirección de búsqueda, x k es el valor de las variables de decisión en la iteración actual, f es su función objetivo y ∇ f es el gradiente de su objetivo, y el las variables de decisión se actualizan como x k + 1 = x k + α k d k , donde α kH~rekXkF∇ fXk + 1= xk+ αkrekαkes un tamaño de paso determinado de alguna manera (como una búsqueda de línea). Puede salirse con la aproximación de la arpillera de ciertas maneras y sus iteraciones convergerán, aunque si usa algo como aproximaciones de diferencia finita de la arpillera a través de gradientes exactos, puede sufrir problemas debido al mal acondicionamiento. Típicamente, el Hessian se aproxima usando el gradiente (por ejemplo, métodos de tipo BFGS con actualizaciones de rango 1 al Hessian).
Aproximar el hessiano y el gradiente a través de diferencias finitas es una mala idea por varias razones:
- tendrá un error en el gradiente, por lo que el método cuasi-Newton que está aplicando es similar a encontrar la raíz de una función ruidosa
- Si las evaluaciones de funciones son costosas y está intentando evaluar un gradiente con respecto a variables, le costará N evaluaciones de funciones por iteraciónnortenorte
- Si tiene un error en el gradiente, tendrá más errores en su Hesse, lo cual es un gran problema en términos del condicionamiento del sistema lineal.
- ... y le costará evaluaciones de la función por iteraciónnorte2
Entonces, para obtener una mala iteración de cuasi-Newton, estás haciendo algo así como hasta 420 evaluaciones de funciones en 30 minutos por evaluación, lo que significa que estarás esperando un tiempo para cada iteración, o vas a necesita un gran clúster solo para las evaluaciones de funciones. Las soluciones lineales reales serán de 20 por 20 matrices (¡a lo sumo!), Por lo que no hay razón para paralelizarlas. Si puede obtener información de gradiente, por ejemplo, resolviendo un problema adjunto, entonces podría valer más la pena, en cuyo caso, podría valer la pena mirar un libro como Nocedal & Wright.
Si va a hacer muchas evaluaciones de funciones en paralelo, debería considerar los enfoques de modelado sustituto o generar métodos de búsqueda establecidos antes de considerar los enfoques cuasi-Newton. Los artículos de revisión clásicos son los de Rios y Sahinidis sobre métodos sin derivados , que se publicó en 2012 y ofrece una comparación amplia y realmente buena; el artículo de evaluación comparativa de More and Wild de 2009; el libro de texto de 2009 "Introducción a la optimización sin derivados" de Conn, Scheinberg y Vicente; y el artículo de revisión sobre métodos de búsqueda de grupos electrógenos de Kolda, Lewis y Torczon de 2003.
Como se vincula anteriormente, el paquete de software DAKOTA implementará algunos de esos métodos, y también NLOPT , que implementa DIRECT, y algunos de los métodos de modelado sustitutos de Powell. También puede echar un vistazo a MCS ; está escrito en MATLAB, pero tal vez pueda portar la implementación de MATLAB al idioma que elija. DAKOTA es esencialmente una colección de scripts que puede usar para ejecutar su costosa simulación y recopilar datos para algoritmos de optimización, y NLOPT tiene interfaces en una gran cantidad de idiomas, por lo que la elección del lenguaje de programación no debería ser un gran problema al usar cualquiera de los paquetes de software; Sin embargo, DAKOTA lleva un tiempo aprender y tiene una gran cantidad de documentación para examinar.