Programmazione lineare con vincoli di matrice


10

Ho un problema di ottimizzazione simile al seguente

minJ,Bij|Jij|s.t.MJ+BY=X

Qui, le mie variabili sono matrici e , ma l'intero problema è ancora un programma lineare; le restanti variabili sono fisse.JB

Quando provo ad accedere a questo programma nei miei strumenti di programmazione lineare preferiti, ho qualche problema. Vale a dire, se scrivo questo in forma di programma lineare "standard", le matrici dei parametri e finiscono per essere ripetute una tonnellata di volte (una volta per ogni colonna di ).MYX

Esiste un algoritmo e / o un pacchetto in grado di gestire le ottimizzazioni del modulo sopra? In questo momento sto esaurendo la memoria perché e devono essere copiati così tante volte!MY


è una matrice di parametri o intendi ? Quali sono le forme delle varie matrici? BY
Geoffrey Irving,

[Ciao Geoffrey!] J e B sono variabili, il resto sono parametri. B ha relativamente poche colonne ma tutte le dimensioni rimanenti sono piuttosto grandi (niente è quadrato).
Justin Solomon,

[Ciao!] Dovresti modificare il post per non dire due volte che B è un parametro.
Geoffrey Irving,

1
È interessante, ma probabilmente inutile, la versione di questo problema con invece dipuò essere risolto con un paio di SVD. Jij2|Jij|
Geoffrey Irving

1
@Geoffrey, non è una coincidenza :-)
Justin Solomon

Risposte:


12

Panoramica

Si potrebbe desiderare di provare una variante del alternata Indicazioni metodo dei moltiplicatori (ADMM), che è stato trovato a convergere con sorprendente rapidità per l1 problemi di tipo lazo. La strategia è quella di formulare il problema con un Lagrangiano aumentato e quindi effettuare un'ascesa a gradiente sul doppio problema. È particolarmente piacevole per questo particolare l1 problema regolarizzata perché la parte nonsmooth di ogni iterazione del metodo ha una soluzione esatta si può semplicemente valutare elemento per elemento, mentre la parte liscia comporta la soluzione di un sistema lineare.

In questo post noi

  • ricavare una formulazione ADMM generale per una generalizzazione del problema,
  • derivare i sottoproblemi per ogni iterazione di ADMM e specializzarli nella propria situazione, quindi
  • studiare il sistema lineare risultante che deve essere risolto ogni iterazione, e sviluppare un risolutore veloce (o precondizionatore) in base precomputing decomposizioni autovalori (o approssimazioni di basso rango thereof) per MTM e YYT .
  • riassumere con alcune osservazioni conclusive

La maggior parte delle grandi idee qui sono trattate nel seguente eccellente documento di revisione,

Boyd, Stephen, et al. "Ottimizzazione distribuita e apprendimento statistico tramite il metodo della direzione alternata dei moltiplicatori." Foundations and Trends® in Machine Learning 3.1 (2011): 1-122. http://www.stanford.edu/~boyd/papers/pdf/admm_distr_stats.pdf

Prima di entrare nei dettagli, voglio notare che questa è una risposta metodo / algoritmo, non una risposta pratica al codice esistente: se si desidera utilizzare questo metodo, è necessario implementare la propria implementazione.

Formulazione ADMM

In generale, supponiamo di voler risolvere

minXΣio|Xio|stUNX=B.

Il problema nel post originale rientra in questa categoria dopo un'appropriata vettorializzazione. (questo è solo in linea di principio - vedremo che la vettorializzazione non deve essere eseguita in pratica)

Potresti invece risolvere il problema equivalente, che ha Lagrangiano L(x,z,λ,γ)=

minX,zΣio|Xio|+α2||X-z||2+β2||UNz-B||2stUNz=B&X=z,
L(X,z,λ,γ)=Σio|Xio|+α2||X-z||2+β2||UNz-B||2+λT(UNz-B)+γT(X-z)=Σio|Xio|+α2||X-z+1αγ||2+β2||UNz-B+1βλ||2+α2||1αγ||2+β2||1βλ||2.

Il metodo della direzione alternata dei moltiplicatori risolve il doppio problema, tramite salita gradiente sulle doppie variabili, tranne che con proiezioni alternate inesatte sui doppi sottoprocessi. Cioè, si fa l'iterazione x k + 1

maxλ,γminX,zL(X,z,λ,γ),
xk+1=argminxL(x,zk,λk,γk)zk+1=argminzL(xk+1,z,λk,γk)γk+1=γk+α(xk+1zk+1)λk+1=λk+β(Azk+1b).

