Software per la programmazione lineare (metodo del simplesso e B&B)

SSC (Software for Simplex Calculation) è una libreria java per la risoluzione di problemi di programmazione lineare. SSC utilizza l'algoritmo del Simplesso per risolvere questa classe di problemi di ottimizzazione di norma indicati con la sigla LP (Linear Programming).

In SSC è possibile risolvere anche problemi con variabili libere, intere, binarie, semicontinue e semicontinue intere. Questa sottoclasse di problemi sono di norma denominati con la sigla MILP (Mixed Integer Linear Programming). Nel caso di problemi MILP, che presentano tutte o una parte di variabili intere o binarie o semicontinue, SSC utilizza l'algoritmo del Branch and Bound (B&B) per la loro risoluzione.

A partire dalla versione 2.1.0 è possibile eseguire una implementazione del metodo del simplesso parallelo. Questa opzione (vedi esempio 1.14) permette di sfruttare thread multipli per la risoluzione del simplesso è da significativi vantaggi nel caso di architetture con almeno 4 o più core fisici.

Un problema da risolvere

La forma di problemi che le API fornite da SSC risolvono è la seguente :

\( \hspace{3cm} \text{ max/min } \hspace{0.3cm} c^{\mathrm{T}}x \hspace{1cm} \text{è la funzione obiettivo (f.o.) } \)

vincolato a :

\( \hspace{3cm} Ax\, (\le , = , \ge)\, b \)
\( \hspace{3cm} l_{i} \le x_{i} \le u_{i} \hspace{0.5cm} \text{ oppure }\, x_{i}=0\)
\( \hspace{3cm} x_{i} \in \mathbb{Z} \hspace{1.6cm} \forall i \in \text{I} \)
\( \hspace{3cm} x_{i} \in \{0,1\} \hspace{0.8cm} \forall i \in \text{B} \)
\( \hspace{3cm} x_{i} \in \mathbb{R} \hspace{1.6cm} \forall i \notin (\text{I} \cup \text{B}) \)

dove:

\( \hspace{3cm} x\, \in \mathbb{R}^{n} \hspace{5cm} \text{è il vettore delle variabili}\, x_{i} \)
\( \hspace{3cm} A \in \mathbb{Q}^{m \times n} \hspace{4.4cm} \text{è la matrice dei coefficienti} \)
\( \hspace{3cm} c\,\, \in \mathbb{Q}^{n} \hspace{5cm} \text{è il vettore dei coefficienti della f.o.} \)
\( \hspace{3cm} b\,\, \in \mathbb{Q}^{m} \hspace{4.9cm} \text{è il vettore dei coefficienti RHS} \)
\( \hspace{3cm} l\,\,\, \in \mathbb{Q}^{n} \hspace{5cm} \text{è il vettore dei lower bound }\, l_{i} \)
\( \hspace{3cm} u\, \in \mathbb{Q}^{n} \hspace{5cm} \text{è il vettore degli upper bound }\, u_{i} \)
\( \hspace{3cm} \text{I}\,\, \subseteq \{1,..,n\} \hspace{3.7cm} \text{è un sottoinsieme degli indici relativo alla variabili intere} \)
\( \hspace{3cm} \text{B} \subseteq \{1,..,n\}\, : \, (\text{I} \cap \text{B}) = \emptyset \hspace{0.9cm} \text{è un sottoinsieme degli indici relativo alla variabili binarie} \)

Dettagli

Il metodo del simplesso puo' essere suddiviso in due fasi. Nella fase 1 si trova una soluzione di base ammissibile, mentre nella fase 2 si trova una soluzione ottimale. La procedura gestisce variabili libere, variabili delimitate inferiormente e superiormente e le diverse gamme di vincoli. Se non vengono specificati limiti inferiori espliciti, SSC definisce le variabili delimitate inferiormente dallo zero (variabili non negative).

In SSC quando una variabile viene definita come una variabile intera o binaria, la procedura utilizza l'algoritmo del Branch and Bound per l'ottimizzazione. Nel Branch and Bound si risolve una successione di problemi rilassati (ovvero privati dei vincoli di interezza); per risolvere questi problemi rilassati si utilizza l'algoritmo del Simplesso.

Dimensioni dei problemi e richiesta di memoria

Il metodo del simplesso è un algoritmo efficiente, questo permette ai problemi di PL semplici (ovvero quelli privi di variabili intere) di non avere limiti nel numero di variabili e vincoli. In SSC i limiti sono dati dalla disponibilità di memoria della jvm. Ad esempio se si dichiara alla jvm di rendere disponibile una quantità massima di 4 Gigabyte di memoria (tramite la dichiarazione -Xmx4g) è possibile risolvere problemi con decine di migliaia di variabili e migliaia di vincoli.

Al contrario, il metodo del Branch and Bound è un algoritmo più oneroso. Quello implementato in questa libreria, utilizzato per risolvere problemi di programmazione lineare intera, non è altamente ottimizzato. Inoltre, esistono metodi più efficienti in letteratura sia dal punto di vista della complessità computazionale sia nell'utilizzo della memoria. Di conseguenza, la dimensione dei problemi di MILP risolvibili non può che essere limitata.

Requisiti tecnici

Il requisito per far eseguire i programmi SSC è quello di poter disporre di un JDK (o SDK) java versione 10.x o successive. Nessun altro requisito è richiesto.