Come afferma Paul, senza ulteriori informazioni, è difficile dare consigli senza ipotesi.
Con 10-20 variabili e costose valutazioni delle funzioni, la tendenza è quella di raccomandare algoritmi di ottimizzazione senza derivati. Non sarò molto d'accordo con il consiglio di Paul: generalmente hai bisogno di un gradiente di precisione automatica a meno che tu non stia usando una sorta di metodo speciale (per esempio, la discesa stocastica del gradiente nell'apprendimento automatico sfrutterà la forma dell'obiettivo per trovare ragionevole stime del gradiente).
Ogni passaggio di quasi Newton sarà nella forma:
H~( xK) dK= - ∇ f( xK) ,
dove è un'approssimazione della matrice hessiana, d k è la direzione di ricerca, x k è il valore delle variabili di decisione nell'iterata corrente, f è la funzione obiettivo e ∇ f è il gradiente del tuo obiettivo e il le variabili decisionali vengono aggiornate come x k + 1 = x k + α k d k , dove α kH~dKXKf∇ fXk + 1= xK+ αKdKαKè una dimensione del passo determinata in qualche modo (come una ricerca per riga). Puoi allontanarti dall'approssimazione dell'Assia in certi modi e le tue iterazioni convergeranno, sebbene se usi qualcosa come approssimazioni a differenza finita dell'Assia attraverso gradienti esatti, potresti soffrire di problemi a causa di mal condizionamento. Tipicamente, l'Assia viene approssimata usando il gradiente (ad esempio, i metodi di tipo BFGS con aggiornamenti di grado 1 sull'Assia).
L'approssimazione dell'Assia e del gradiente sia tramite differenze finite è una cattiva idea per una serie di motivi:
- avrai un errore nel gradiente, quindi il metodo quasi-Newton che stai applicando è simile a trovare la radice di una funzione rumorosa
- se le valutazioni delle funzioni sono costose e stai cercando di valutare un gradiente rispetto a variabili, ti costerà N valutazioni di funzione per iterazioneNN
- se hai un errore nel gradiente, avrai più errore nel tuo Hessian, che è un grosso problema in termini di condizionamento del sistema lineare
- ... e ti costerà valutazioni di funzione per iterazioneN2
Quindi, per ottenere una brutta iterazione di quasi-Newton, stai facendo qualcosa come fino a 420 valutazioni di funzioni a 30 minuti per valutazione, il che significa che stai aspettando un po 'per ogni iterazione, o stai per serve un grande cluster solo per le valutazioni delle funzioni. Gli effettivi risolti lineari saranno di 20 per 20 matrici (al massimo!), Quindi non c'è motivo di parallelizzarli. Se puoi ottenere informazioni sul gradiente, ad esempio risolvendo un problema aggiuntivo, allora potrebbe essere più utile, nel qual caso, vale la pena guardare un libro come Nocedal & Wright.
Se hai intenzione di fare molte valutazioni di funzioni in parallelo, dovresti invece esaminare approcci di modellazione surrogata o generare metodi di ricerca set prima di considerare approcci quasi-Newton. I classici articoli di revisione sono quelli di Rios e Sahinidis sui metodi privi di derivati , che sono stati pubblicati nel 2012 e offrono un confronto davvero ampio e ampio; l'articolo di benchmarking di More e Wild del 2009; il libro di testo del 2009 "Introduzione all'ottimizzazione senza derivati" di Conn, Scheinberg e Vicente; e l' articolo di revisione sulla generazione di metodi di ricerca impostati da Kolda, Lewis e Torczon dal 2003.
Come indicato sopra, il pacchetto software DAKOTA implementerà alcuni di questi metodi, così come NLOPT , che implementa DIRECT, e alcuni dei metodi di modellazione surrogata di Powell. Potresti anche dare un'occhiata a MCS ; è scritto in MATLAB, ma forse puoi portare l'implementazione di MATLAB nella lingua che preferisci. DAKOTA è essenzialmente una raccolta di script che puoi usare per eseguire la tua costosa simulazione e raccogliere dati per algoritmi di ottimizzazione, e NLOPT ha interfacce in un gran numero di lingue, quindi la scelta del linguaggio di programmazione non dovrebbe essere un grosso problema nell'uso di entrambi i pacchetti software; DAKOTA impiega un po 'di tempo per imparare, e ha una grande quantità di documentazione da esaminare.