Lavoro in un laboratorio che esegue l'ottimizzazione globale di problemi di numero intero e non convesso. La mia esperienza con i risolutori dell'ottimizzazione open source è stata che i migliori sono in genere scritti in un linguaggio compilato e hanno un prezzo mediocre rispetto ai pacchetti di ottimizzazione commerciale.
Se riesci a formulare il tuo problema come un sistema esplicito di equazioni e hai bisogno di un risolutore gratuito, la tua scommessa migliore è probabilmente IPOPT, come ha detto Aron. Altri solutori gratuiti sono disponibili sul sito web COIN-OR . Per quanto ne so, i solutori non lineari non hanno i collegamenti Python forniti dagli sviluppatori; tutti gli attacchi che trovi sarebbero di terze parti. Per ottenere buone soluzioni, dovresti anche avvolgere qualsiasi risolutore convesso non lineare che hai trovato nell'euristica stocastica di ottimizzazione globale appropriata o in un algoritmo di ottimizzazione globale deterministico come branch-and-bound. In alternativa, è possibile utilizzare Bonmin o Couenne, entrambi risolutori di ottimizzazione non convessi deterministici che offrono prestazioni utili rispetto al solutore all'avanguardia, BARON .
Se è possibile acquistare un solutore di ottimizzazione commerciale, è possibile considerare il linguaggio di modellazione GAMS , che include numerosi solutori di ottimizzazione non lineari. Di particolare menzione sono le interfacce con i risolutori CONOPT, SNOPT e BARON. (CONOPT e SNOPT sono risolutori convessi). Una soluzione kludgey che ho usato in passato è usare i binding del linguaggio Fortran (o Matlab) su GAMS per scrivere un file GAMS e chiamare GAMS da Fortran (o Matlab) per calcolare il soluzione di un problema di ottimizzazione. GAMS ha i collegamenti al linguaggio Python e uno staff di supporto molto reattivo pronto ad aiutare in caso di problemi. (Dichiarazione di non responsabilità: non ho alcuna affiliazione con GAMS, ma il mio laboratorio possiede una licenza GAMS.) I risolutori commerciali non dovrebbero essere peggiori difmincon
; in effetti, sarei sorpreso se non fossero molto meglio. Se i tuoi problemi sono sufficientemente piccoli, potresti non dover acquistare una licenza GAMS e le licenze per i risolutori, perché una copia di valutazione di GAMS potrebbe essere scaricata dal loro sito web. Altrimenti, probabilmente vorrai decidere quali solutori acquistare insieme a una licenza GAMS. Vale la pena notare che BARON richiede un risolutore di programmazione lineare a numeri misti e che le licenze per i due migliori solutori di programmazione lineare a numeri misti CPLEX e GUROBI sono gratuite per gli accademici, quindi potresti essere in grado di cavartela semplicemente acquistando le interfacce GAMS rispetto alle interfacce e alle licenze del risolutore, che possono farti risparmiare parecchi soldi.
Questo punto merita di essere ripetuto: per qualsiasi risolutore deterministico di ottimizzazione non convessa che ho menzionato sopra, devi essere in grado di formulare il modello come un insieme esplicito di equazioni. Altrimenti, gli algoritmi di ottimizzazione non convessa non funzioneranno, perché tutti si basano sull'analisi simbolica per costruire rilassamenti convessi per algoritmi di tipo branch-and-bound.
AGGIORNAMENTO: Un pensiero che all'inizio non mi era venuto in mente era che potevi anche chiamare Toolkit for Advanced Optimization ( TAO ) e PETSc usando tao4py e petsc4py , che avrebbero il potenziale vantaggio aggiuntivo di una più facile parallelizzazione e di sfruttare la familiarità con PETSc e gli strumenti ACTS .
AGGIORNAMENTO N. 2: in base alle informazioni aggiuntive menzionate, i metodi di programmazione sequenziale quadratica (SQP) saranno la soluzione migliore. I metodi SQP sono generalmente considerati più robusti rispetto ai metodi a punti interni, ma presentano lo svantaggio di richiedere solide soluzioni lineari. Dato che ti preoccupi più della robustezza che della velocità, SQP sarà la tua scommessa migliore. Non riesco a trovare un buon risolutore SQP là fuori scritto in Python (e apparentemente, nemmeno Sven Leyffer ad Argonne in questo rapporto tecnico ). Immagino che gli algoritmi implementati in pacchetti come SciPy e OpenOpt abbiano lo scheletro di base di alcuni algoritmi SQP implementati, ma senza l'euristica specializzata che i codici più avanzati usano per superare i problemi di convergenza. Puoi provare NLopt, scritto da Steven Johnson al MIT. Non ho grandi speranze perché non ha alcuna reputazione che io conosca, ma Steven Johnson è un ragazzo brillante che scrive un buon software (dopo tutto, ha co-scritto FFTW). Implementa una versione di SQP; se è un buon software, fammi sapere.
Speravo che TAO avrebbe avuto qualcosa di simile a un risolutore di ottimizzazione vincolato, ma non è così. Potresti certamente usare ciò che hanno per costruirne uno; hanno molti componenti lì. Come hai sottolineato, tuttavia, sarebbe molto più lavoro per te farlo, e se stai andando a quel tipo di problemi, potresti anche essere uno sviluppatore TAO.
Con queste informazioni aggiuntive, è più probabile che tu ottenga risultati migliori chiamando GAMS da Python (se è un'opzione) o provando a rattoppare l'interfaccia IPOPT Python. Poiché IPOPT utilizza un metodo di punti interni, non sarà così robusto, ma forse l'implementazione di Andreas di un metodo di punti interni è notevolmente migliore dell'implementazione di SQP di Matlab, nel qual caso, potresti non sacrificare affatto la robustezza. Dovresti eseguire alcuni casi studio per saperlo con certezza.
Sei già consapevole del trucco per riformulare i vincoli di disuguaglianza razionale come vincoli di disuguaglianza polinomiale (è nel tuo libro); il motivo per cui ciò aiuterebbe BARON e alcuni altri risolutori non convessi è che può utilizzare l'analisi dei termini per generare ulteriori disuguaglianze valide che può utilizzare come tagli per migliorare e accelerare la convergenza del risolutore.
Escludendo i collegamenti GAMS Python e l'interfaccia Python a IPOPT, la risposta è no, non esistono ancora solutori di programmazione non lineari di alta qualità per Python. Forse @Dominique lo cambierà con NLPy.
AGGIORNAMENTO N. 3: Altre pugnalate selvagge alla ricerca di un solutore basato su Python hanno prodotto PyGMO , che è un insieme di collegamenti Python a PaGMO, un solutore di ottimizzazione multiobiettivo globale basato su C ++. Sebbene sia stato creato per l'ottimizzazione multibiettiva, può anche essere utilizzato per la programmazione non lineare a singolo obiettivo e ha interfacce Python con IPOPT e SNOPT, tra gli altri risolutori. È stato sviluppato all'interno dell'Agenzia spaziale europea , quindi si spera che ci sia una comunità dietro. È stato anche rilasciato relativamente di recente (24 novembre 2011).