Como Paulo afirma, sem mais informações, é difícil dar conselhos sem suposições.
Com 10 a 20 variáveis e avaliações de funções caras, a tendência é recomendar algoritmos de otimização sem derivadas. Discordo totalmente do conselho de Paul: você geralmente precisa de um gradiente de precisão de máquina, a menos que esteja usando algum tipo de método especial (por exemplo, a descida estocástica de gradiente no aprendizado de máquina explorará a forma do objetivo de chegar a uma conclusão razoável. estimativas de gradiente).
Cada etapa quase-Newton terá a forma:
H~( xk) dk= - ∇ f( xk) ,
onde é alguma aproximação da matriz de Hesse, d k é o sentido de pesquisa, x k é o valor das variáveis de decisão na iteração corrente, f é a sua função de objectivo, e ∇ f é o gradiente de seu objetivo, eo variáveis de decisão são atualizadas como x k + 1 = x k + α k d k , em que α kH~dkxkf∇ fxk + 1= xk+ αkdkαké um tamanho de etapa determinado de alguma forma (como uma pesquisa de linha). Você pode se aproximar do Hessian de determinadas maneiras e suas iterações convergirão, embora se você usar algo como aproximações de diferenças finitas do Hessian por meio de gradientes exatos, poderá sofrer problemas devido a problemas de condicionamento. Normalmente, o Hessian é aproximado usando o gradiente (por exemplo, métodos do tipo BFGS com atualizações de nível 1 no Hessian).
Aproximar o Hessian e o gradiente através de diferenças finitas é uma péssima idéia por várias razões:
- você terá erro no gradiente, então o método quase-Newton que você está aplicando é semelhante a encontrar a raiz de uma função barulhenta
- se as avaliações de função forem caras e você estiver tentando avaliar um gradiente em relação a variáveis, isso custará a você N avaliações de função por iteraçãoNN
- se você tiver erro no gradiente, terá mais erro no seu Hessian, o que é um grande problema em termos do condicionamento do sistema linear
- ... e custará avaliações de função de por iteraçãoN2
Portanto, para obter uma iteração ruim de quase-Newton, você está fazendo algo como até 420 avaliações de funções a 30 minutos por avaliação, o que significa que você estará esperando um pouco por cada iteração ou vai precisa de um grande cluster apenas para as avaliações de funções. As soluções lineares reais serão de 20 por 20 matrizes (no máximo!), Portanto não há razão para paralelizar essas. Se você pode obter informações de gradiente, por exemplo, resolvendo um problema conjunto, pode valer mais a pena; nesse caso, pode valer a pena olhar para um livro como Nocedal & Wright.
Se você for fazer várias avaliações de funções em paralelo, deve considerar abordagens de modelagem substitutas ou gerar métodos de pesquisa de conjuntos antes de considerar abordagens quase-Newton. Os artigos de revisão clássica são os de Rios e Sahinidis sobre métodos sem derivativos , publicados em 2012 e oferecem uma comparação realmente boa e ampla; o artigo de benchmarking de More e Wild de 2009; o livro de 2009 "Introdução à otimização sem derivativos", de Conn, Scheinberg e Vicente; e o artigo de revisão sobre geração de métodos de pesquisa de conjuntos de Kolda, Lewis e Torczon de 2003.
Conforme vinculado acima, o pacote de software DAKOTA implementará alguns desses métodos, assim como o NLOPT , que implementa o DIRECT, e alguns dos métodos de modelagem substitutos de Powell. Você também pode dar uma olhada no MCS ; está escrito em MATLAB, mas talvez você possa portar a implementação do MATLAB para o idioma de sua escolha. O DAKOTA é essencialmente uma coleção de scripts que você pode usar para executar sua simulação cara e coletar dados para algoritmos de otimização, e o NLOPT possui interfaces em um grande número de linguagens; portanto, a escolha da linguagem de programação não deve ser um grande problema no uso de nenhum pacote de software; O DAKOTA demora um pouco para aprender, e possui uma enorme quantidade de documentação para filtrar.