In determinate condizioni lievi sui parametri e β (spiegati nel documento Boyd & Parikh sopra linkato), il metodo ADMM converge alla vera soluzione. Il tasso di convergenza è lineare, poiché è al centro un metodo di risalita gradiente. Spesso può essere accelerato per essere superlineare di 1) modificando i parametri α e β man mano che si procede in base all'euristica o 2) utilizzando l'accelerazione di Nesterov. Per le note sulla modifica dei parametri di penalità, consultare il documento del sondaggio Boyd e per l'utilizzo dell'accelerazione di Nesterov con ADMM consultare il documento seguente,αβαβ

Goldstein, Tom, Brendan O'Donoghue e Simon Setzer. "Metodi di ottimizzazione rapida della direzione alternata." Rapporto CAM (2012): 12-35. ftp://ftp.math.ucla.edu/pub/camreport/cam12-35.pdf

Tuttavia, anche se la velocità di convergenza globale è lineare solo, per problemi del metodo è stata osservata per trovare il modello sparsity molto rapidamente, e poi convergere più lentamente sui valori esatti. Poiché trovare il modello di scarsità è la parte più difficile, questo è molto casuale! Le ragioni esatte per cui sembrano essere un'area di ricerca attuale. Tutti vedono il modello di sparsità convergere rapidamente, ma nessuno sembra sapere esattamente perché ciò accada. Qualche tempo fa ho chiesto a Boyd e Parikh di questo tramite e-mail e Parikh ha pensato che potesse essere spiegato interpretando il metodo in un contesto di sistemi di controllo. Un'altra spiegazione euristica del fenomeno si trova nell'appendice del seguente documento,l1

Goldstein, Tom e Stanley Osher. "Il metodo split Bregman per i problemi regolarizzati L1." SIAM Journal on Imaging Sciences 2.2 (2009): 323-343. ftp://ftp.math.ucla.edu/pub/camreport/cam08-29.pdf

Naturalmente ora le bugie di difficoltà nel risolvere i e z aggiornamento sottoproblemi per la vostra situazione specifica. Poiché il lagrangiano è quadratico in z , il sottoproblema di aggiornamento z richiede semplicemente di risolvere un sistema lineare. Il sottoproblema x sembra più difficile poiché non è distinguibile, ma si scopre che esiste una formula esatta per la soluzione che può essere applicata elemento per elemento! Discutiamo ora questi sottoproblemi in modo più dettagliato e li specifichiamo al problema nel post originale.XzzzX

Setup per il sottoproblema di aggiornamento (sistema lineare)z

Per l' aggiornamento , abbiamo a r g m i n z L ( x k , z , λ k , γ k ) = a r g m i n z αz

un'rgmionzL(XK,z,λK,γK)=un'rgmionzα2||X-z+1αγ||2+β2||UNz-B+1βλ||2.

Specializzato al tuo problema questo diventa,

un'rgmionZJ,ZBα2||JK+1-ZJ+1αΓJ||Fro2+α2||BK+1-ZB+1αΓB||Fro2+β2||MZJ+ZBY-X+1αΛ||Fro2,

dove indica la norma Frobenius (elementwise l 2 ). Questo è un problema di minimizzazione quadratica, in cui si possono trovare le condizioni di ottimalità del primo ordine prendendo derivate parziali dell'obiettivo rispetto a Z J e Z B e ponendole a zero. Questo è 0||||Frol2ZJZB

0=-α2(JK+1-ZJ+1αΓJ)+β2MT(MZJ+ZBY-X+1βΛ),0=-α2(BK+1-ZB+1αΓB)+β2(MZJ+ZBY-X+1βΛ)YT.

Come notato nei commenti del poster originale Justin Solomon, questo sistema per è simmetrico, quindi il gradiente coniugato è un metodo ideale privo di matrice. Una sezione successiva discute questo sistema e come risolverlo / precondizionarlo in modo più dettagliato.ZJ,ZB

Risoluzione del sottoproblema update (soluzione di soglia analitica)X

Passiamo ora al sottoproblema , a r g m i n x L ( x , z k , λ k , γ k ) = a r g m i n x i | x i | + αX

un'rgmionXL(X,zK,λK,γK)=un'rgmionXΣio|Xio|+α2||X-zK+1αγK||2

La prima cosa da vedere è che la somma può essere suddivisa elemento per elemento,

