Esiste un solutore di programmazione non lineare di alta qualità per Python?


77

Ho diversi problemi di ottimizzazione globale non convessi da risolvere. Attualmente uso MATLAB's Optimization Toolbox (in particolare, fmincon()con algoritmo = 'sqp'), che è abbastanza efficace . Tuttavia, la maggior parte del mio codice è in Python e mi piacerebbe fare l'ottimizzazione anche in Python. Esiste un solutore NLP con attacchi Python in grado di competere fmincon()? Deve

  • essere in grado di gestire i vincoli di uguaglianza e disuguaglianza non lineari
  • non richiede all'utente di fornire un giacobino.

Va bene se non garantisce un ottimo globale ( fmincon()non lo fa). Sto cercando qualcosa che converge saldamente in un ottimo locale anche per problemi difficili e anche se leggermente più lento di fmincon().

Ho provato diversi solutori disponibili tramite OpenOpt e li ho trovati inferiori a quelli di MATLAB fmincon/sqp.

Solo per enfasi ho già una formulazione trattabile e un buon risolutore. Il mio obiettivo è semplicemente quello di cambiare lingua per avere un flusso di lavoro più snello.

Geoff sottolinea che alcune caratteristiche del problema potrebbero essere rilevanti. Loro sono:

  • 10-400 variabili decisionali
  • 4-100 vincoli di uguaglianza polinomiale (gradi polinomiali compresi tra 1 e circa 8)
  • Un numero di vincoli di disuguaglianza razionale pari a circa il doppio del numero di variabili decisionali
  • La funzione obiettivo è una delle variabili decisionali

Il Jacobiano dei vincoli di uguaglianza è denso, così come il Jacobiano dei vincoli di disuguaglianza.


