Sto cercando di implementare l'algoritmo Nelder-Mead per ottimizzare una funzione. La pagina di Wikipedia su Nelder-Mead è sorprendentemente chiara sull'intero algoritmo, ad eccezione del suo criterio di arresto. Lì dice tristemente:
Verificare la convergenza [chiarimento necessario] .
Ho provato e testato un paio di criteri me stesso:
Fermati se dove è piccolo e dove è l' -vertice del simplex, ordinato dal basso ( ) all'alto ( ) valori della funzione. In altre parole, quando il valore massimo del simplex è quasi uguale al valore minimo. Ho scoperto che questo non ha funzionato correttamente, dal momento che questo non fornisce garanzie su ciò che la funzione fa all'interno del simplex. Esempio, considera la funzione: Questo è ovviamente banale da ottimizzare, ma diciamo che lo facciamo con NM, e lascia che i nostri due punti simplex siano eϵ x i i f ( x 1 ) f ( x N + 1 ) f ( x ) = x 2 x 1 = - 1 x 2 = 1
. L'algoritmo converrebbe qui senza trovare il suo ottimale.La seconda opzione prevede la valutazione del centroide del simplex: stop if . Ciò presuppone che se il punto più basso del simplex e del centroide hanno valori simili, il simplex è sufficientemente piccolo da chiamare convergenza.
È questo un modo corretto per verificare la convergenza? O esiste un modo stabilito per verificarlo? Non ho trovato alcuna fonte su questo, dal momento che la maggior parte dei risultati della ricerca si concentra sulla complessità dell'algoritmo.