Algoritmo del simplesso duale rivisto¶
Parte 4 · Metodi matriciali, sensitività e geometria · Capitolo 12 · Dispensa, volume 4 (PDF) · Esercizi: Algoritmo del simplesso duale rivisto
12.1 Operazioni di pivot con due sistemi di equazioni lineari¶
-
Consideriamo un problema LP in forma standard di massimo con \(n+m\) variabili non negative e \(m\) vincoli lineari di uguaglianza:
\[\begin{align*} && \max \;\;{\boldsymbol c}' \, {\boldsymbol x} \label{RDS_FORM_STANDARD_OBJ} \tag{12.1a}\\[2ex] && \text{soggetto a} \quad {\boldsymbol A} \; {\boldsymbol x} &= {\boldsymbol b}, & \phantom{j=1111} \label{RDS_FORM_STANDARD_CONS1} \tag{12.1b}\\[2ex] && {\boldsymbol x} &\ge {\boldsymbol 0}. \label{RDS_FORM_STANDARD_CONS2} \tag{12.1c} \end{align*}\] -
L'algoritmo del simplesso duale parte da una base duale ammissibile, cioè una base il cui dizionario soddisfa \(\bar{\boldsymbol c} \le {\boldsymbol 0}\), ed esegue operazioni di pivot duali finché la soluzione di base non diventa ammissibile.
-
Come l'algoritmo del simplesso rivisto rispetto all'algoritmo del simplesso, anche l'algoritmo del simplesso duale rivisto non calcola mai la matrice inversa \({\boldsymbol A}_{\pazocal{B}}^{-1}\) e non aggiorna mai l'intero dizionario: a ogni iterazione determina tutte le informazioni necessarie a un'operazione di pivot duale risolvendo due sistemi di equazioni lineari, entrambi con la stessa matrice \({\boldsymbol A}_{\pazocal{B}}\).
-
1. Primo sistema di equazioni lineari
-
L'algoritmo del simplesso duale ha bisogno dei valori delle variabili in base, per determinare la riga pivot. Sono le componenti del vettore colonna \(\bar{\boldsymbol b} = {\boldsymbol A}_{\pazocal{B}}^{-1} \, {\boldsymbol b}\), che si trova risolvendo il seguente sistema di equazioni lineari:
\[ {\boldsymbol A}_{\pazocal{B}} \; \bar{\boldsymbol b} = {\boldsymbol b} ~~~\Longrightarrow~~~ \bar{\boldsymbol b} = \red{{\boldsymbol A}_{\pazocal{B}}^{-1} \; {\boldsymbol b}} \text{ dove } \bar{\boldsymbol b} = (\bar b_{i})_{i \in \pazocal{B}} . \]
-
-
2. Secondo sistema di equazioni lineari
-
Una volta determinata la riga pivot \(x_r\) con \(r \in \pazocal{B}\), il test dei rapporti ha bisogno della riga della matrice \(\bar{\boldsymbol A}\) associata a \(x_r\), cioè dei valori \(\bar{a}_{rj}\) per \(j \in \pazocal{N}\). Questa riga si ottiene dal vettore riga \({\boldsymbol u} \in \R^{1 \times m}\), che si trova risolvendo il seguente sistema di equazioni lineari:
\[ {\boldsymbol u} \; {\boldsymbol A}_{\pazocal{B}} = {\boldsymbol e}'_{r} ~~~\Longrightarrow~~~ {\boldsymbol u} = \violet{{\boldsymbol e}'_{r} \; {\boldsymbol A}_{\pazocal{B}}^{-1}} , \]dove \({\boldsymbol e}_{r}\) è il vettore colonna di \(m\) componenti, tutte uguali a \(0\) tranne quella associata alla variabile in base \(x_r\), che è uguale a \(1\). La riga cercata è quindi
\[ \bar{a}_{rj} = {\boldsymbol u} \; {\boldsymbol A}_{j} , \qquad \forall j \in \pazocal{N} . \]
-
I due sistemi di equazioni lineari hanno la stessa matrice \({\boldsymbol A}_{\pazocal{B}}\): il primo la ha a sinistra del vettore incognito, il secondo alla sua destra. Il vettore \({\boldsymbol u}\) seleziona la riga di \(\bar{\boldsymbol A}\) associata alla riga pivot, senza calcolare l'intera matrice \(\bar{\boldsymbol A}\).
12.2 Aggiornamento dei costi ridotti¶
-
Il test dei rapporti ha bisogno dei costi ridotti \(\bar{c}_j\) con \(j \in \pazocal{N}\). Questi non vengono ricalcolati a ogni iterazione: vengono aggiornati, esattamente come l'algoritmo del simplesso rivisto aggiorna i valori delle variabili in base, e l'aggiornamento usa solo la riga \(\bar{a}_{rj}\) già determinata dal secondo sistema.
-
Alla prima iterazione la base è quella delle \(m\) variabili di scarto, e quindi \({\boldsymbol A}_{\pazocal{B}} = {\boldsymbol I}\) e \({\boldsymbol c}_{\pazocal{B}} = {\boldsymbol 0}\), da cui
\[ \bar{c}_j = c_j , \qquad \forall j \in \pazocal{N} . \]
Dopo un'operazione di pivot duale con riga pivot \(x_r\) e colonna pivot \(x_p\), i costi ridotti vengono aggiornati come segue:
dove \(\bar{c}_r\) è il costo ridotto della variabile \(x_r\), che esce dalla base e diventa fuori base.
-
La quantità \(\frac{\bar{c}_p}{\bar{a}_{rp}}\) è esattamente il minimo del test dei rapporti, che è già stato calcolato per determinare la colonna pivot. L'aggiornamento è quindi una sola moltiplicazione per uno scalare della riga \(\bar{a}_{rj}\), e costa \(n\) operazioni.
-
Poiché \(\frac{\bar{c}_p}{\bar{a}_{rp}} \le \frac{\bar{c}_j}{\bar{a}_{rj}}\) per ogni \(j \in \pazocal{N}\) con \(\bar{a}_{rj} < 0\), i costi ridotti aggiornati restano non positivi: la base resta duale ammissibile, come richiesto.
I due algoritmi rivisti sono perfettamente simmetrici: ciascuno risolve due sistemi di equazioni lineari per iterazione, uno con \({\boldsymbol A}_{\pazocal{B}}\) a destra del vettore incognito e uno con \({\boldsymbol A}_{\pazocal{B}}\) alla sua sinistra, e aggiorna l'altro vettore invece di ricalcolarlo.
| simplesso rivisto | simplesso duale rivisto | |
|---|---|---|
| primo sistema | \({\boldsymbol \pi} \, {\boldsymbol A}_{\pazocal{B}} = {\boldsymbol c}'_{\pazocal{B}}\) | \({\boldsymbol A}_{\pazocal{B}} \, \bar{\boldsymbol b} = {\boldsymbol b}\) |
| fornisce | i costi ridotti \(\bar{\boldsymbol c}\) | i valori in base \(\bar{\boldsymbol b}\) |
| serve a scegliere | la colonna pivot | la riga pivot |
| secondo sistema | \({\boldsymbol A}_{\pazocal{B}} \, {\boldsymbol d} = {\boldsymbol A}_{p}\) | \({\boldsymbol u} \, {\boldsymbol A}_{\pazocal{B}} = {\boldsymbol e}'_{r}\) |
| fornisce | la colonna \(\bar{\boldsymbol A}_p\) | la riga \(\bar{a}_{r\cdot}\) |
| serve per | il test dei rapporti | il test dei rapporti |
| aggiornato, non ricalcolato | \(\bar{\boldsymbol b}\) | \(\bar{\boldsymbol c}\) |
12.3 Pseudocodice dell'algoritmo del simplesso duale rivisto¶
Algoritmo
-
Input
Un problema LP (12.1) ottenuto da un problema LP in forma canonica di massimo con \({\boldsymbol c} \le {\boldsymbol 0}\) aggiungendo le \(m\) variabili di scarto, in modo che la base delle variabili di scarto sia duale ammissibile.
-
Output
Una soluzione ottima del problema LP (12.1), se esiste; altrimenti, un certificato che il problema LP è inammissibile.
-
Passo 0: Inizializzazione
Considerare la base delle \(m\) variabili di scarto, per la quale \({\boldsymbol A}_{\pazocal{B}} = {\boldsymbol I}\) e \(\bar{c}_j = c_j \le 0\) per ogni \(j \in \pazocal{N}\), cioè la base è duale ammissibile. Andare al Passo \(1\).
-
Passo 1: Test di ammissibilità
- a. Risolvere \({\boldsymbol A}_{\pazocal{B}} \; \bar{\boldsymbol b} = {\boldsymbol b}\) per calcolare \(\bar{\boldsymbol b} = {\boldsymbol A}_{\pazocal{B}}^{-1} \, {\boldsymbol b}\).
Se \(\bar{\boldsymbol b} \ge {\boldsymbol 0}\), allora la soluzione di base ammissibile \({\boldsymbol x}_{\pazocal{B}}={{\bar{\boldsymbol b}}}\) e \({\boldsymbol x}_{\pazocal{N}}={{{\boldsymbol 0}}}\) è una soluzione ottima, di valore ottimo \({\bar{z}} = {\boldsymbol c}'_{\pazocal{B}} \; \bar{\boldsymbol b}\).
STOP. Altrimenti andare al Passo \(2\). -
Passo 2: Operazioni di pivot duali
La riga pivot è la variabile in base \(x_r\) con l'indice minimo \(r \in \pazocal{B}\) tra quelle con \(\bar{b}_{r} < 0\).
-
a. Risolvere \({\boldsymbol u} \; {\boldsymbol A}_{\pazocal{B}} = {\boldsymbol e}'_{r}\) e calcolare \(\bar{a}_{rj} = {\boldsymbol u} \; {\boldsymbol A}_{j}\) per ogni \(j \in \pazocal{N}\).
-
b. Se \(\bar{a}_{rj} \ge 0\) per ogni \(j \in \pazocal{N}\), allora il problema LP (12.1) è inammissibile.
STOP. -
c. Determinare la colonna pivot, cioè una variabile fuori base \(x_p\) con \(p \in \pazocal{N}\) tale che
\[ \frac{\bar{c}_p}{\bar{a}_{rp}} = \min \left\{~\frac{\bar c_j}{\bar a_{rj}}: j\in\pazocal{N},~\bar a_{rj}<0 ~\right\} ; \]in caso di pareggio, si sceglie la variabile fuori base con l'indice minimo.
-
d. Aggiornare i costi ridotti:
\[ \bar{c}_j \leftarrow \bar{c}_j - \frac{\bar{c}_p}{\bar{a}_{rp}} \; \bar{a}_{rj}, ~~ \forall j \in \pazocal{N} \setminus \{p\} , \qquad {\rm e} \qquad \bar{c}_r \leftarrow - \, \frac{\bar{c}_p}{\bar{a}_{rp}} . \] -
e. Aggiornare la base con la nuova partizione degli indici delle variabili:
\[ \pazocal{B} \leftarrow \big(\pazocal{B} \setminus \{ r \} \big) \cup \{ p \} {\rm ~~~e~~~} \pazocal{N} \leftarrow \big(\pazocal{N} \setminus \{ p \} \big) \cup \{ r \} . \]
Andare al Passo \(1\).
-
L'algoritmo del simplesso duale rivisto non aggiorna il dizionario: a ogni iterazione aggiorna solo la partizione \(\pazocal{B}\) e \(\pazocal{N}\) e i costi ridotti \(\bar{\boldsymbol c}\), e ricalcola \(\bar{\boldsymbol b}\) e la riga \(\bar{a}_{r\cdot}\) risolvendo i due sistemi di equazioni lineari.
12.4 Esecuzione dell'algoritmo del simplesso duale rivisto¶
-
Consideriamo il seguente problema LP in forma canonica di massimo con \(n=2\) variabili non negative e \(m=3\) vincoli lineari di minore o uguale, che viene risolto negli esempi di questa sezione:
\[ \begin{array}{rrrrrrrrrrrrr} {\max} & {-} \, {x_1} & {-} & {3} \, {x_2} \\[1.5ex] \text{soggetto a} & {-} \, {x_1} & {-} & {2}\, {x_2} & {\le} & {-6} \\[1.5ex] & \, {x_1} & {-} & {4} \, {x_2} & {\le} & {-6} \\[1.5ex] & {2} \, {x_1} & {-} & {2} \, {x_2} & {\le} & {3} \\[1.5ex] & {x_1,} & & {x_2} & { \ge} & { 0 } \end{array} \] -
Aggiungendo \(m=3\) variabili di scarto otteniamo la sua forma standard di massimo, con
\[ {\boldsymbol c}= \begin{pmatrix} -1 \\[0.5ex] -3 \\[0.5ex] 0 \\[0.5ex] 0 \\[0.5ex] 0 \end{pmatrix} \quad {\boldsymbol A}= \begin{pmatrix} -1 & -2 & 1 & 0 & 0\\[1ex] 1 & -4 & 0 & 1 & 0\\[1ex] 2 & -2 & 0 & 0 & 1\\ \end{pmatrix} \quad {\boldsymbol b}= \begin{pmatrix} -6 \\[1ex] -6 \\[1ex] 3 \\ \end{pmatrix} \]Poiché \({\boldsymbol c} \le {\boldsymbol 0}\), la partizione \(\pazocal{B}= \{3,~~4,~~5\}\) e \(\pazocal{N}= \{1,~~2\}\) è duale ammissibile, con costi ridotti \(\bar{c}_1 = c_1 = -1\) e \(\bar{c}_2 = c_2 = -3\).
Esempio 12.1: algoritmo del simplesso duale rivisto – prima iterazione
Con \(\pazocal{B}= \{3,~~4,~~5\}\) e \(\pazocal{N}= \{1,~~2\}\) abbiamo \({\boldsymbol A}_{\pazocal{B}} = {\boldsymbol I}\), e i costi ridotti sono \(\bar{c}_1 = -1\) e \(\bar{c}_2 = -3\).
Primo sistema. Risolviamo \({\boldsymbol A}_{\pazocal{B}} \; \bar{\boldsymbol b} = {\boldsymbol b}\):
Poiché \(\bar b_3 = -6 < 0\), la base non è primale ammissibile. Tra \(x_3\) e \(x_4\), entrambe con valore \(-6\), scegliamo quella con l'indice minimo, \(x_3\), come riga pivot.
Secondo sistema. La variabile in base \(x_3\) è la prima di \(\pazocal{B}\), e quindi \({\boldsymbol e}_{3} = (1~~0~~0)'\). Risolviamo \({\boldsymbol u} \; {\boldsymbol A}_{\pazocal{B}} = {\boldsymbol e}'_{3}\) e otteniamo \({\boldsymbol u} = (1~~0~~0)\). La riga di \(\bar{\boldsymbol A}\) associata a \(x_3\) è quindi
entrambi negativi, e quindi il problema LP non risulta inammissibile.
Test dei rapporti. Entrambe le variabili fuori base sono candidate:
e quindi la colonna pivot è \(x_1\).
Aggiornamento dei costi ridotti. Con \(\frac{\bar{c}_1}{\bar{a}_{31}} = 1\) otteniamo
La nuova partizione è \(\pazocal{B}= \{1,~~4,~~5\}\) e \(\pazocal{N}= \{2,~~3\}\).
Esempio 12.2: algoritmo del simplesso duale rivisto – seconda iterazione
Con \(\pazocal{B}= \{1,~~4,~~5\}\) e \(\pazocal{N}= \{2,~~3\}\) abbiamo
e i costi ridotti, aggiornati all'iterazione precedente, sono \(\bar{c}_2 = -1\) e \(\bar{c}_3 = -1\).
Primo sistema. Risolviamo \({\boldsymbol A}_{\pazocal{B}} \; \bar{\boldsymbol b} = {\boldsymbol b}\), cioè
Due variabili in base hanno valore negativo. Scegliamo quella con l'indice minimo, \(x_4\), come riga pivot.
Secondo sistema. La variabile in base \(x_4\) è la seconda di \(\pazocal{B}\), e quindi \({\boldsymbol e}_{4} = (0~~1~~0)'\). Risolviamo \({\boldsymbol u} \; {\boldsymbol A}_{\pazocal{B}} = {\boldsymbol e}'_{4}\), cioè
e la riga di \(\bar{\boldsymbol A}\) associata a \(x_4\) è
Test dei rapporti. L'unica candidata è \(x_2\), poiché \(\bar{a}_{42} = -6 < 0\) mentre \(\bar{a}_{43} = 1 \ge 0\):
e quindi la colonna pivot è \(x_2\).
Aggiornamento dei costi ridotti. Con \(\frac{\bar{c}_2}{\bar{a}_{42}} = \frac{1}{6}\) otteniamo
La nuova partizione è \(\pazocal{B}= \{1,~~2,~~5\}\) e \(\pazocal{N}= \{3,~~4\}\).
Esempio 12.3: algoritmo del simplesso duale rivisto – terza iterazione
Con \(\pazocal{B}= \{1,~~2,~~5\}\) e \(\pazocal{N}= \{3,~~4\}\) abbiamo
e i costi ridotti sono \(\bar{c}_3 = - \frac{7}{6}\) e \(\bar{c}_4 = - \frac{1}{6}\).
Primo sistema. Risolviamo \({\boldsymbol A}_{\pazocal{B}} \; \bar{\boldsymbol b} = {\boldsymbol b}\), cioè
Ora \(\bar{\boldsymbol b} \ge {\boldsymbol 0}\): la base è primale ammissibile e duale ammissibile, e quindi è ottima. Non serve risolvere altri sistemi: il valore ottimo è il prodotto scalare
Una soluzione ottima di questo problema LP è
e il valore ottimo è \(z(\, LP \,) = -8\).
Se è richiesta anche la soluzione ottima del problema duale, la si ottiene con un ulteriore sistema di equazioni lineari, risolto una sola volta alla fine e non a ogni iterazione:
cioè \(\tilde{\boldsymbol \pi}(\, D(LP) \,) = \left(\frac{7}{6}~~\frac{1}{6}~~0\right)'\), il cui valore obiettivo è \({\boldsymbol b}' \tilde{\boldsymbol \pi} = -8 = z(\, LP \,)\), in accordo con il teorema della dualità forte.
Esercizi su questo capitolo: Algoritmo del simplesso duale rivisto