2
David, questa è purtroppo ora una domanda completamente diversa :) La differenza tra minimo locale e globale è oggetto di un potenziale numero infinito di dottorati di ricerca, e dal Teorema No Free Lunch, qualsiasi risolutore che è buono per un problema generale di ottimizzazione globale è decisamente negativo per un altro. Potrei suggerire di iniziare considerando le opzioni di formulazione (esiste una forma intera mista? Esiste un'approssimazione convessa?)
Aron Ahmadia

David, Aron ha un buon punto. La formulazione è sicuramente fondamentale in termini di ottenimento di soluzioni numeriche di PNL non convessi, per non parlare dell'ottenimento di buone soluzioni rapidamente. Potrebbe valere la pena considerare formulazioni alternative e quindi utilizzare la struttura di tali formulazioni per guidare la scelta del solutore. L'utilizzo di un solutore che sfrutta qualsiasi struttura (come la scarsità, la programmazione stocastica a più stadi, l'uso di vincoli per generare tagli) che è possibile indurre nel problema è la chiave per ottenere buone soluzioni.
Geoff Oxberry l'

@DavidKetcheson: Dal momento che hai una formulazione che desideri utilizzare, potresti almeno commentare le caratteristiche della tua formulazione? Il giacobino del lagrangiano è denso o scarno? All'incirca quante variabili ha? Non è utile per noi raccomandare software che implementa metodi di soluzione inadatti al tuo problema, e questa è l'unica ragione per cui le persone parlano di formulazioni in primo luogo.
Geoff Oxberry,

coopr fornisce l'associazione a ipopt usando asl: ipopt
denfromufa,

Risposte:


32

fmincon(), come hai accennato, utilizza diverse strategie ben note nell'ottimizzazione non lineare che tentano di trovare un minimo locale senza tener conto del fatto che sia stato trovato l'ottimale globale. Se stai bene, penso che tu abbia formulato correttamente la domanda (ottimizzazione non lineare).

Il miglior pacchetto di cui sono a conoscenza per l'ottimizzazione generale non lineare è IPOPT [1]. Apparentemente Matthew Xu mantiene una serie di collegamenti Python a IPOPT , quindi questo potrebbe essere un punto di partenza.

[1]: Andreas Wachter è un amico personale, quindi potrei essere un po 'di parte.


Andreas fa un buon lavoro, ma il suo risolutore richiede anche informazioni sulla matrice giacobina (o almeno informazioni sulla scarsità per la matrice giacobina). Quando dici che vuoi un risolutore che non richiede una matrice giacobina, vuoi dire che vuoi un risolutore che non ti richiede di fornire analiticamente la matrice giacobina (in modo che un calcolo della differenza finita sarebbe sufficiente) o vuoi un risolutore che non richiede affatto informazioni sulla matrice giacobina (che ti limiterebbe ai metodi di ottimizzazione senza derivati)?
Geoff Oxberry l'

Buona pesca. Intendo il primo; Ho aggiornato la domanda.
David Ketcheson,

Sono stato finalmente in grado di applicare IPOPT al mio problema usando sage.openopt.org . È ottimo!
David Ketcheson,

4
Oggi (2017) puoi anche usare IPOPT in Python tramite Pyomo . Ottieni un linguaggio di modellazione algebrica e auto diff per il jacobiano e l'assia.
Antonello,

@Antonello il link corretto è pyomo.org
Moonwalker

37

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).


Si prega di notare che PaGMO ha ottenuto la licenza GPL
denfromufa,

14

APM Python

Aggiornamento: vedi il nuovo pacchetto GEKKO che abbiamo appena rilasciato.

APM Python è un toolbox di ottimizzazione gratuito che ha interfacce per APOPT, BPOPT, IPOPT e altri solutori. Fornisce le prime informazioni (giacobino) e la seconda (assia) ai solutori e fornisce un'interfaccia web opzionale per visualizzare i risultati. Il client APM Python è installato con pip:

 pip install APMonitor

Può anche essere installato in uno script Python con:

try:
    from APMonitor.apm import *
except:
    # Automatically install APMonitor
    import pip
    pip.main(['install','APMonitor'])
    from APMonitor.apm import *

Abbiamo effettuato un paio di test di benchmark e abbiamo scoperto che la combinazione di APOPT (metodo del set attivo) e IPOPT (metodo del punto interno) può risolvere una grande percentuale di problemi di benchmark. Esistono numerosi problemi di esempio inclusi nel file zip di download. Quello che probabilmente vorrai iniziare è il problema di Hock Schittkowski # 71. È l'esempio più semplice e dimostra come risolvere i problemi di ottimizzazione vincolata.

C'è un'interfaccia del browser e un'API per Python / MATLAB. L'API per Python è un singolo script (apm.py) disponibile per il download dalla homepage di apmonitor.com. Una volta che lo script viene caricato in un codice Python, offre la possibilità di risolvere problemi di:

  • Equazioni non lineari
  • Programmazione non lineare intera mista
  • Equazioni differenziali e algebriche
  • Adattamento del modello dei minimi quadrati
  • Stima dell'orizzonte mobile
  • Controllo predittivo del modello non lineare
  • eccetera.

Per il nuovo utente, il software APM Python ha un forum di Google Gruppi in cui un utente può pubblicare domande. Ci sono webinar che mostrano problemi di ottimizzazione nella ricerca operativa e nell'ingegneria.

Di seguito è riportato un esempio di un problema di ottimizzazione (hs71.apm).

Model
  Variables
    x[1] = 1, >=1, <=5
    x[2] = 5, >=1, <=5
    x[3] = 5, >=1, <=5
    x[4] = 1, >=1, <=5
  End Variables

  Equations
    x[1] * x[2] * x[3] * x[4] > 25
    x[1]^2 + x[2]^2 + x[3]^2 + x[4]^2 = 40

    minimize  x[1] * x[4] * (x[1]+x[2]+x[3]) + x[3]
  End Equations
End Model

Il problema di ottimizzazione viene risolto con il seguente script Python:

from APMonitor.apm import *
server = 'http://byu.apmonitor.com'

# Application name
app = 'eqn'

# Clear previous application
apm(server,app,'clear all')

# Load model file
apm_load(server,app,'hs71.apm')

# Option to select solver (1=APOPT, 2=BPOPT, 3=IPOPT)
apm_option(server,app,'nlc.solver',3)

# Solve on APM server
solver_output = apm(server,app,'solve')

# Display solver output
print(solver_output)

# Retrieve results
results = apm_sol(server,app)

# Display results
print('--- Results of the Optimization Problem ---')
print(results)

# Display Results in Web Viewer 
url = apm_var(server,app)
print("Opened Web Viewer: " + url)

APM Python è un servizio web gratuito per l'ottimizzazione. I problemi di ottimizzazione vengono risolti su server remoti e i risultati vengono restituiti allo script Python locale. Un server locale APMonitor è inoltre disponibile per il download, pertanto non è necessaria una connessione Internet ( Download server ). Di recente abbiamo aggiunto il supporto per l'elaborazione parallela sia per MATLAB che per Python. Il modulo Python è compatibile con Python 2.7 o Python 3+.


2
John, vedo che APM Python è disponibile gratuitamente, ma non riesco a capire guardando il pacchetto se contiene solutori che utilizza localmente o richiede una connessione al sito Web di AP Monitor per eseguire i calcoli. Sono curioso di sapere quale.
Aron Ahmadia,

3
Aron, gli script MATLAB o Python richiedono una connessione Internet ai server APM per risolvere i problemi di ottimizzazione. Questo ha una serie di vantaggi e svantaggi. Sul lato positivo, un servizio web per l'ottimizzazione consente la compatibilità multipiattaforma, l'accesso gratuito ad alcuni solutori commerciali e gli aggiornamenti del software che sono trasparenti per l'utente. Il rovescio della medaglia, APM non è flessibile come alcune alternative open source ma è progettato per gli utenti industriali che preferiscono una soluzione chiavi in ​​mano per le applicazioni di ottimizzazione.
John Hedengren,

@JohnHedengren Ho alcune pre-elaborazioni in MATLAB che usano un'altra libreria per costruire il problema di ottimizzazione stesso, in particolare, i vincoli implicano queste chiamate esterne. Pensi che APM sia ancora adatto a questo scopo?
gpavanb,

Penso che il termine comune sia ottimizzazione della blackbox.
gpavanb,

@gpavanb Il pacchetto APMonitor richiede che le equazioni siano scritte nel linguaggio di modellazione. Un'opzione per caricare il codice esterno è quella di creare un oggetto che fornisca i residui e almeno i primi derivati ​​analitici. Generalmente codifichiamo questi oggetti in F90 per velocità come quelli elencati qui: apmonitor.com/wiki/index.php/Main/Objects Non penso che APMonitor sia l'opzione migliore per un'applicazione con ottimizzazione della blackbox.
John Hedengren,

7

Sebbene questo non risponda interamente alla tua domanda, autore un pacchetto Python per la programmazione non lineare chiamato NLPy. La versione più recente può essere recuperata da https://github.com/dpo/nlpy

Devo sottolineare che NLPy è di livello di ricerca e che i solutori inclusi non sono affatto robusti come codici più stagionati come IPOPT. Inoltre, attualmente richiedono che vengano forniti i giacobini. Detto questo, il punto di NLPy è fornire gli strumenti necessari ai ricercatori per assemblare solutori personalizzati, se necessario. Ad ogni modo, sarò interessato a sentire i tuoi commenti offline se lo provi. È inoltre possibile trovare utili i pacchetti correlati https://github.com/dpo/pykrylov e https://github.com/dpo/pyorder . Attualmente, la documentazione di NLPy è decisamente carente. Gli altri due dovrebbero essere ragionevoli.


7

pyomo è un ambiente di modellazione completo simile a GAMS / AMPL per l'ottimizzazione in python. È estremamente potente, ha interfacce per tutti i solutori che sono supportati da AMPL e genera automaticamente Jacobiani ecc. Tuttavia, a causa della sua esecuzione in un "ambiente virtuale Python", potrebbe non essere banale collegarlo al codice esistente.


5

Python GEKKO

Di recente abbiamo rilasciato (2018) il pacchetto GEKKO Pythonper la programmazione non lineare con solutori come IPOPT, APOPT, BPOPT, MINOS e SNOPT con metodi attivi di set e punti interni. Uno dei problemi con l'utilizzo di questi solutori è che normalmente è necessario fornire almeno i primi derivati ​​e facoltativamente i secondi derivati. Esistono diversi bei linguaggi di modellazione che possono farlo per te, come menzionato con altre risposte. GEKKO compila le equazioni in codice byte in modo che sia come hai scritto il modello in Fortran o C ++ in termini di velocità. La differenziazione automatica fornisce il 1o e il 2o derivato in forma sparsa ai solutori a gradiente. Abbiamo progettato GEKKO per problemi di controllo ottimali, ma può anche risolvere problemi simili a fmincon. Di seguito è riportato un rapido esempio di un problema di programmazione non lineare con vincoli di uguaglianza e disuguaglianza. Prima tu'

pip install gekko

Il problema n. 71 di Hock Schittkowski è mostrato di seguito come esempio di funzione oggettiva, vincolo di disuguaglianza, vincolo di uguaglianza e quattro variabili con limiti superiore e inferiore.

from gekko import GEKKO
m = GEKKO() # Initialize gekko
# Initialize variables
x1 = m.Var(value=1,lb=1,ub=5)
x2 = m.Var(value=5,lb=1,ub=5)
x3 = m.Var(value=5,lb=1,ub=5)
x4 = m.Var(value=1,lb=1,ub=5)
# Equations
m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==40)
m.Obj(x1*x4*(x1+x2+x3)+x3) # Objective
m.options.IMODE = 3 # Steady state optimization
m.solve() # Solve
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))    