Σio|Xio|+α2||X-zK+1αγK||2=Σio|Xio|+α2Σio(Xio-zioK+1αγioK)2,

Quindi possiamo risolvere il problema di ottimizzazione elemento per elemento in parallelo, producendo

XioK+1=un'rgmionXio|Xio|+α2(Xio-zioK+1αγioK)2.

La forma generale di questa equazione è,

minS|S|+α2(S-t)2.

La funzione del valore assoluto sta cercando di tirare il punto ottimale verso , mentre il termine quadratico sta cercando di tirare il punto ottimale verso s = t . la vera soluzione si trova quindi da qualche parte sul segmento [ 0 , t ) tra i due, con α crescente che tende a tirare il punto ottimale verso t , e che diminuisce α tirando il punto ottimale verso 0 .S=0S=t[0,t)αtα0

Questa è una funzione convessa ma non è differenziabile a zero. La condizione per un punto minimizzante è che il sottoderivativo dell'obiettivo in quel punto contenga zero. Il termine quadratico ha la derivata e la funzione del valore assoluto ha la derivata - 1 per s < 0 , la subderivativa a valore impostato come intervallo [ - 1 , 1 ] quando s = 0 e la derivata 1 per s > 0 . Quindi otteniamo il subderivativo per la funzione obiettivo generale, α(S-t)-1S<0[-1,1]S=01s>0

