Actualmente estoy tratando de resolver el problema de minimización restringida no lineal implementado en la función matlab "fmincon". Mis expectativas son, minimizar (fun1, x0, uB, lB, fun2) donde x0 es el estado inicial, fun1 es una función que debe minimizarse, uB son límites superiores, lB son límites inferiores y fun2 es una función que proporciona vectores de igualdades no lineales / desigualdades como se describe en http://www.mathworks.com/help/optim/ug/fmincon.htmlcomo no noncon Estos vectores también están cambiando a través de iteraciones (no dependen linealmente de x_n, n-ésima iteración del vector solución). En la implementación de matlab están en una forma c (x) <= 0. Este es el último fragmento de código que necesita ser portado de matlab a c ++ y he estado luchando mucho mientras trataba de encontrar la biblioteca de c ++ apropiada que contenga este algoritmo. Es por eso que estoy buscando ayuda aquí y agradecería mucho si pudiera proporcionar su experiencia.
Un buen ejemplo de lo que quiero hacer es el primero en esta página http://www.mathworks.com/help/optim/ug/constrained-nonlinear-optimization-examples.html#f10960?s_tid=doc_12b La única diferencia es que yo necesita límites también ...
Gracias por adelantado.
Peter
fuente
Respuestas:
Si su función no es diferenciable, debe tener cuidado con la forma en que usa las diferencias finitas. Si desea utilizar información derivada, su mejor opción es probablemente algún tipo de método de tipo Newton semi-liso. Un conjunto de notas que describen tales métodos se puede encontrar aquí .
De doce a treinta variables probablemente se encuentren en el extremo superior de lo que se puede hacer con los métodos de búsqueda de patrones (también llamados búsqueda directa). Aquí se puede encontrar un artículo de revisión reciente de Rios y Sahinidis en Journal of Global Optimization sobre métodos de optimización sin derivados (como los métodos de búsqueda de patrones) , junto con una página web complementaria . Aquí se puede encontrar un artículo de revisión menos reciente sobre estos métodos por Kolda, Lewis y Torczon en SIAM Review . Estos métodos funcionan bastante bien con evaluaciones de funciones costosas y no requieren necesariamente diferenciabilidad o información derivada.
Muchos de estos métodos requieren algún tipo de convexidad para garantizar la convergencia al óptimo global, por lo tanto, si tuviera que resolver su problema rigurosamente, es posible que necesite unir estos métodos anteriormente con una estrategia de bifurcación. Sin embargo, si no te importa el rigor, un enfoque como el de MATLAB
fmincon
podría funcionar lo suficientemente bien (ya no hay garantías). Es muy probable que las diferencias finitas le brinden un miembro del subdireccional de su función no diferenciable, lo que podría ser suficiente para que su instancia de problema y datos de entrada particulares devuelvan un resultado suficientemente preciso para sus propósitos. En ese caso, probablemente debería mirar las bibliotecas mencionadas en las respuestas a la pregunta que Christian enlazó en su comentario.fuente
Si todo lo que necesita es una biblioteca C ++ para resolver problemas de optimización no lineal, puede usar RobOptim . Aunque RobOptim se desarrolló inicialmente teniendo en cuenta los problemas de optimización robótica, es adecuado para cualquier problema de optimización no lineal. Proporciona una interfaz C ++ simple con complementos para múltiples solucionadores no lineales ( Ipopt , NAG , etc.). El uso de ese tipo de envoltorios facilita el uso de otro solucionador de PNL. Si no puede proporcionar gradientes, el cálculo de diferencias finitas se puede hacer automáticamente.
Es de código abierto, por lo que puede consultar el código fuente en GitHub: https://github.com/roboptim/
El análisis realizado por @Geoff Oxberry es esencial para la elección del solucionador no lineal que llamará RobOptim. Tenga en cuenta que cuando se trata con ese tipo de solucionadores, el ajuste de parámetros puede tener un gran impacto en el rendimiento y aún puede quedar atrapado en las minimas locales (realmente depende del tipo de problema con el que esté lidiando).
Nota: Soy uno de los desarrolladores de este proyecto.
fuente