GEKKO funziona su tutte le piattaforme (Windows, MacOS, Linux, processori ARM) e con Python 2.7 e 3+. Un'opzione completamente locale è disponibile senza una connessione Internet impostando l'opzione "remote = False". L'opzione locale è attualmente disponibile solo per Windows e stiamo lavorando su altre versioni come processori Linux, MacOS, ARM da eseguire localmente senza una connessione Internet. La versione locale include solo solutori gratuiti che non richiedono una licenza. Per impostazione predefinita, il problema viene inviato a un server pubblico in cui la soluzione viene calcolata e restituita a Python.

Sebbene questa domanda riguardi specificamente la risoluzione di programmi non lineari in Python, metterò in evidenza anche alcuni altri tipi di problemi che GEKKO può risolvere e alcune risorse per l'ottimizzazione dell'apprendimento. GEKKO risolve anche equazioni algebriche a numero intero e differenziale e ha diversi oggetti pre-programmati per controlli avanzati (simili a DMC, RMPCT, ecc.). Le modalità operative comprendono la riconciliazione dei dati, l'ottimizzazione in tempo reale, la simulazione dinamica e il controllo predittivo non lineare.

Insegno due corsi di ottimizzazione (ottimizzazione del design e ottimizzazione dinamica ) e ho pubblicato il materiale del corso online. Il corso di ottimizzazione dinamica è offerto ogni anno a partire da gennaio e utilizziamo il pacchetto GEKKO Python (e MATLAB) per il corso. GEKKO è un'estensione di APMonitor Optimization Suite ma ha integrato la modellazione e la visualizzazione della soluzione direttamente in Python. I riferimenti APMonitor e GEKKO forniscono un esempio dei tipi di applicazioni che possono essere risolti con questo pacchetto. GEKKO è sviluppato sotto la National Science Foundation Research Grant # 1547110 .


