J'essaie actuellement de résoudre le problème de minimisation contraint non linéaire tel qu'implémenté dans la fonction matlab "fmincon". Mes attentes sont, minimiser (fun1, x0, uB, lB, fun2) où x0 est l'état initial, fun1 est une fonction qui doit être minimisée, uB sont des limites supérieures, lB sont des limites inférieures et fun2 est une fonction qui fournit des vecteurs d'égalités non linéaires / inégalités comme décrit dans http://www.mathworks.com/help/optim/ug/fmincon.htmlcomme fonction nonlcon. Ces vecteurs évoluent également au cours des itérations (ils dépendent non linéairement de x_n, n-ième itération du vecteur solution). Dans l'implémentation de matlab, ils sont sous la forme c (x) <= 0. C'est le dernier morceau de code qui doit être porté de matlab vers c ++ et j'ai beaucoup de mal à essayer de trouver la bibliothèque c ++ appropriée contenant cet algorithme. C'est pourquoi je cherche de l'aide ici et j'apprécierais beaucoup si vous pouviez apporter votre expertise.
Un bon exemple de ce que je veux faire est le premier sur cette page http://www.mathworks.com/help/optim/ug/constrained-nonlinear-optimization-examples.html#f10960?s_tid=doc_12b La seule différence est que je besoin de limites aussi ...
Merci d'avance.
Peter
la source
Réponses:
Si votre fonction n'est pas différenciable, vous devez faire attention à la façon dont vous utilisez les différences finies. Si vous souhaitez utiliser des informations dérivées, votre meilleur pari est probablement une sorte de méthode semi-lisse de type Newton. Un ensemble de notes décrivant ces méthodes peut être trouvé ici .
Douze à trente variables sont probablement à l'extrémité supérieure de ce qui est faisable avec les méthodes de recherche de modèle (également appelées recherche directe). Un article de synthèse récent de Rios et Sahinidis dans Journal of Global Optimization sur les méthodes d'optimisation sans dérivé (telles que les méthodes de recherche de modèle) peut être trouvé ici , ainsi qu'une page Web complémentaire . Un article de revue moins récent sur ces méthodes par Kolda, Lewis et Torczon dans SIAM Review peut être trouvé ici . Ces méthodes fonctionnent assez bien avec des évaluations de fonctions coûteuses et ne nécessitent pas nécessairement de différenciation ou d'informations dérivées.
Beaucoup de ces méthodes nécessitent une sorte de convexité pour garantir la convergence vers l'optimum global, donc si vous deviez résoudre votre problème de manière rigoureuse, vous devrez peut-être coupler ces méthodes ci-dessus avec une stratégie de branchement et de liaison. Cependant, si vous ne vous souciez pas de la rigueur, une approche comme MATLAB
fmincon
pourrait fonctionner assez bien (il n'y a plus de garantie). Des différences finies vous donneront très probablement un membre de la sous-différence de votre fonction non différenciable, ce qui pourrait suffire à votre instance de problème et à des données d'entrée particulières pour retourner un résultat suffisamment précis pour vos besoins. Dans ce cas, vous devriez probablement consulter les bibliothèques mentionnées dans les réponses à la question liée à Christian dans son commentaire.la source
Si vous n'avez besoin que d'une bibliothèque C ++ pour résoudre les problèmes d'optimisation non linéaire, vous pouvez utiliser RobOptim . Même si RobOptim a été initialement développé avec des problèmes d'optimisation robotique à l'esprit, il convient à tous les problèmes d'optimisation non linéaire. Il fournit une interface C ++ simple avec des plugins pour plusieurs solveurs non linéaires ( Ipopt , NAG , etc.). L'utilisation de ce type d'encapsuleurs facilite l'utilisation d'un autre solveur NLP. Si vous ne pouvez pas fournir de dégradés, le calcul des différences finies peut être effectué automatiquement.
C'est open source, vous pouvez donc consulter le code source sur GitHub: https://github.com/roboptim/
L'analyse effectuée par @Geoff Oxberry est essentielle pour le choix du solveur non linéaire qui sera appelé par RobOptim. Notez que lorsque vous traitez ce type de solveurs, le réglage des paramètres peut avoir un impact énorme sur les performances, et vous pouvez toujours rester coincé dans les minimas locaux (cela dépend vraiment du type de problème que vous traitez).
Remarque: je suis l'un des développeurs de ce projet.
la source