S(|S|+α2(S-t)2)={1+α(S-t)S>0[-1,1]+αt,S=0,-1+α(S-t),S<0.

Da ciò vediamo che il sottoderivativo dell'obiettivo in contiene 0 se e solo se | t | 1S=00 , nel qual casos=0è il minimizer. D'altra parte, ses=0non è il minimizer, allora possiamo impostare la derivata a valore singolo uguale a zero e risolvere per il minimizer. In questo modo si ottiene, argmins| s| +α|t|1αS=0S=0

un'rgmionS|S|+α2(S-t)2={t-1α,t>1α,0,|t|1α,t+1α,t<-1α

Specializzando nuovamente questo risultato sul problema reale che stiamo cercando di risolvere nella domanda originale in cui produce, J k + 1 i j ={ Z k i j - 1t=ZiojK-1αΓiojK L'aggiornamento perBè semplicemente Bk+1=ZB-1

JiojK+1={ZiojK-1αΓiojK-1α,ZiojK-1αΓiojK>1α,0,|ZiojK-1αΓiojK|1α,ZiojK-1αΓiojK+1α,ZiojK-1αΓiojK<-1α.
B
BK+1=ZB-1αΓB,

come notato dal poster originale Justin Solomon nei commenti. Nel complesso, eseguire l'aggiornamento per richiede solo di scorrere ciclicamente le voci delle tue matrici e di valutare le formule precedenti per ciascuna voce.J,B

Complemento Schur per la sistemaZJ,ZB

Il passaggio più costoso dell'iterazione è risolvere il sistema,

0=-α2(JK+1-ZJ+1αΓJ)+β2MT(MZJ+ZBY-X+1βΛ),0=-α2(BK+1-ZB+1αΓB)+β2(MZJ+ZBY-X+1βΛ)YT.

A tal fine, vale la pena di costruire un buon risolutore / precondizionatore per questo sistema. In questa sezione lo facciamo vettorializzando , formando un complemento di Schur , facendo alcune manipolazioni del prodotto Krnoecker e quindi non vettorizzando. Il risultante sistema di complementi di Schur è un'equazione di Sylvester leggermente modificata .

In quanto segue le seguenti identità sulla vettorializzazione e sui prodotti Kronecker sono assolutamente fondamentali:

  • vec(UNBC)=(CTUN)vec(B),
  • (UNB)(CD)=UNCBD
  • (UNB)-1=UN-1B-1
  • (UNB)T=UNTBT

Queste identità valgono ogni volta che le dimensioni della matrice e l'invertibilità sono tali che ogni lato dell'equazione è un'espressione valida.

(αio+β[ioMTM(YM)TYMYYTio])[vec(ZJ)vec(ZB)]=[vec(αJ+βMTX+ΓJ-MTΛ)vec(αB+βXYT+ΓB-ΛYT)],

[io(αio+βMTM)β(YM)TβYM(αio+βYYT)io][vec(ZJ)vec(ZB)]=[vec(F)vec(sol)],

Fsol

[io(αio+βMTM)β(YM)T0(αio+βYYT)io-β2YYTM(αio+βMTM)-1MT]...[vec(ZJ)vec(ZB)]=[vec(F)vec(sol)-βYM(αio+βMTM)-1vec(F)].

Senza pubblicità, le due equazioni che dobbiamo risolvere in sequenza sono,

  1. ZB(αI+βYYT)(βM(αI+βMTM)1MT)ZB(βYYT)=GβM(αI+βMTM)1FYT
  2. (αI+βMTM)ZJ=FβMTZBY.

Y,M

ZBYYT,MMT,MTMβYYTZBZJpuò essere trovato facilmente dalla seconda equazione. La seconda equazione è banale da risolvere con qualsiasi metodo che ti piace.

Questo metodo richiede un costo iniziale per il pre-calcolo di due SVD completi prima dell'avvio del processo ADMM, ma è quindi veloce da applicare nelle iterazioni ADMM effettive. Poiché il metodo si occupa di SVD completi delle matrici dei vincoli, è appropriato quando sono vicini al quadrato e al rango elevato. È anche possibile un metodo più complicato che utilizza SVD di basso livello, ma è presentato in una sezione successiva.

QDQT=YYT,WΣWT=MMT,VTVT=MTM
H
ZBQ(αI+D)QTWβΣ(αI+Σ)1ΣWTZBQDQT=H.
A=WTZBQ
A(αI+D)βΣ(αI+Σ)1ΣAD=WHQT.

Ora possiamo trovare A

((αio+D)io+DβΣ(αio+Σ)-1Σ)vec(UN)=vec(WHQT).

UNZB=WUNQTZBZJMTM

MTMYYT

M,Y

ZJ,ZBM,Y

(αio+βYYT)io-β2YYTM(αio+βMTM)-1MT.

(αio+βioMMT+βYYTio)vec(ZB)=(io(io+βαMMT))vec(H).

QD1/2Q2T=YWΣ1/2VT=M
YMQ2
(αio+βioWΣWT+βYYTio)-1.

(UN+UCUT)-1=UN-1-UN-1U(C-1+UTUN-1U)-1UTUN-1.

ioWYio

(1αio+β[ioWQio][ioΣDY][ioΣTQTio])-1=αio-βα2[ioWQio][io(Σ-1+βαio)βαQWTβαQTW(D-1+βαio)Y]-1[ioΣTQTio].

[UNBBTC]-1=[(UN-BC-1BT)-1-UN-1B(C-BTUN-1B)-1-C-1BT(UN-BC-1BT)-1(C-BTUN-1B)-1].

(αio+βioMMT+βYYTio)-1=1αio-βα2(t11+S11+t12+S12+t21+S21+t22+S22),

t11=αβioWl-1WTS11=(QWl-1)D11(QTl-1WT)t12=-αβQh-1QTWl-1WTS12=-(Qh-1Wl-1)D22(h-1QTWT)t21=t12S21=-(Qh-1W)D22(h-1QTl-1WT)t22=αβQh-1QTioS22=(Qh-1W)D22(h-1QTWT)D11=αβ(hio-iol-1)-1D22=αβ(iol-h-1io)-1l=αβΣ-1+ioh=αβD-1+io.

ZB

((UN1B1)+(UN2B2)+...)vec(C)=vec(B1TCUN1+B2TCUN2+...).

Nota che tutte le inversioni esplicite con cui siamo finiti sono diagonali, quindi non c'è niente da "risolvere".

Codice del risolutore lineare

Ho implementato i due precedenti zJ,ZBsolutori in Matlab. Sembra funzionare bene. Il codice del risolutore è qui.

https://github.com/NickAlger/MeshADMM/blob/master/zkronsolve.m

Uno script di test per verificare che i solutori funzionino. Mostra anche come esempio come chiamare il codice del risolutore.

https://github.com/NickAlger/MeshADMM/blob/master/test_zkronsolve.m

Osservazioni conclusive

I metodi di tipo ADMM sono adatti a problemi come questo, ma è necessario implementare la propria implementazione. La struttura complessiva del metodo è piuttosto semplice, quindi l'implementazione non è troppo difficile in qualcosa come MATLAB.

Il pezzo mancante da questo post che dovrebbe essere specificato per definire completamente il metodo per il tuo problema è una scelta di parametri di penalità α,β. Fortunatamente il metodo è generalmente piuttosto robusto fintanto che i valori dei parametri non sono pazzi. Il documento di Boyd e Parikh ha una sezione sui parametri di penalità così come i riferimenti in essa, ma vorrei solo sperimentare i parametri fino a ottenere tassi di convergenza ragionevoli.

Il ZJ,ZBle strategie di risoluzione presentate sono molto efficaci se le matrici di vincoli sono a) densi, quadrati e di alto rango, oppure b) hanno una buona approssimazione di basso rango. Un altro risolutore utile che potrebbe essere un argomento di lavoro futuro sarebbe un risolutore ottimizzato per il caso seguente: la matrice dei vincoliM è scarso, quadrato e di alto rango, ma esiste un buon precondizionatore per αio+MMT. Questo sarebbe il caso se, ad esempio,M è un Laplaciano discretizzato.


Attuare questo ora! Per verificare, la matrice risolveZB e ZJdovrebbe essere definito simmetrico / positivo poiché proviene da minimi quadrati, giusto? Questo empiricamente sembra essere vero :-). Quindi, CG è un'opzione migliore di GMRES?
Justin Solomon,

