Soluzione efficiente di programmi lineari interi misti


12

Molti problemi importanti possono essere espressi come un programma lineare intero misto . Purtroppo calcolare la soluzione ottimale a questa classe di problemi è NP-Complete. Fortunatamente ci sono algoritmi di approssimazione che a volte possono fornire soluzioni di qualità con quantità moderate di calcolo.

Come devo analizzare un particolare programma lineare intero misto per vedere se si presta a uno di questi algoritmi di approssimazione? Quali sono i tratti o le qualità rilevanti che un tale programma potrebbe possedere?

Quali sono gli algoritmi rilevanti oggi in uso e come si associano queste qualità su questi algoritmi?

A quali pacchetti software dovrei cercare per la sperimentazione?

Risposte:


15

Sebbene la programmazione lineare a numero intero misto (MILP) sia effettivamente NP-completa, ci sono istanze risolvibili (non banali) di programmazione lineare a numero intero misto.

NP-complete significa che la programmazione lineare di numeri interi misti è:

a) risolvibile in tempo polinomiale con una macchina di Turing non deterministica (la parte NP)

b) tempo polinomiale riducibile a 3-SAT (la parte completa; per il resto della discussione, questa parte non ha davvero importanza)

O(2n)n

Tale affermazione non significa che le istanze "piccole" siano intrattabili. Sfortunatamente, non posso fare una dichiarazione precisa di cosa significhi piccolo per un'istanza MILP. Risolvo problemi che hanno 3000 o più variabili di decisione binarie su base routinaria. A seconda della formulazione del problema, i problemi potrebbero richiedere meno di 0,01 secondi (che è il caso di problemi relativamente poco vincolati) o più di un'ora (che è il caso dei problemi in cui sono attivi molti vincoli), perché i problemi sembrano avere una struttura favorevole. Posso dire che i solutori di LP all'avanguardia possono risolvere LP con diversi milioni di variabili di decisione continue e che senza una struttura speciale, è altamente improbabile che un'istanza problematica con un numero compreso tra 1.000 e 10,

Se pensi di avere un'istanza risolvibile di MILP, vorrai utilizzare un algoritmo branch-and-bound o branch-and-cut. Le migliori implementazioni sono CPLEX e Gurobi . Entrambi sono prodotti commerciali che hanno licenze accademiche gratuite se scavi abbastanza. Se hai davvero bisogno di un risolutore open source, i progetti nella comunità COIN-OR sono più appropriati, anche se i pacchetti sorgente possono essere pignoli a volte. La maggior parte dei progetti pertinenti sarebbe il CBC branch-and-cut risolutore , il risolutore SYMPHONY , il risolutore BCP ramo-cut-prezzo , e il risolutore ABACUS branch-and-cut . Tutti questi progetti richiederanno più pacchetti da COIN-OR, grazie alla sua struttura modulare.

Se desideri provare più solutori, la soluzione migliore è utilizzare l' interfaccia Open Solver di COIN-OR . Tieni presente che parti di questa interfaccia ti permetteranno solo di impostare le opzioni di base del solutore e che per impostare le opzioni avanzate per i solutori, ti consigliamo di consultare le mailing list di COIN-OR per ulteriori dettagli. I solutori MILP commerciali sono MOLTO (a volte un ordine di grandezza o più) più veloci dei solutori open source. Un'altra opzione per la prototipazione è l'uso di un linguaggio di modellazione algebrica come GAMS o AMPL . Entrambi i pacchetti software sono commerciali, ma hanno versioni di prova che possono essere utilizzate su piccole istanze problematiche. Per istanze di problemi più grandi, è possibile inviare file GAMS o AMPL aServer NEOS da risolvere; questo server è disponibile al pubblico.

Se hai un'istanza sufficientemente grande di MILP, nessuno di questi risolutori funzionerà bene. È possibile rilassare le variabili intere in variabili continue, risolvere il problema e quindi arrotondare alla raccolta di variabili intere più vicina che è una soluzione fattibile dell'istanza del problema. Una soluzione ottimale del rilassamento LP del tuo MILP ti darà un limite inferiore al valore ottimale della funzione obiettivo del tuo MILP (supponendo minimizzazione, ovviamente), e una soluzione fattibile del tuo MILP ti darà un limite superiore all'obiettivo ottimale valore di funzione del tuo MILP.

Se sei davvero fortunato e la tua matrice di vincoli è totalmente unimodulare , puoi usare un solutore LP per generare soluzioni intere al tuo MILP e puoi risolvere il tuo problema in modo efficiente nonostante le sue grandi dimensioni. Altre classi di problemi hanno algoritmi di approssimazione rapida, come i problemi con lo zaino e il taglio dei problemi di magazzino . Esistono anche algoritmi di decomposizione MILP specializzati per problemi che hanno una struttura speciale, anche se non ho familiarità con i dettagli, poiché tali argomenti sono in qualche modo specializzati e al di fuori dell'ambito della mia tesi.

Non sono a conoscenza di uno schema di approssimazione del tempo completamente polinomiale (FPTAS) specifico per MILP, sebbene esista un FPTAS di una classe problematica che include MILP (vedi questo documento). La mia raccomandazione sarebbe quella di utilizzare uno dei solutori di programmazione lineare a numeri misti di cui sopra in combinato disposto con un limite di tempo e tolleranze appropriate sulle lacune di ottimalità. In questo modo si otterrebbe la migliore soluzione possibile per il proprio MILP entro il limite di tempo, e se il solutore termina con successo prima del limite di tempo, la soluzione possibile sarebbe ottimale entro le tolleranze del divario di ottimalità impostate. Questo corso di azione ti darebbe comunque dei limiti sulla qualità della soluzione, perché la tua soluzione fattibile sarebbe un limite superiore e il risolutore potrebbe darti un limite inferiore appropriato. Il limite non sarebbe garantito entro una certa soluzione ottimale di fattore, ma, di nuovo, qualsiasi FPTAS diventerà più costoso man mano che l'approssimazione migliora.

La cosa più importante che puoi fare prima di accontentarti di una formulazione MILP è scegliere la formulazione più forte che puoi trovare; puoi trovare consigli su come scegliere formulazioni forti in Introduzione all'ottimizzazione lineare di Bertsimas e Tsitsiklis. L'idea principale è quello di scegliere una formulazione cui vincoli definire un politopo che è più vicino al convesso della formulazione possibile (vedere anche questi appunti corso ). Scegliere una formulazione forte può fare una grande differenza nel tempo necessario per risolvere un problema.


Quali sono esempi del tipo di struttura favorevole a cui ti riferisci? Quali sono alcune domande che dovrei porre sul mio programma?
MRocklin,

A parte l'unimodularità, i problemi dello zaino e il taglio dei problemi di magazzino, se il tuo problema è un programma stocastico a più stadi, ci sono strategie di decomposizione per trarre vantaggio da quella struttura. Puoi utilizzare metodi come la decomposizione (generalizzata) di Benders, la decomposizione di Dantzig-Wolfe e la decomposizione a forma di L. Puoi anche sfruttare la struttura angolare a blocchi nei tuoi vincoli. La decomposizione di Dantzig-Wolfe, la decomposizione di Benders e la decomposizione generalizzata di Benders sono metodi che ho usato una o due volte in passato per problemi di compiti a casa.
Geoff Oxberry,

Ci sono alcuni altri trucchi e trappole che Geoff non ha menzionato, ma è difficile trovare un consiglio specifico senza vedere l'esatto problema o classe.
Aron Ahmadia,

Il server NEOS è un ottimo modo per capire se anche i server commerciali potrebbero aiutarti con un problema.
Ant6n,
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.