Libreria C ++ per minimizzazione vincolata non lineare


9

Attualmente sto cercando di risolvere il problema di minimizzazione vincolata non lineare come implementato nella funzione "fmincon" di matlab. Le mie aspettative sono minimizzare (fun1, x0, uB, lB, fun2) dove x0 è lo stato iniziale, fun1 è la funzione che deve essere minimizzata, uB sono i limiti superiori, lB sono limiti inferiori e fun2 è la funzione che fornisce vettori di uguaglianze non lineari / disparità come descritto in http://www.mathworks.com/help/optim/ug/fmincon.htmlcome funzione nonlcon. Questi vettori cambiano anche attraverso iterazioni (dipendono in modo non lineare da x_n, n-esima iterazione del vettore della soluzione). Nell'implementazione di matlab sono in una forma c (x) <= 0. Questo è l'ultimo pezzo di codice che deve essere portato da Matlab a C ++ e ho avuto molte difficoltà mentre cercavo di trovare la libreria C ++ appropriata contenente questo algoritmo. Questo è il motivo per cui sto cercando aiuto qui e apprezzerei molto se tu potessi fornire la tua esperienza.

Un buon esempio di ciò che voglio fare è il primo in questa pagina http://www.mathworks.com/help/optim/ug/constrained-nonlinear-optimization-examples.html#f10960?s_tid=doc_12b L' unica differenza è che I bisogno anche di confini ...

Grazie in anticipo.

Peter


Esiste la possibilità di utilizzare NLOPT ab-initio.mit.edu/wiki/index.php/NLopt_C-plus-plus_Reference ma avrei bisogno di calcolare le differenze finite usando più chiamate alla valutazione della funzione "minimizzata" dalla funzione obiettivo ed ero gentile di sperare che ciò venga curato dall'algoritmo stesso per migliorare le prestazioni. La mia funzione minimizzata è davvero costosa da calcolare. Giusto per chiarire, la funzione minimizzata è la verosimiglianza logaritmica del modello stimato con dati originali nella stima del modello di commutazione markov di serie temporali.
Peter Kottas,

1
Hai esaminato le risposte a questa domanda ? Se i tuoi requisiti non sono sufficientemente affrontati lì, dovresti modificare la tua domanda per segnalarli al fine di ottenere consigli utili.
Christian Clason,

Grazie, ci sono alcune informazioni utili lì. Attualmente sono all'altezza dei gomiti nella libreria NLOPT da quando ho scoperto che potrebbe adattarsi anche al mio problema. Terrò questo argomento pubblicato e fornirò una soluzione quando ne avrò uno. Qualsiasi aiuto che potrebbe rendere il processo più veloce è ancora apprezzato. Implementazione effettiva, ad esempio, ecc.
Peter Kottas,

1
Diverse domande: 1. Il tuo problema è convesso? 2. Obiettivo e vincoli sono differenziabili? Se è così, quante volte? Una volta? Due volte? 3. Puoi calcolare facilmente quei derivati, se esistono? Le approssimazioni alle differenze finite sarebbero facili da calcolare se non si dispone di tali derivati ​​prontamente disponibili? 4. Quante variabili decisionali hai? (cioè su quante variabili stai cercando di minimizzare?) Una stima approssimativa sarebbe sufficiente. 5. Le valutazioni delle funzioni sono costose? Sarebbe utile avere tutte queste informazioni per darti una risposta migliore.
Geoff Oxberry,

Ciao! Prima di tutto, grazie per la risposta. 1. Difficile da dire, ma molto probabilmente no, perché la funzione minimizzata è la verosimiglianza log tra la valutazione del modello di commutazione markov delle multiproprietà nell'applicazione finanziaria e dalla sua natura presumo una sorta di output rumoroso. 2.no 3.solo usando le differenze finite 4.Il vettore di soluzione è composto da n variabili in cui n dipende dai parametri desiderati dei modelli, in generale da 12 a diciamo 30 5. la probabilità di log tra modello e dati originali è costosa, ulteriori disuguaglianze non lineari sono ottimisti da calcolare
Peter Kottas il

Risposte:


2

Se la tua funzione non è differenziabile, dovresti fare attenzione a come usi le differenze finite. Se si desidera utilizzare le informazioni derivate, la soluzione migliore è probabilmente una sorta di metodo di tipo Newton semisticooth. Un insieme di note che descrivono tali metodi può essere trovato qui .

Le variabili da dodici a trenta sono probabilmente all'estremità superiore di ciò che è possibile fare con i metodi di ricerca dei modelli (anche chiamati ricerca diretta). Un recente articolo di revisione di Rios e Sahinidis sul Journal of Global Optimization sui metodi di ottimizzazione senza derivati ​​(come i metodi di ricerca dei modelli) può essere trovato qui , insieme a una pagina web di accompagnamento . Un documento di revisione meno recente su questi metodi di Kolda, Lewis e Torczon in SIAM Review è disponibile qui . Questi metodi funzionano abbastanza bene con costose valutazioni delle funzioni e non richiedono necessariamente informazioni sulla differenziabilità o sui derivati.

Molti di questi metodi richiedono una sorta di convessità per garantire la convergenza all'ottimale globale, quindi se si dovesse risolvere il problema in modo rigoroso, potrebbe essere necessario accoppiare questi metodi sopra con una strategia diramata. Tuttavia, se non ti interessa il rigore, un approccio come quello di MATLAB fminconpotrebbe funzionare abbastanza bene (non ci sono più garanzie). Le differenze finite molto probabilmente ti daranno un membro della sottodifferenziale della tua funzione non distinguibile, che potrebbe essere sufficiente per l'istanza del problema e particolari dati di input per restituire un risultato sufficientemente accurato per i tuoi scopi. In tal caso, dovresti probabilmente guardare le biblioteche citate nelle risposte alla domanda che Christian ha inserito nel suo commento.


2

Se tutto ciò che serve è una libreria C ++ per risolvere problemi di ottimizzazione non lineare, è possibile utilizzare RobOptim . Sebbene RobOptim sia stato inizialmente sviluppato pensando ai problemi di ottimizzazione della robotica, è adatto a qualsiasi problema di ottimizzazione non lineare. Fornisce una semplice interfaccia C ++ con plugin per più solutori non lineari ( Ipopt , NAG , ecc.). L'uso di questo tipo di wrapper semplifica l'utilizzo di un altro risolutore NLP. Se non è possibile fornire gradienti, il calcolo delle differenze finite può essere eseguito automaticamente.

È open source, quindi puoi controllare il codice sorgente su GitHub: https://github.com/roboptim/

L'analisi fatta da @Geoff Oxberry è essenziale per la scelta del solutore non lineare che verrà chiamato da RobOptim. Si noti che quando si ha a che fare con quel tipo di solutori, l'ottimizzazione dei parametri può avere un impatto enorme sulle prestazioni e si può ancora rimanere bloccati nelle minimas locali (dipende davvero dal tipo di problema che si sta affrontando).

Nota: sono uno degli sviluppatori di questo progetto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.