Atualmente, estou tentando resolver um problema de minimização com restrições não-lineares, conforme implementado na função matlab "fmincon". Minhas expectativas são: minimizar (fun1, x0, uB, lB, fun2) onde x0 é o estado inicial, fun1 é uma função que precisa ser minimizada, uB são limites superiores, lB são limites inferiores e lB são limites inferiores e fun2 é uma função que fornece vetores de igualdade não linear / desigualdades, conforme descrito em http://www.mathworks.com/help/optim/ug/fmincon.htmlcomo função nonlcon. Esses vetores também estão mudando através de iterações (eles são não linearmente dependentes de x_n, n-ésima iteração do vetor de solução). Na implementação do matlab, eles estão no formato c (x) <= 0. Este é o último pedaço de código que precisa ser portado do matlab para c ++ e tenho lutado bastante ao tentar encontrar a biblioteca c ++ apropriada que contenha esse algoritmo. É por isso que estou procurando ajuda aqui e gostaria muito que você pudesse fornecer seus conhecimentos.
Um bom exemplo do que eu quero fazer é o primeiro desta página http://www.mathworks.com/help/optim/ug/constrained-nonlinear-optimization-examples.html#f10960?s_tid=doc_12b A única diferença é que eu precisa de limites também ...
Desde já, obrigado.
Pedro
fonte
Respostas:
Se sua função não for diferenciável, você deve ter cuidado com o uso de diferenças finitas. Se você deseja usar informações derivadas, sua melhor aposta é provavelmente algum tipo de método semântico de tipo Newton. Um conjunto de notas descrevendo esses métodos pode ser encontrado aqui .
Doze a trinta variáveis provavelmente estão na extremidade superior do que é possível com os métodos de pesquisa de padrões (também chamados de pesquisa direta). Um artigo de revisão recente de Rios e Sahinidis no Journal of Global Optimization sobre métodos de otimização sem derivativos (como métodos de pesquisa de padrões) pode ser encontrado aqui , juntamente com uma página da web complementar . Um artigo de revisão menos recente sobre esses métodos de Kolda, Lewis e Torczon no SIAM Review pode ser encontrado aqui . Esses métodos funcionam razoavelmente bem com avaliações de funções caras e não exigem necessariamente diferenciabilidade ou informações derivadas.
Muitos desses métodos requerem algum tipo de convexidade para garantir a convergência para o ideal global; portanto, se você resolver seu problema rigorosamente, poderá ser necessário associar esses métodos acima com uma estratégia de ramificação e limite. No entanto, se você não se importa com o rigor, uma abordagem como a do MATLAB
fmincon
pode funcionar bem o suficiente (não há mais garantias). As diferenças finitas provavelmente fornecerão a você um membro do subdiferencial de sua função não diferenciável, o que pode ser suficiente para a instância do problema e dados de entrada específicos para retornar um resultado suficientemente preciso para seus propósitos. Nesse caso, você provavelmente deve olhar para as bibliotecas mencionadas nas respostas à pergunta que Christian vinculou em seu comentário.fonte
Se tudo o que você precisa é de uma biblioteca C ++ para resolver problemas de otimização não linear, você pode usar o RobOptim . Embora o RobOptim tenha sido desenvolvido inicialmente com os problemas de otimização da robótica em mente, ele é adequado para qualquer problema de otimização não linear. Ele fornece uma interface C ++ simples com plug-ins para vários solucionadores não-lineares ( Ipopt , NAG , etc.). O uso desse tipo de invólucro facilita o uso de outro solucionador de PNL. Se você não pode fornecer gradientes, o cálculo de diferenças finitas pode ser feito automaticamente.
É de código aberto para que você possa conferir o código-fonte no GitHub: https://github.com/roboptim/
A análise feita por Geoff Oxberry é essencial para a escolha do solucionador não-linear que será chamado pelo RobOptim. Observe que, ao lidar com esse tipo de solução, o ajuste de parâmetros pode ter um enorme impacto no desempenho e você ainda pode ficar preso em mínimas locais (isso realmente depende do tipo de problema com o qual está lidando).
Nota: Eu sou um dos desenvolvedores deste projeto.
fonte