diff --git a/src/components/PLatex.js b/src/components/PLatex.js new file mode 100644 index 0000000..bcdfb02 --- /dev/null +++ b/src/components/PLatex.js @@ -0,0 +1,9 @@ +import Latex from "./Latex"; + +export default function (props) { + return ( +

+ {props.children} +

+ ); +} diff --git a/src/routes/ottimizzazioneLineare.js b/src/routes/ottimizzazioneLineare.js index 722755e..7d75761 100644 --- a/src/routes/ottimizzazioneLineare.js +++ b/src/routes/ottimizzazioneLineare.js @@ -13,6 +13,7 @@ import Unfeasible from "../components/OttimizzazioneLineare/Unfeasible"; import Unbounded from "../components/OttimizzazioneLineare/Unbounded"; import Min from "../components/OttimizzazioneLineare/Min"; import Max from "../components/OttimizzazioneLineare/Max"; +import PLatex from "../components/PLatex"; const r = String.raw; @@ -47,99 +48,141 @@ export default class OttimizzazioneLineare extends Component { {r`z = C_1 \cdot x_1 + C_2 \cdot x_2 + C_n \cdot x_n`}

+ + + +

+ I problemi di ottimizzazione lineare sono problemi che cercano di minimizzare/massimizzare il valore di una funzione obiettivo le cui incognite sono sottoposte a un sistema di vincoli. +

+
+ +

+ La funzione da minimizzare/massimizzare. +

+

+ Il vettore dei suoi coefficienti è detto {r`\mathbf{c}`}, mentre quello delle sue incognite {r`\mathbf{x}`}. +

+

+ Si può ricavare la sua soluzione, detta valore ottimo, dal prodotto vettoriale {r`\mathbf{c} \times \mathbf{x}`}, scritto solitamente in forma matriciale come {r`\mathbf{c}^T \mathbf{x}`}. +

+

+ Spesso, la funzione obiettivo è indicata con il nome {r`z(\dots)`}. +

+
+ +

+ Equazioni e disequazioni a cui devono sottostare le incognite perchè esse formino una soluzione valida. +

+

+ I loro coefficienti sono contenuti nella matrice {r`\mathbf{A}`}, mentre i loro termini noti nel vettore {r`\mathbf{b}`}. +

+

- Funzione della funzione obiettivo che indica la direzione del suo aumento più veloce. + Funzione della funzione obiettivo che restituisce la direzione del suo aumento più veloce.

- {r`\nabla f = \frac{\delta f}{\delta x_1} e_1 + \frac{\delta f}{\delta x_2} e_2 + \frac{\delta f}{\delta x_n} e_n`} -

-

- {r`e_i`} è la direzione della coordinata i-esima. + {r`\nabla f = \frac{\delta f}{\delta x_1} \mathbf{I}_1 + \frac{\delta f}{\delta x_2} \mathbf{I}_2 + \frac{\delta f}{\delta x_n} \mathbf{I}_n`}

- Se {r`n = 3`}, allora: -
    -
  • {r`e_1 = (1, 0, 0)`}
  • -
  • {r`e_2 = (0, 1, 0)`}
  • -
  • {r`e_3 = (0, 0, 1)`}
  • -
+ La matrice {r`\mathbf{I}`} è la matrice identità.
Se la funzione obiettivo è z = 2w + 3x + 4y, il suo gradiente è {r`\nabla z = (2, 3, 4)`}.
- - + + +

+ Un problema con: +

    -
  • Solo equazioni
  • -
  • Tutte le variabili maggiori di zero
  • +
  • Equazioni e disequazioni
  • +
  • Variabili non vincolate
+ {r`min \left\{ \mathbf{c}^T \mathbf{x} : \mathbf{A} \mathbf{x} = b,\quad \mathbf{A'} \mathbf{x} \geq \mathbf{b'} \quad x_j \geq 0,\quad j = 1 \dots n \right\}`}
+

+ Un problema con: +

    -
  • Equazioni e disequazioni
  • -
  • Tutte le variabili maggiori di zero
  • +
  • Solo disequazioni
  • +
  • Vincoli di non-negatività sulle incognite
+ {r`min \left\{ \mathbf{c}^T \mathbf{x} : \mathbf{A} \mathbf{x} \geq b,\quad x_j \geq 0,\quad j = 1 \dots n \right\}`}
- + +

+ Un problema con: +

    -
  • Equazioni e disequazioni
  • -
  • Variabili con qualsiasi valore
  • +
  • Solo equazioni
  • +
  • Vincoli di non-negatività sulle incognite
+ {r`min \left\{ \mathbf{c}^T \mathbf{x} : \mathbf{A} \mathbf{x} = b,\quad x_j \geq 0,\quad j = 1 \dots n \right\}`}
- - + +

- Convertiamo ogni equazione {r`=`} in due disequazioni {r`\leq`} e {r`\geq`}, + Applica questa conversione a ogni equazione nel sistema:

- Why would you ever do that?! +

+ {r`a = b \Leftrightarrow + \begin{cases} + a \leq b\\ + a \geq b + \end{cases} + `} +

+ Serve solo nella teoria per dimostrare che le forme sono equivalenti.
- +

- Convertiamo le disequazioni in equazioni aggiungendo una variabile slack. + Aggiungi una variabile slack {r`s`} non-vincolata a ogni disequazione nel sistema: +

+

+ {r` + a \leq b \Leftrightarrow a + s = b + `} +

+

+ {r` + a \geq b \Leftrightarrow a - s = b + `}

- - {r`a \leq 3`} diventa {r`a + s_1 = 3`}. -
- +

- Sostituiamo le variabili potenzialmente negative (unconstrained) {r`x_j`} con due variabili {r`x_j^+`} e {r`x_j^-`}. + Sdoppia ogni variabile non-vincolata in due variabili con vincolo di non-negatività: +

+

+ {r`\begin{cases} + a = a^+ - a^-\\ + a^+ \geq 0\\ + a^- \geq 0 + \end{cases}`}

- - {r`a \in \mathbb{Z}`} diventa {r`a^+ \in \mathbb{N}`} e {r`-a^- \in \mathbb{N}`}. -
- -

- La funzione da minimizzare/massimizzare, tipicamente indicata con una {r`z`} al termine noto. -

-
- -

- Le funzioni del sistema che non sono quella obiettivo. -

-
- +

Un modo per rappresentare sistemi in forma standard, anche noto come matrice equivalente completa del sistema.

Il sistema:

- {r` + {r` \begin{cases} - 2000A + 1000B = z\\ - 1A \leq 3\\ - 1B \leq 3\\ - 2A + 2B \leq 7 + 2000x_1 + 1000x_2 = z\\ + 1x_1 \leq 3\\ + 1x_2 \leq 3\\ + 2x_1 + 2x_2 \leq 7 \end{cases} `}

- Diventa in forma di tableau:

+ Diventa il tableau:

@@ -183,15 +226,12 @@ export default class OttimizzazioneLineare extends Component {
- +

- Variabili che hanno tutti 0 e un 1 nella loro colonna del tableu. + Variabili che hanno tutti 0 e un solo 1 nella loro colonna del tableau.

- La loro controparte sono le variabili fuori base. -

-

- Un sistema lineare è risolto quando tutte le variabili originali (x_n) sono nella base. + La loro controparte sono le variabili fuori base, che hanno qualsiasi altro valore.

@@ -203,6 +243,11 @@ export default class OttimizzazioneLineare extends Component { E' spiegato in modo semplice qui, e ci sono dei codici sorgenti di esempio qui. + +

+ Questa è la soluzione passo per passo del problema 3 del file Ex_LP_testo. +

+
    @@ -214,20 +259,16 @@ export default class OttimizzazioneLineare extends Component { Scegli la prima variabile con coefficiente positivo/negativo nella funzione obiettivo: essa è la variabile entrante. Si potrebbe scegliere qualsiasi variabile, ma scegliendo sempre la prima possibile (Regola di Bland) ci si assicura che l'algoritmo termini. -
  1. Trova la variabile di base (detta variabile uscente) tramite il rapporto {r`\frac{termine\ noto}{coeff.\ variabile\ entrante}`}: scegli la variabile con il rapporto minore, assicurandoti che esso sia positivo. Se tutti i rapporti sono negativi, allora il problema è .
  2. +
  3. Trova la variabile di base (detta variabile uscente) tramite il rapporto {r`\frac{termine\ noto}{coeff.\ variabile\ entrante}`}:
    scegli la variabile con il rapporto minore, assicurandoti che esso sia positivo.
    Se tutti i rapporti sono negativi, allora il problema è .
  4. Riscrivi tutte le funzioni del sistema in termini della variabile entrante.
-
  • I termini noti dei vincoli sono le coordinate del risultato, mentre il termine noto della funzione obiettivo è il valore minimizzato/massimizzato.
  • +
  • I termini noti dei vincoli sono le coordinate del risultato, mentre il termine noto della funzione obiettivo è il valore ottimo.
  • + + È praticamente l'algoritmo di Gauss-Jordan applicato il tableau con delle regole aggiuntive per la decisione delle variabili di pivot. +
    - -

    - Se il problema è rappresentato in forma di tableau, allora esso è risolvibile applicando l'algoritmo di Gauss-Jordan, in aggiunta tenendo conto delle regole per la selezione delle variabili entranti e uscenti. -

    -
    -
    -

    Una soluzione con almeno una variabile di valore 0, dovuta a uno o più vincoli ridondanti. @@ -236,14 +277,6 @@ export default class OttimizzazioneLineare extends Component { Senza Regola di Bland e in presenza di vincoli ridondanti si rischia di trovarsi a fare pivot infiniti.

    - - - Ho risolto il problema 3 del file Ex_LP_testo con il Simplex: -

    - -

    -
    -
    @@ -251,7 +284,10 @@ export default class OttimizzazioneLineare extends Component { Un estensione del Simplex per permettere la risoluzione di problemi la cui origine non è una soluzione ammissibile.

    - Prevede l'introduzione di un problema ausiliario, le cui variabili sono dette artificiali e sono solitamente rappresentate come {r`y_n`}. + Prevede l'introduzione di un problema ausiliario, le cui incognite sono dette artificiali. +

    +

    + Il vettore delle incognite artificiali è solitamente chiamato {r`\mathbf{y}`}.

    E' spiegato in modo semplice qui. @@ -269,10 +305,10 @@ export default class OttimizzazioneLineare extends Component {
    - - + +

    - Una versione semplificata di un problema nella quale si ignorano uno o più vincoli. + Una versione semplificata di un problema nella quale si ignora la violazione di uno o più vincoli.

    @@ -280,7 +316,10 @@ export default class OttimizzazioneLineare extends Component { Un rilassamento che permette di misurare di quanto i vincoli vengono violati.

    - I vincoli vengono aggiunti alla funzione obiettivo assieme a un moltiplicatore, solitamente rappresentato con {r`u_n`}. + I vincoli, moltiplicati per coefficienti di rilassamento, vengono inseriti nella funzione obiettivo. +

    +

    + Il vettore dei coefficienti di rilassamento solitamente è indicato con {r`\mathbf{u}`}.

    @@ -307,6 +346,8 @@ export default class OttimizzazioneLineare extends Component { `} + +

    Il sistema che massimizza/minimizza i moltiplicatori di rilassamento di un qualsiasi sistema, detto primale. @@ -341,6 +382,12 @@ export default class OttimizzazioneLineare extends Component {

    Il teorema che dimostra l'equivalenza tra primale e duale.

    +

    + Se uno dei due problemi è finito, la soluzione di uno coincide con la soluzione dell'altro. +

    +

    + {r`\mathbf{c}^T \mathbf{x} = \mathbf{u}^T \mathbf{b}`} +

    TODO: Anche qui c'è una lunga dimostrazione...