Vorrei suggerire un approccio un po 'diverso rispetto alle altre risposte, sebbene @barron abbia discusso indirettamente la stessa cosa.
Invece di ottimizzare direttamente la tua funzione, cioè valutandola in una serie di punti punti che (si spera) convergono in un (locale) ottimale, potresti usare il concetto di modellazione surrogata , che è molto adatto a problemi del tipo che descrivi (alto costo, liscio, limitato, di bassa dimensione, cioè meno di 20 incognite).X1, x2, ... , xKmodellazione surrogata
In particolare, la modellazione surrogato funziona attraverso la creazione di una funzione di modello di della vostra vera funzione f ∈ R d → R . La chiave è che mentre c ovviamente non rappresenta perfettamente f , è molto più economico da valutare.c ∈ Rd→ Rf∈ Rd→ Rcf
Quindi, un tipico processo di ottimizzazione sarebbe il seguente:
- Valuta in un set di j punti iniziali x 1 , x 2 , … , x j . Si noti che i derivati non sono necessari. Si noti inoltre che questi punti dovrebbero essere distribuiti uniformemente in tutto lo spazio di ricerca, ad esempio tramite il campionamento latino Hypercube o un design simile di riempimento dello spazio.fjX1, x2, ... , xj
- Sulla base di questo set di dati originale, creare una funzione modello . È possibile utilizzare la convalida incrociata per convalidare il modello (ovvero utilizzare solo un sottoinsieme dei punti j originali per creare c , quindi utilizzare il resto del set di dati per verificare se c prevede tali valori)cjcc
- Utilizzare un criterio come il criterio di miglioramento atteso (EI) per scoprire dove "compilare" più campioni per rendere più accurato campionando f . Questo è in realtà molto meglio studiato teoricamente di quanto possa sembrare, e il criterio EI è molto ben studiato. Anche il criterio EI non è un criterio avido, quindi entrambi ottenete un buon miglioramento generale dell'accuratezza del modello, dando priorità all'accuratezza vicino a potenziali optima.cf
- Se il tuo modello non è abbastanza preciso, ripeti il passaggio 3, altrimenti usa la tua routine di ottimizzazione preferita per trovare l'ottimale di , che sarà molto economico da valutare (in modo da poter usare qualsiasi routine che desideri, anche quelle che richiedono derivati, o semplicemente valutare la funzione in una mesh sottile).c
In generale, questo è ciò che si intende per EGO, l'ottimizzazione globale efficiente, come suggerito da @barron. Vorrei sottolineare che per la tua applicazione, questo sembra perfettamente adatto: ottieni un modello sorprendentemente accurato basato su relativamente poche valutazioni di e puoi quindi utilizzare qualsiasi algoritmo di ottimizzazione che desideri. Ciò che spesso è anche interessante è che ora puoi valutare c su una mesh e tracciarla, ottenendo così una visione dell'aspetto generale di f . Un altro punto interessante è che la maggior parte delle tecniche di modellazione surrogata fornisce anche stime di errori statistici, consentendo così la stima dell'incertezza.fcf
Come costruire è ovviamente una domanda aperta, ma spesso vengono usati i modelli di Kriging o i cosiddetti space mapping.c
Ovviamente, tutto questo è un bel po 'di lavoro di programmazione, ma molte altre persone hanno fatto ottime implementazioni. In Matlab, conosco solo la toolbox del software DACE DACE è gratuita. TOMLAB potrebbe anche offrire un pacchetto Matlab, ma costa denaro, tuttavia, credo che funzioni anche in C ++ e abbia molte più capacità di quelle che DACE avrà mai. (Nota: sono uno degli sviluppatori della nuova versione di DACE, che sarà presto rilasciata, che offrirà un supporto aggiuntivo per EGO.)
Spero che questa visione d'insieme ti abbia aiutato, per favore fai delle domande se ci sono punti che possono essere chiariti o cose che mi sono perso, o se desideri ulteriore materiale sull'argomento.