Inoltre, penso che l'aggiornamento per B sia sbagliato? Sto lavorando su questo in modo più dettagliato, ma il ricordo B non appare nella mia funzione energetica (no|B| termine), quindi non sono sicuro che dovrebbe assumere solo valori ±(1-1/α). Sto pensando a questo sbagliato? Grazie!
Justin Solomon,

1
[errr piuttosto, B=ZB-ΓB/α]
Justin Solomon

3
Sorprendente! Dopo aver inserito le mie formule perJ e B(probabilmente vicino / equivalente a quello che hai pubblicato ma qualcosa non funzionava), questo è di gran lunga superiore al metodo IRLS. Grazie!
Justin Solomon,

1
Grandi notizie. È bello vedere quando i contributi qui portano a risultati reali.
Michael Grant,

5

Probabilmente vuoi usare un metodo senza matrice per la programmazione lineare. Non conosco alcun metodo specificamente orientato alla programmazione lineare, ma esistono metodi di punti interni privi di matrice per programmi quadratici e programmi generali non lineari. Il caso di programma quadratico corrisponde esattamente al tuo problema, in cui i coefficienti di forma quadratica sono tutti zero. (Potresti anche adattare metodi che utilizzano esatte soluzioni lineari alla struttura del tuo problema, ma quel tipo di implementazione su misura potrebbe non valerne la pena ed è meno pratico rispetto all'utilizzo di un metodo privo di matrice.)

Non conosco alcun pacchetto di ottimizzazione commerciale che implementa varianti prive di matrice di metodi di punti interni. IPOPT dovrebbe implementare un metodo punto interno privo di matrice per la programmazione non lineare, ma non sono stato in grado di rintracciare le chiamate API che ti consentono di usarlo.

Oltre a CVX, potresti probabilmente usare GAMS o AMPL per inserire una volta la matrice e impostare i tuoi vincoli nel linguaggio di modellazione per usare quella matrice. Tuttavia, i metodi utilizzati dai backend del solutore su CVX, GAMS e AMPL non utilizzano solutori senza matrice; tutto richiederà la matrice a coefficiente pieno per il programma lineare in forma standard, che sarà enorme (sarà un prodotto di matrici di Kronecker). Ciò che accadrà probabilmente è che inserisci il tuo programma lineare nel modulo sopra usando il linguaggio di modellazione, e quindi il linguaggio di modellazione tradurrà i dati in un modulo utilizzabile dai risolutori di backend. Questo modulo richiederà enormi matrici e sospetto che si verifichino gli stessi tipi di errori (a meno che non si esegua su una macchina con memoria sufficiente).


Sembra che io abbia provato tutte le cose giuste! Inizialmente ho sperimentato CVX e non è riuscito, quindi sono passato a IPOPT. Ma IPOPT stava avendo lo stesso problema. Non sapevo che avesse un'opzione senza matrice, quindi vedrò se riesco a capirlo.
Justin Solomon,

Non sono sicuro che GAMS / AMPL possa aiutare il mio problema. Sono felice di codificare il problema in qualunque forma aiuterà il risolutore a fare la cosa giusta, ma come dici dietro le quinte, prendere un prodotto Kronecker non funzionerà.
Justin Solomon,

4

Potete permettervi quei SVD citati da Geoffrey Irving? Se possibile, prenderei in considerazione un approccio IRLS (requadrati minimi quadrati ripetutamente) . Questo approccio risolverebbe i problemi del modulo

minimizzareΣiojWiojJioj2soggetto aMJ+BY=X
dove W è una matrice di peso.

Le iterazioni iniziano con W(0)come matrice di tutti; questo produce un ottimoJ(0). Le iterazioni procedono con

Wioj(K+1)=|max{Jioj(K),ε}|-1
dove εè una piccola costante che impedisce la divisione per zero. Non sono del tutto sicuro dei criteri di convergenza, ma forse il link Wikipedia che ho offerto sopra può darti riferimenti.

Potresti anche considerare un metodo del primo ordine levigato. TFOCS, che ho co-autore, potrebbe gestirlo usando il suo solutore "smoothed conic dual" (SCD), ma non sarà così facile da usare.

Se vuoi provare un metodo di punti interni privo di matrice, leggi il lavoro di Jacek Gondzio.

EDIT: hmm, potrebbe essere il caso che IRLS non sarà in grado di utilizzare SVD per calcolare soluzioni. In tal caso, ricadrei su una delle altre scelte.


1
Non sono sicuro che sarei in grado di utilizzare SVD qui, ma IRLS è un'ottima idea a prescindere! La velocità non è tanto una preoccupazione quanto la memoria, e imbarazzante ho usato IRLS per una ricerca correlata qualche mese fa e ha funzionato alla grande (prendendomi a calci per non averlo provato prima!). Anche senza SVD per IRLS, dovrebbe essere possibile farlo utilizzando un risolutore lineare come CG che non necessita del sistema completo. In effetti, CG può probabilmente essere fermato con vincoli abbastanza allentati prima della regolazioneWiojcome suggerisci tu. Anche esaminando un approccio ADMM, ma ho meno esperienza con questo.
Justin Solomon

Sì, anche ADMM sarebbe fantastico. In realtà ho scritto una sezione che suggerisce di eliminare del tutto Y, ma in seguito l'ho vistoMnon era quadrato.
Michael Grant,

1
Implementata la strategia IRLS: converge ma numericamente non funziona molto bene poiché il sistema lineare che deve risolvere è mal condizionato grazie a una vasta gamma di w'S; usando GMRES per risolvere il sistema. Proverò ADMM dopo!
Justin Solomon,

2

Potresti provare a usare CVX , che ti permetterebbe di codificarlo esattamente nella forma in cui lo hai scritto (cioè conXcome matrice piuttosto che come vettore). Probabilmente sarebbe risolto usando un solutore convesso più generale invece di un solutore LP, ma se il risolutore convesso avrà successo, suppongo che non ti dispiacerà.

Un'altra possibilità: utilizzare un solutore che consenta di memorizzare le matrici dei vincoli come matrici sparse. Ciò richiederà ancora molta più memoria di quella che dovresti avere bisogno, ma molto meno che se le memorizzi come matrici dense. In CVX, se usi kronottieni una matrice sparsa, quindi sarebbe banale provare questo.


Se Python sarebbe più conveniente di MATLAB per qualsiasi motivo, allora c'è anche cvxpy anche se non è abbastanza lucido come cvx.
k20,

Il mio sospetto è che questo approccio funzionerà in modo superficiale, per poi fallire dopo che il linguaggio di modellazione CVX ha trasformato i dati di input in una forma utilizzabile dai suoi risolutori di backend (che risolverà programmi lineari, programmi quadratici, programmi a cono di secondo ordine, programmi semidefiniti e programmi geometrici). Spiego perché nella mia risposta. Il backend di Gurobi è un risolutore di LP di prim'ordine (tra gli altri tipi), quindi usare CVX con quell'algoritmo è probabilmente il migliore che puoi fare in termini di implementazione, a meno di chiamare CVX da un'API di linguaggio compilata.
Geoff Oxberry,

1
Come dice Geoff, nessun layer di modellazione ti aiuterà qui. L'LP risultante ha i dati ripetuti per qualsiasi risolutore generico standard. Per aggirare questo, dovrai usare (sviluppare) un risolutore basato su un oracolo, cioè un risolutore che, essenzialmente, si basa sulla restituzione del residuoMJ+BY-X per un dato valore di J,Ye / o qualche taglio adatto, quindi lavora con quella descrizione.
Johan Löfberg,

Sì, sto riscontrando esattamente il problema menzionato da Geoff. In effetti, ho usato CVX per la mia ipotesi iniziale. Ho anche provato a chiamare direttamente Gurobi, ma l'unico modo in cui posso pensare di farlo è fare lo stesso problema di srotolamento.
Justin Solomon,

1
Penso che dovresti farlo tu
Johan Löfberg,
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.