Qual è il software più veloce (open source) per risolvere il problema di programmazione di numeri interi misti


14

Ho un problema di programmazione con numeri interi misti. E attualmente sto usando GLPK come mio risolutore. Ma ho scoperto che GLPK è buono per il problema della programmazione lineare, ma per la programmazione di numeri interi misti, richiede molto più tempo, quindi non soddisfa i nostri requisiti. Sto cercando così altro software. Esistono altri buoni strumenti open source per risolvere il problema della programmazione di numeri interi misti a velocità elevata? Grazie!


Hai visto i confronti con SCIP ?
Ali

Risposte:


14

Se vuoi qualcosa di open-source, probabilmente vuoi provare il codice CBC di COIN (hanno anche un paio di altri solutori MILP, come un framework di filiale e prezzo, o SYMPHONY).

Gurobi e CPLEX saranno notevolmente più veloci e, a partire dalla riunione INFORMS del 2011 o 2012, Gurobi era più veloce di CPLEX (anche se le metriche delle prestazioni dipendono ovviamente dal problema). Sui MILP risolti nella mia tesi, Gurobi era circa 15-100 volte più veloce di CBC e CPLEX era quasi veloce come Gurobi, ma leggermente più lento (come 12-80 volte più veloce).

Sebbene le prestazioni nel caso peggiore siano davvero esponenziali, il tempo di esecuzione dipenderà fortemente dalla struttura del problema. È improbabile che sarai in grado di risolvere un MILP con milioni di variabili a meno che non sfrutti una struttura speciale (forse se si tratta di un programma stocastico che può essere scomposto in molti problemi molto più piccoli), ma è del tutto possibile risolvere i MILP non banali con migliaia di variabili in meno di un minuto. (Naturalmente, è anche possibile che questi problemi richiedano un'ora o più per risolversi.)

Come osserva Brian Borchers, CPLEX e Gurobi hanno entrambi licenze gratuite disponibili per alcuni ricercatori, uno di questi due pacchetti software sarebbe davvero il migliore da usare come solutore MILP per scopi generici.


6

I problemi di programmazione lineare intera mista sono molto più difficili da risolvere rispetto ai problemi di programmazione lineare. In termini di complessità computazionale, gli LP possono essere risolti in tempi polinomiali mentre risolvere MILP è un problema NP-Hard. Gli algoritmi noti per risolvere i MILP presentano una complessità esponenziale nel caso peggiore.

Esistono altri pacchetti software per la programmazione lineare a numeri interi misti che puoi consultare, tra cui SCIP (gratuito per uso accademico), CPLEX (commerciale ma ha un'opzione di licenza accademica) e GUROBI (commerciale anche con un'opzione di licenza accademica). Uno o più di questi pacchetti potrebbe essere sostanzialmente più veloce di GLPK sui tuoi problemi, ma non aspettarti che nessuno di loro sia quasi altrettanto veloce nel risolvere MILP quanto lo sono nel risolvere LP di dimensioni simili.


4

Se vuoi provare diversi risolutori, prova il framework di modellazione JuMP di Julia . Ti consente di scrivere il tuo modello come modello JuMP e quindi di cambiare i solutori con una riga di codice. Ad esempio, per i problemi MILP puoi scegliere tra i solutori Bonmin, Cbc, Couenne, CPLEX, GLPK, Gurobi e MOSEK. Per questo motivo, se lo scrivi in ​​JuMP, puoi semplicemente provare tutti i solutori citati da Geoff e vedere cosa funziona senza dover scrivere un sacco di codice. I tuoi test personali saranno la migliore fonte di conoscenza su quali siano gli algoritmi più veloci per i tuoi problemi.


Il framework JuMP aggiunge molto overhead?
naught101

1
No, JuMP viene eseguito tramite macro, quindi è in fase di compilazione. In effetti, ciò che JuMP utilizza le macro per riscrivere il codice e utilizzare l'autodifferenziazione per calcolare funzioni efficienti per gradienti, giacobini e iessiani, quindi sarà più veloce nei casi in cui altrimenti non avresti fornito una forma analitica per il gradiente / Jacobiano / dell'Assia. Puoi effettivamente controllare tramite @code_llvmper verificare il codice assembly risultante per vedere che il codice colla è essenzialmente nulla (questo anche perché Julia usa in modo ingenuo puntatori di funzione e gli stessi array di bit di C / Fortran).
Chris Rackauckas,

@ChrisRackauckas Quale risolutore funziona meglio per problemi non lineari con vincoli non lineari?
skan

Questa è una domanda completamente diversa che probabilmente non dovrebbe essere posta in un commento, ma tendo ad usare JuMP con NLopt o IPOPT a seconda dei vincoli richiesti e se ho bisogno di ottimizzazione globale o locale.
Chris Rackauckas,

3

Seguendo i suggerimenti degli altri, ho usato GAMS (commerciali) per molti progetti. È molto semplice; tutto quello che devi fare è mettere la formulazione matematica del tuo problema. Raccoglie le variabili, i vincoli, le funzioni oggettive e tutti i dati di input. Quindi, fornisce una gamma di solutori (ottimizzatori) per ogni caso. A seconda del caso, aggiungi solutori più sofisticati.

Certamente, EASY vale la pena dare un'occhiata. Framework open source.

Il termine "veloce" è molto vago! Devi essere più specifico; Veloce in termini di numero di iterazioni? numero di valutazioni? tempo trascorso? combinazione di questi?

Tuttavia, se non stai cercando un software e vuoi solo risolvere il problema, potrei suggerire di utilizzare l'ottimizzatore globale NSGA-II, che è un ottimizzatore open source di altissima reputazione e prestazioni.

Se hai fornito ulteriori informazioni, potrei guidare con precisione.


1
Devi considerare seriamente [openMDAO] [1], che è sviluppato / supportato dalla NASA ed è abbastanza flessibile!
T3rmInAt0r
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.