Algoritmo del simplesso rivisto¶
Parte 4 · Metodi matriciali, sensitività e geometria · Capitolo 11 · Dispensa, volume 4 (PDF) · Esercizi: Algoritmo del simplesso rivisto
Esempio 11.1: un problema LP in forma canonica e la sua forma standard
Consideriamo il seguente problema LP in forma canonica di massimo con \(n=2\) variabili e \(m=3\) vincoli:
La sua forma standard equivalente con \(n+m=5\) variabili e \(m=3\) vincoli è:
Per questo problema LP in forma standard abbiamo:
Poiché \(\begin{pmatrix} 12 \\[1ex] 12 \\[1ex] 8 \end{pmatrix} \ge \begin{pmatrix} 0 \\[1ex] 0 \\[1ex] 0 \end{pmatrix}\), con \(\pazocal{B}=\{3,4,5\}\) e \(\pazocal{N}=\{1,2\}\) abbiamo la seguente soluzione di base ammissibile iniziale:
11.1 Operazioni di pivot con due sistemi di equazioni lineari¶
-
Data una base \({\boldsymbol A}_{\pazocal{B}}\), tutte le informazioni necessarie per le operazioni di pivot si possono determinare risolvendo due sistemi di equazioni lineari.
-
1. Primo sistema di equazioni lineari
-
I costi ridotti e il valore della soluzione di base ammissibile si possono determinare calcolando direttamente \(\red{{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}}\) poiché:
\[ {{ \bar{\boldsymbol c}}'} = {{\boldsymbol c}'_{\pazocal{N}} - \red{{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}} \;{\boldsymbol A}_{\pazocal{N}}}~~~~~ {\rm e}~~~~~ {\bar{z}} = \red{{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}} \; {\boldsymbol b} \]Ponendo \({\boldsymbol \pi} = {{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}}\), il vettore riga \({\boldsymbol \pi} \in \R^{1 \times m}\) di \(m\) colonne si può trovare risolvendo il seguente sistema di equazioni lineari:
\[ {\boldsymbol \pi} \; {\boldsymbol A}_{\pazocal{B}} = {\boldsymbol c}'_{\pazocal{B}} ~~~\Longrightarrow~~~ {\boldsymbol \pi} = \red{{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}} \text{ dove } {\boldsymbol \pi} = [\pi_{j}] \text{ con } j \in \pazocal{B} \]Negli esempi le componenti di \({\boldsymbol \pi}\) sono indicate con gli indici \(j \in \pazocal{B}\) delle variabili in base, ma ogni componente di \({\boldsymbol \pi}\) corrisponde a un vincolo, cioè a una riga di \({\boldsymbol A}_{\pazocal{B}}\): la \(i\)-esima componente di \({\boldsymbol \pi}\) è associata all'\(i\)-esimo vincolo.
-
-
2. Secondo sistema di equazioni lineari
-
Data una colonna pivot \(x_p\) con \(p \in \pazocal{N}\), la riga pivot e l'aggiornamento della soluzione di base ammissibile corrente si possono ottenere calcolando direttamente \(\violet{{\boldsymbol A}_{\pazocal{B}}^{-1} \;{\boldsymbol A}_{p}}\) poiché:
\[ {\boldsymbol x}_{\pazocal{B}} = {{\bar{\boldsymbol b}}} - \violet{{{\boldsymbol A}_{\pazocal{B}}^{-1} \;{\boldsymbol A}_{p}}} \; x_{p} \]Ponendo \({\boldsymbol d} = {{ {\boldsymbol A}_{\pazocal{B}}^{-1}} {\boldsymbol A}_{p}}\), il vettore colonna \({\boldsymbol d} \in \R^{m \times 1}\) di \(m\) righe (associate alle variabili in base) si può trovare risolvendo il seguente sistema di equazioni lineari:
\[ {\boldsymbol A}_{\pazocal{B}} \; {\boldsymbol d} = {\boldsymbol A}_{p} ~~~\Longrightarrow~~~{\boldsymbol d} = \violet{{ {\boldsymbol A}_{\pazocal{B}}^{-1}} {\boldsymbol A}_{p}} \text{ dove } {\boldsymbol d} = [d_{i}] \text{ con } i \in \pazocal{B} \]
-
Esempio 11.2: Sistemi di equazioni lineari
Per il problema LP dell'Esempio 11.1 con \(\pazocal{B}= \{1,~~3,~~4\}\), \(\pazocal{N}= \{2,~~5\}\) e \(x_2\) come colonna pivot, abbiamo:
Risolviamo \({\boldsymbol \pi} \; {\boldsymbol A}_{\pazocal{B}} = {\boldsymbol c}'_{\pazocal{B}}\) per calcolare \({\boldsymbol \pi} = {{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}}\), primo sistema di equazioni lineari:
Risolviamo \({\boldsymbol A}_{\pazocal{B}} \; {\boldsymbol d} = {\boldsymbol A}_{2}\) per calcolare \({\boldsymbol d}={ {\boldsymbol A}_{\pazocal{B}}^{-1}} {\boldsymbol A}_{2}\), secondo sistema di equazioni lineari:
L'algoritmo del simplesso rivisto non calcola mai la matrice inversa \({\boldsymbol A}_{\pazocal{B}}^{-1}\): a ogni iterazione risolve due sistemi di equazioni lineari, uno per il vettore riga \({\boldsymbol \pi}\) e uno per il vettore colonna \({\boldsymbol d}\). Risolvere un sistema di \(m\) equazioni lineari costa meno, dal punto di vista computazionale, che invertire una matrice di dimensione \(m\), e la matrice \({\boldsymbol A}_{\pazocal{B}}\) dei due sistemi è la stessa.
11.2 Pseudocodice dell'algoritmo del simplesso rivisto¶
Algoritmo
-
Passo 0: Inizializzazione
Trovare una soluzione di base ammissibile \({\boldsymbol x}_{\pazocal{B}}={{\bar{\boldsymbol b}}}\) e \({\boldsymbol x}_{\pazocal{N}}={{{\boldsymbol 0}}}\) del problema LP in forma standard di massimo. Andare al Passo \(1\).
-
Passo 1: Test di ottimalità
-
a. Risolvere \({\boldsymbol \pi} \; {\boldsymbol A}_{\pazocal{B}} = {\boldsymbol c}'_{\pazocal{B}}\) per calcolare \({\boldsymbol \pi} = {{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}}\)
-
b. Calcolare i costi ridotti e il valore della soluzione di base ammissibile:
\[ {{ \bar{\boldsymbol c}}}' = {{\boldsymbol c}'_{\pazocal{N}} - \underbrace{{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}}_{={\boldsymbol \pi}} \;{\boldsymbol A}_{\pazocal{N}}} \qquad \qquad {\bar{z}} = \underbrace{{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}}_{={\boldsymbol \pi}} \; {\boldsymbol b} \]
Se \({{ \bar{\boldsymbol c}}'} \le {\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 e \({\bar{z}}\) è il valore ottimo, altrimenti andare al Passo \(2\).
-
-
Passo 2: Operazioni di pivot
La colonna pivot è una variabile fuori base \(x_p\) con \(p \in \pazocal{N}\) tale che:
\[ {c}_{p} >\underbrace{{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}}_{={\boldsymbol \pi}} \;{\boldsymbol A}_{p} \]-
a. Risolvere \({\boldsymbol A}_{\pazocal{B}} \; {\boldsymbol d} = {\boldsymbol A}_{p}\) per calcolare \({\boldsymbol d}={ {\boldsymbol A}_{\pazocal{B}}^{-1}} {\boldsymbol A}_{p}\)
-
b. Se \({\boldsymbol d} \le {\boldsymbol 0}\), allora il problema LP è illimitato.
STOP. -
c. Trovare il valore massimo di \(t\) (indicato con \(t_m\)) tale che:
\[ {{\bar{\boldsymbol b}}} - t \; \underbrace{ {\boldsymbol A}_{\pazocal{B}}^{-1} {\boldsymbol A}_{p}}_{={\boldsymbol d}} \ge 0 \qquad \Longrightarrow \qquad t_m \leftarrow \min \left\{~\frac{\bar b_i}{d_i}: i\in\pazocal{B},~d_i>0 ~\right\} \]
La riga pivot è una variabile in base \(x_r\) con \(r \in \pazocal{B}\) tale che:
\[ \bar{b}_r - t_m \; \underbrace{\bar{a}_{rp}}_{=d_r} = 0 \]-
d. 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 \} \] -
e. Aggiornare la soluzione di base ammissibile (nuovo vettore \({{\bar{\boldsymbol b}}}\)):
\[ x_i = \bar{b}_i - t_m \; \underbrace{\bar{a}_{ip}}_{=d_i},~\forall i \in \pazocal{B} \setminus \{p\},~~ x_p = t_m {\rm ~~~~~~e~~~~~~} x_i = 0,~\forall i \in \pazocal{N} \]
Andare al Passo \(1\).
-
Esempio 11.3: algoritmo del simplesso rivisto – prima iterazione
Inizializzazione
Nel problema LP dell'Esempio 11.1, \(\begin{pmatrix} x_3 \\ x_4 \\ x_5 \\ \end{pmatrix} \!=\! \begin{pmatrix} 12 \\ 12 \\ 8 \\ \end{pmatrix} ~ \begin{pmatrix} x_1 \\ x_2 \end{pmatrix} \!=\! \begin{pmatrix} 0 \\ 0 \end{pmatrix}\) è una soluzione di base ammissibile con \(\bar{\boldsymbol b} \!=\! \begin{pmatrix} 12 \\ 12 \\ 8 \\ \end{pmatrix}\).
Test di ottimalità
Con \(\pazocal{B}=\{3,4,5\}\) e \(\pazocal{N}=\{1,2\}\), risolviamo \({\boldsymbol \pi} \; {\boldsymbol A}_{\pazocal{B}} = {\boldsymbol c}'_{\pazocal{B}}\) per calcolare \({\boldsymbol \pi} = {{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}}\).
Calcoliamo il valore della soluzione di base ammissibile \({\bar{z} } = {\boldsymbol \pi} \; {\boldsymbol b} = \begin{pmatrix} 0 & 0 & 0 \\ \end{pmatrix} \begin{pmatrix} 12 \\ 12 \\ 8 \\ \end{pmatrix} = 0.\) Calcoliamo i costi ridotti \({{ \bar{\boldsymbol c} }'} = {{\boldsymbol c}'_{\pazocal{N}} - {\boldsymbol \pi} \; {\boldsymbol A}_{\pazocal{N}}}\):
Operazione di pivot
Poiché \({c}_{1}>{\boldsymbol \pi} \;{\boldsymbol A}_{1}\), \(x_1\) è la colonna pivot. Risolviamo \({\boldsymbol A}_{\pazocal{B}} \; {\boldsymbol d} = {\boldsymbol A}_{1}\) per calcolare \({\boldsymbol d}={ {\boldsymbol A}_{\pazocal{B}}^{-1}} {\boldsymbol A}_{1}\).
Dobbiamo trovare il valore massimo di \(t\) tale che \({{ \bar{\boldsymbol b} }} - t \; {{\boldsymbol d }} \ge 0\):
Il valore della colonna pivot diventa \(t_{m}\), cioè \(x_1=\frac{8}{3}\). Il valore di \(x_5\) diventa zero e \(x_5\) è la riga pivot. Le altre variabili in base assumono i valori \({ \bar{\boldsymbol b} } - t_{m} \; {\boldsymbol d}\), quindi abbiamo:
La nuova partizione degli indici delle variabili è \(\pazocal{B}=\{1,3,4\}\) e \(\pazocal{N}=\{2,5\}\).
Esempio 11.4: algoritmo del simplesso rivisto – seconda iterazione
Test di ottimalità
Con \(\pazocal{B}=\{1,3,4\}\) e \(\pazocal{N}=\{2,5\}\), risolviamo \({\boldsymbol \pi} \; {\boldsymbol A}_{\pazocal{B}} = {\boldsymbol c}'_{\pazocal{B}}\) per calcolare \({\boldsymbol \pi} = {{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}}\).
Calcoliamo il valore della soluzione di base ammissibile \({\bar{z} } = {\boldsymbol \pi} \; {\boldsymbol b} = \begin{pmatrix} 0& 0 & \frac{5}{3} \\ \end{pmatrix} \begin{pmatrix} 12 \\ 12 \\ 8 \\ \end{pmatrix} = \frac{40}{3}.\) Calcoliamo i costi ridotti \({{ \bar{\boldsymbol c} }'} = {{\boldsymbol c}'_{\pazocal{N}} - {\boldsymbol \pi} \; {\boldsymbol A}_{\pazocal{N}}}\):
Operazione di pivot
Poiché \({c}_{2} > {\boldsymbol \pi} \;{\boldsymbol A}_{2}\), \(x_2\) è la colonna pivot. Risolviamo \({\boldsymbol A}_{\pazocal{B}} \; {\boldsymbol d} = {\boldsymbol A}_{2}\) per calcolare \({\boldsymbol d}={ {\boldsymbol A}_{\pazocal{B}}^{-1}} {\boldsymbol A}_{2}\).
Dobbiamo trovare il valore massimo di \(t\) tale che \({{ \bar{\boldsymbol b} }} - t \; {{\boldsymbol d}} \ge 0\):
Il valore della colonna pivot diventa \(t_{m}\), cioè \(x_2=\frac{7}{2}\). Il valore di \(x_4\) diventa zero e \(x_4\) è la riga pivot. Le altre variabili in base assumono i valori \({ \bar{\boldsymbol b} } - t_{m} \; {\boldsymbol d}\), quindi abbiamo:
La nuova partizione degli indici delle variabili è \(\pazocal{B}=\{1,2,3\}\) e \(\pazocal{N}=\{4,5\}\).
Esempio 11.5: algoritmo del simplesso rivisto – terza iterazione
Test di ottimalità
Con \(\pazocal{B}=\{1,2,3\}\) e \(\pazocal{N}=\{4,5\}\), risolviamo \({\boldsymbol \pi} \; {\boldsymbol A}_{\pazocal{B}} = {\boldsymbol c}'_{\pazocal{B}}\) per calcolare \({\boldsymbol \pi} = {{{\boldsymbol c}'_{\pazocal{B}} \; {\boldsymbol A}_{\pazocal{B}}^{-1}}}\).
Calcoliamo il valore della soluzione di base ammissibile \({\bar{z} } = {\boldsymbol \pi} \; {\boldsymbol b} = \begin{pmatrix} 0 & 2 &1 \\ \end{pmatrix} \begin{pmatrix} 12 \\ 12 \\ 8 \\ \end{pmatrix} = 32\)
Calcoliamo i costi ridotti \({{ \bar{\boldsymbol c} }'} = {{\boldsymbol c}'_{\pazocal{N}} - {\boldsymbol \pi} \; {\boldsymbol A}_{\pazocal{N}}}\):
Tutti i costi ridotti sono non positivi, quindi la soluzione di base ammissibile
è una soluzione ottima del problema LP e \({\bar{z}} = 32\) è il valore ottimo.
Esercizi su questo capitolo: Algoritmo del simplesso rivisto