Potresti modificare la tua risposta per spiegare in che modo il tuo software risponde ai requisiti specifici menzionati nel post? Altrimenti sembra più un post pubblicitario generale piuttosto che una risposta alla domanda (e probabilmente verrà chiuso).
Christian Clason,

Christian, ho modificato la risposta per essere più specifico alla domanda. Ho spostato le informazioni aggiuntive su GEKKO e sui corsi online fino alla fine, ma posso rimuoverle se necessario.
John Hedengren,

4

1
Grazie, ma questo è quello che ho provato (tramite OpenOpt, che fornisce un'interfaccia aggiuntiva ad esso). Non è mai stato meglio di fmincon / sqp e fallito in molti casi in cui quest'ultimo ha avuto successo.
David Ketcheson,

1
Aggiornamento: ho provato questo direttamente da SciPy. Fallisce anche su problemi in cui fmincon è in grado di trovare costantemente l'ottimale globale in pochi secondi.
David Ketcheson,

4

PyGMO contiene diversi solutori, fornendo loro la stessa interfaccia. IPOPT e scipy slsqp sono inclusi nel caso in cui si compili il codice e si scarichi / installi il codice di terze parti in modo indipendente.

Come bonus, l'uso parallelo del solutore è reso molto semplice (multistart) tramite la classe arcipelago!


3

C'è cvxmod , un wrapper Python attorno al software di ottimizzazione convessa di Stephen Boyd. Fa parte del pacchetto Sage .


Ma l'OP chiede un problema di ottimizzazione non convessa.
Alejandro,

1
L'OP sta chiedendo un problema di ottimizzazione non convessa, ma tutti i solutori menzionati finora sono garantiti solo per trovare soluzioni ottimali epsilon per problemi di ottimizzazione convessa senza metaeuristica aggiuntiva (multistart o altri algoritmi di ottimizzazione globale stocastica che invocano deterministico, solutori di ottimizzazione non lineari e convessi) o algoritmi di tipo branch-and-bound (come branch-and-bound, branch-and-cut e branch-and-ridurre) che richiedono rilassamenti della funzione e dei vincoli oggettivi. Questa risposta non è peggiore di nessuna delle altre citate dall'11 dicembre.
Geoff Oxberry l'

Geoff, come posso applicare cvxmod a un problema non convesso?
David Ketcheson,

Non ho usato il software, ma in teoria, come qualsiasi altro risolutore convesso, lo useresti per trovare soluzioni localmente ottimali proprio come stai usando fmincon ora (che è anche un risolutore convesso). Un modo per usarlo sarebbe multistart. Genera un elenco di punti da utilizzare come ipotesi iniziali per il tuo risolutore convesso. Per ogni punto utilizzato come ipotesi, registra la soluzione restituita dal solutore. Il punto che corrisponde al valore della funzione obiettivo minimo su tutte le soluzioni restituite è la migliore approssimazione all'ottimale globale.
Geoff Oxberry l'

1
@Geoff: Sì, sto usando il multistart. Per quanto riguarda CVXMOD, accetta solo problemi che possono essere formulati in termini di programmazione convessa disciplinata. Problemi generali di programmazione non lineare non possono. Come dici tu, potrei cercare successivi rilievi convessi che avvicinano il mio problema, ma l'intero obiettivo qui è che io faccia meno lavoro.
David Ketcheson,


3






A partire dalla versione 2014b, questo è ora supportato direttamente da Matlab; vedi mathworks.de/help/matlab/matlab-engine-for-python.html
Christian Clason

@Christian Clason, che sembra non fare affatto intorpidimento a Matlab? come fa python-matlab-bridge. (Non l'ho usato però.)
denis

Non direttamente (sembra avere una classe di array matlab personalizzata), ma c'è sicuramente un modo per convertire tra quello e numpy. Ci sarà un certo sovraccarico, ovviamente, a causa della copia dei dati, ma probabilmente è meno un problema per le dimensioni del problema menzionate dal PO. (Non l'ho usato da solo; ho pensato di indicare l'opzione.)
Christian Clason,

3

Viene bacino saltellando via SciPy sufficiente per le vostre esigenze? Se restituisce un minimo locale e non un minimo globale, è possibile modificare il numero di iterazioni e / o applicare limiti.


2

Che ne dici di CMA-ES? Ha collegamenti Python ed è adatto a problemi di ottimizzazione non lineari e non lineari e l'ho usato un po ': https://www.lri.fr/~hansen/cmaesintro.html

Installazione tramite pip:

pip install cma

Ecco alcuni esempi di codice dal loro sito Web:

import cma
help(cma)  # "this" help message, use cma? in ipython
help(cma.fmin)
help(cma.CMAEvolutionStrategy)
help(cma.CMAOptions)
cma.CMAOptions('tol')  # display 'tolerance' termination options
cma.CMAOptions('verb') # display verbosity options
res = cma.fmin(cma.Fcts.tablet, 15 * [1], 1)
res[0]  # best evaluated solution
res[5]  # mean solution, presumably better with noise

Questo ottimizzatore è ben lungi dall'essere richiesto dall'OP. Ad esempio, non esiste un modo chiaro per gestire i vincoli di uguaglianza o disuguaglianza con CMA-ES.
ares

1

Dato che MATLAB ha un compilatore JIT mentre CPython non lo ha ancora (almeno, fino a quando pypy non avrà il pieno supporto numpy). Sembra che tu voglia un risolutore gratuito che superi le prestazioni prodotte commercialmente fmincon. Non è troppo?

IIRC tra i solutori di NLP commerciali, fino ad ora solo snopt ha fornito un'API Python (anche se è piuttosto brutta).

Quali solutori di OpenOpt hai provato? Quante variabili e vincoli hai nel tuo compito non convesso?

È possibile provare IPOPT tramite l'API OpenOpt / Funcdesigner senza installazione sul server OpenOpt Sage (prestare attenzione al "passaggio da Sage a Python").

10300(x0.1)2+10300(y0.2)2(x,y)=(1,1)


2
Se leggi attentamente, sto solo chiedendo qualcosa con la stessa robustezza di fmincon. Non ha bisogno di essere migliore e può anche essere più lento.
David Ketcheson,


1

È bene menzionare qui che il solutore di Google Ceres è in realtà un potentissimo ottimizzatore non lineare, utilizzato in molti progetti.

C'è anche un wrapper Python disponibile qui: https://github.com/rll/cyres


Non è Levenbeg-Marquardt? che, seppur bello, è lontano da ciò che l'OP vuole
denis,

Sebbene ceres sia un ottimo risolutore, non supporta affatto i vincoli di uguaglianza e supporta solo i vincoli di disuguaglianza come limiti superiore / inferiore dei parametri (a partire dall'attuale versione 1.12).
Orzechow,

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.