2020-03-09 23:18:13 +00:00
|
|
|
import {Component} from 'preact'
|
2020-05-23 21:32:09 +00:00
|
|
|
import Split from "../components/old/split";
|
2020-05-23 22:53:01 +00:00
|
|
|
import Latex from "../components/Latex";
|
2020-05-23 21:32:09 +00:00
|
|
|
import Panel from "../components/old/panel";
|
2020-05-23 22:53:01 +00:00
|
|
|
import Example from "../components/example";
|
2020-05-23 21:32:09 +00:00
|
|
|
import Todo from "../components/old/todo";
|
|
|
|
import Minus from "../components/old/minus";
|
|
|
|
import Plus from "../components/old/plus";
|
|
|
|
import Code from "../components/old/code";
|
2020-05-23 22:53:01 +00:00
|
|
|
import Timer from "../components/old/timer";
|
|
|
|
import Image from "../components/Image";
|
2020-03-09 23:19:30 +00:00
|
|
|
|
|
|
|
const r = String.raw;
|
2020-03-09 23:18:13 +00:00
|
|
|
|
|
|
|
export default class OttimizzazioneLineare extends Component {
|
|
|
|
render() {
|
|
|
|
return (
|
|
|
|
<div>
|
2020-03-11 18:12:30 +00:00
|
|
|
<h1>Ottimizzazione lineare intera</h1>
|
2020-05-23 22:53:01 +00:00
|
|
|
<Split title={"Unimore"}>
|
2020-03-09 23:19:30 +00:00
|
|
|
<Panel title={"Videolezioni su YouTube"}>
|
|
|
|
<p>
|
2020-03-23 14:47:42 +00:00
|
|
|
Ho rimosso il rumore in sottofondo da tutti i video di Ricerca Operativa!
|
2020-03-11 16:15:17 +00:00
|
|
|
</p>
|
|
|
|
<p>
|
2020-03-23 14:47:42 +00:00
|
|
|
<b><a href={"https://www.youtube.com/playlist?list=PLh93e8qjTszffkHNn-19CqUOhHFbhBlBh"}>Guardate i video qui!</a></b>
|
2020-03-09 23:19:30 +00:00
|
|
|
</p>
|
|
|
|
</Panel>
|
2020-05-23 22:53:01 +00:00
|
|
|
<Panel title={"Prossimi appelli"}>
|
|
|
|
<ol>
|
|
|
|
<li><Timer to={"2020-06-08"}/></li>
|
|
|
|
<li><Timer to={"2020-06-25"}/></li>
|
|
|
|
<li><Timer to={"2020-07-14"}/></li>
|
|
|
|
</ol>
|
|
|
|
</Panel>
|
2020-03-09 23:19:30 +00:00
|
|
|
</Split>
|
|
|
|
<Split title={"Le basi"}>
|
|
|
|
<Panel title={"Funzione obiettivo"}>
|
|
|
|
<p>
|
|
|
|
La funzione obiettivo è la funzione con valore noto sconosciuto:
|
|
|
|
</p>
|
|
|
|
<p>
|
|
|
|
<Latex>{r`z = C_1 \cdot x_1 + C_2 \cdot x_2 + C_n \cdot x_n`}</Latex>
|
|
|
|
</p>
|
|
|
|
</Panel>
|
|
|
|
<Panel title={"Gradiente"}>
|
|
|
|
<p>
|
|
|
|
Funzione della funzione obiettivo che indica la direzione del suo aumento più veloce.
|
|
|
|
</p>
|
|
|
|
<p>
|
|
|
|
<Latex>{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`}</Latex>
|
|
|
|
</p>
|
|
|
|
<p>
|
|
|
|
<Latex>{r`e_i`}</Latex> è la direzione della coordinata i-esima.
|
|
|
|
</p>
|
|
|
|
<Example>
|
|
|
|
Se <Latex>{r`n = 3`}</Latex>, allora:
|
|
|
|
<ul>
|
|
|
|
<li><Latex>{r`e_1 = (1, 0, 0)`}</Latex></li>
|
|
|
|
<li><Latex>{r`e_2 = (0, 1, 0)`}</Latex></li>
|
|
|
|
<li><Latex>{r`e_3 = (0, 0, 1)`}</Latex></li>
|
|
|
|
</ul>
|
|
|
|
</Example>
|
|
|
|
<Example>
|
|
|
|
Se la funzione obiettivo è <Latex>z = 2w + 3x + 4y</Latex>, il suo gradiente è <Latex>{r`\nabla z = (2, 3, 4)`}</Latex>.
|
|
|
|
</Example>
|
|
|
|
</Panel>
|
|
|
|
</Split>
|
2020-05-23 05:38:07 +00:00
|
|
|
<Split title={"Forme di un sistema"}>
|
|
|
|
<Panel title={"Forma standard"}>
|
2020-03-10 20:59:40 +00:00
|
|
|
<ul>
|
2020-05-23 05:38:07 +00:00
|
|
|
<li><Minus>Solo equazioni</Minus></li>
|
|
|
|
<li><Minus>Tutte le variabili maggiori di zero</Minus></li>
|
2020-03-10 20:59:40 +00:00
|
|
|
</ul>
|
|
|
|
</Panel>
|
2020-05-23 05:38:07 +00:00
|
|
|
<Panel title={"Forma canonica"}>
|
|
|
|
<ul>
|
|
|
|
<li><Plus>Equazioni e disequazioni</Plus></li>
|
|
|
|
<li><Minus>Tutte le variabili maggiori di zero</Minus></li>
|
|
|
|
</ul>
|
|
|
|
</Panel>
|
|
|
|
<Panel title={"Forma generale"}>
|
|
|
|
<ul>
|
|
|
|
<li><Plus>Equazioni e disequazioni</Plus></li>
|
|
|
|
<li><Plus>Variabili con qualsiasi valore</Plus></li>
|
|
|
|
</ul>
|
|
|
|
</Panel>
|
|
|
|
</Split>
|
|
|
|
<Split title={"Equivalenza di forma"}>
|
|
|
|
<Panel title={"Da standard a generale"}>
|
2020-03-10 20:59:40 +00:00
|
|
|
<p>
|
2020-05-23 05:38:07 +00:00
|
|
|
Convertiamo ogni equazione <Latex>{r`=`}</Latex> in due disequazioni <Latex>{r`\leq`}</Latex> e <Latex>{r`\geq`}</Latex>,
|
2020-03-10 20:59:40 +00:00
|
|
|
</p>
|
2020-05-23 05:38:07 +00:00
|
|
|
<Example>Why would you ever do that?!</Example>
|
|
|
|
</Panel>
|
|
|
|
<Panel title={"Da canonica a standard"}>
|
2020-03-10 20:59:40 +00:00
|
|
|
<p>
|
2020-05-23 05:38:07 +00:00
|
|
|
Convertiamo le disequazioni in equazioni aggiungendo una variabile slack.
|
2020-03-10 20:59:40 +00:00
|
|
|
</p>
|
|
|
|
<Example>
|
2020-05-23 05:38:07 +00:00
|
|
|
<Latex>{r`a \leq 3`}</Latex> diventa <Latex>{r`a + s_1 = 3`}</Latex>.
|
2020-03-10 20:59:40 +00:00
|
|
|
</Example>
|
|
|
|
</Panel>
|
2020-05-23 05:38:07 +00:00
|
|
|
<Panel title={"Da generale a canonica"}>
|
2020-03-10 20:59:40 +00:00
|
|
|
<p>
|
2020-05-23 05:38:07 +00:00
|
|
|
Sostituiamo le variabili potenzialmente negative (unconstrained) <Latex>{r`x_j`}</Latex> con due variabili <Latex>{r`x_j^+`}</Latex> e <Latex>{r`x_j^-`}</Latex>.
|
2020-03-11 11:37:34 +00:00
|
|
|
</p>
|
2020-03-11 18:12:30 +00:00
|
|
|
<Example>
|
2020-05-23 05:38:07 +00:00
|
|
|
<Latex>{r`a \in \mathbb{Z}`}</Latex> diventa <Latex>{r`a^+ \in \mathbb{N}`}</Latex> e <Latex>{r`-a^- \in \mathbb{N}`}</Latex>.
|
2020-03-11 18:12:30 +00:00
|
|
|
</Example>
|
2020-05-23 05:38:07 +00:00
|
|
|
</Panel>
|
|
|
|
</Split>
|
|
|
|
<Split title={"La forma standard"}>
|
|
|
|
<Panel title={"Funzione obiettivo"}>
|
2020-03-11 11:37:34 +00:00
|
|
|
<p>
|
2020-05-23 05:38:07 +00:00
|
|
|
La funzione da minimizzare/massimizzare, tipicamente indicata con una <Latex>{r`z`}</Latex> al termine noto.
|
2020-03-11 11:37:34 +00:00
|
|
|
</p>
|
2020-05-23 05:38:07 +00:00
|
|
|
</Panel>
|
|
|
|
<Panel title={"Tableu"}>
|
2020-03-11 11:37:34 +00:00
|
|
|
<p>
|
2020-05-23 05:38:07 +00:00
|
|
|
Un modo per rappresentare sistemi in forma standard, anche noto come <b>matrice equivalente completa</b> del sistema.
|
|
|
|
</p>
|
|
|
|
<Example>
|
2020-05-23 22:53:01 +00:00
|
|
|
Il sistema:<br/><br/>
|
|
|
|
<Latex>{r`
|
|
|
|
\begin{cases}
|
|
|
|
2000A + 1000B = z\\
|
|
|
|
1A \leq 3\\
|
|
|
|
1B \leq 3\\
|
|
|
|
2A + 2B \leq 7
|
|
|
|
\end{cases}
|
|
|
|
`}</Latex><br/><br/>
|
|
|
|
Diventa in forma di tableau:<br/><br/>
|
|
|
|
<table class={"right"}>
|
|
|
|
<thead>
|
|
|
|
<tr>
|
|
|
|
<th><abbr title={"Termine noto"}>TN</abbr></th>
|
|
|
|
<th><Latex>x_1</Latex></th>
|
|
|
|
<th><Latex>x_2</Latex></th>
|
|
|
|
<th><Latex>s_1</Latex></th>
|
|
|
|
<th><Latex>s_2</Latex></th>
|
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<tbody>
|
|
|
|
<tr>
|
|
|
|
<td><Latex>z</Latex></td>
|
|
|
|
<td><Latex>2000</Latex></td>
|
|
|
|
<td><Latex>1000</Latex></td>
|
|
|
|
<td><Latex>0</Latex></td>
|
|
|
|
<td><Latex>0</Latex></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><Latex>3</Latex></td>
|
|
|
|
<td><Latex>1</Latex></td>
|
|
|
|
<td><Latex>0</Latex></td>
|
|
|
|
<td><Latex>1</Latex></td>
|
|
|
|
<td><Latex>0</Latex></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><Latex>3</Latex></td>
|
|
|
|
<td><Latex>0</Latex></td>
|
|
|
|
<td><Latex>1</Latex></td>
|
|
|
|
<td><Latex>0</Latex></td>
|
|
|
|
<td><Latex>1</Latex></td>
|
|
|
|
</tr>
|
|
|
|
<tr>
|
|
|
|
<td><Latex>7</Latex></td>
|
|
|
|
<td><Latex>2</Latex></td>
|
|
|
|
<td><Latex>2</Latex></td>
|
|
|
|
<td><Latex>0</Latex></td>
|
|
|
|
<td><Latex>0</Latex></td>
|
|
|
|
</tr>
|
|
|
|
</tbody>
|
|
|
|
</table>
|
2020-03-11 18:12:30 +00:00
|
|
|
</Example>
|
2020-03-10 20:59:40 +00:00
|
|
|
</Panel>
|
2020-05-23 05:38:07 +00:00
|
|
|
<Panel title={"Variabili di base"}>
|
2020-03-30 17:09:31 +00:00
|
|
|
<p>
|
2020-05-23 22:53:01 +00:00
|
|
|
Variabili che hanno tutti 0 e un 1 nella loro colonna del tableu.
|
|
|
|
</p>
|
|
|
|
<p>
|
|
|
|
La loro controparte sono le <i>variabili fuori base</i>.
|
|
|
|
</p>
|
|
|
|
<p>
|
|
|
|
Un sistema lineare è risolto quando tutte le variabili originali (<Latex>x_n</Latex>) sono nella base.
|
2020-03-30 17:09:31 +00:00
|
|
|
</p>
|
|
|
|
</Panel>
|
2020-05-23 05:38:07 +00:00
|
|
|
</Split>
|
|
|
|
<Split title={"Simplex"}>
|
2020-05-23 22:53:01 +00:00
|
|
|
<Panel title={"Cos'è?"}>
|
2020-03-30 17:09:31 +00:00
|
|
|
<p>
|
2020-05-23 05:38:07 +00:00
|
|
|
Un algoritmo per massimizzare efficientemente variabili di sistemi lineari, derivato da Gauss-Jordan.
|
2020-03-30 17:09:31 +00:00
|
|
|
</p>
|
2020-05-23 05:38:07 +00:00
|
|
|
<Example>
|
|
|
|
E' spiegato semplicemente <a href={"https://web.archive.org/web/20200523052252/https://www.cs.cmu.edu/~15451-f17/handouts/simplex.pdf"}>qui</a>.
|
|
|
|
</Example>
|
|
|
|
</Panel>
|
|
|
|
<Panel title={"I passi"}>
|
2020-03-30 17:09:31 +00:00
|
|
|
<ol>
|
2020-05-23 05:38:07 +00:00
|
|
|
<li>Trasforma il sistema in <b>forma standard</b>.</li>
|
|
|
|
<li>Finchè ci sono variabili con coefficienti positivi nella funzione obiettivo:
|
|
|
|
<ol>
|
|
|
|
<li><b>Scegli</b> una variabile della funzione obiettivo, chiamandola <i>variabile entrante</i>. <Example>Come? Vedi nel prossimo pannello.</Example></li>
|
2020-05-23 22:53:01 +00:00
|
|
|
<li>Trova la variabile di base (detta <i>variabile uscente</i>) con il <b>valore minore</b> per il rapporto <Latex>{r`\frac{termine\ noto}{coeff.\ variabile\ entrante}`}</Latex></li>
|
2020-05-23 05:38:07 +00:00
|
|
|
<li><b>Riscrivi</b> tutte le funzioni del sistema in termini della variabile entrante.</li>
|
|
|
|
</ol>
|
|
|
|
</li>
|
|
|
|
<li>Il <b>termine noto</b> della funzione obiettivo è il tuo risultato.</li>
|
2020-03-30 17:09:31 +00:00
|
|
|
</ol>
|
|
|
|
</Panel>
|
2020-05-23 21:23:45 +00:00
|
|
|
<Panel title={"Sotto forma di tableau"}>
|
|
|
|
<p>
|
|
|
|
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.
|
|
|
|
</p>
|
|
|
|
</Panel>
|
2020-05-23 05:38:07 +00:00
|
|
|
<Panel title={"Criteri per la variabile entrante"}>
|
2020-03-30 22:37:46 +00:00
|
|
|
<ul>
|
2020-05-23 05:38:07 +00:00
|
|
|
<li>Coefficiente maggiore nella funzione obiettivo.</li>
|
|
|
|
<li>Incremento maggiore della funzione obiettivo.</li>
|
|
|
|
<li>A caso.</li>
|
2020-05-23 22:53:01 +00:00
|
|
|
<li><i>Regola di Bland</i>: scegli variabili entranti e uscenti con indice minore (ovvero, prendi le prime possibili). <Example>È usato nella teoria perchè impedisce i cicli infiniti!</Example></li>
|
2020-03-30 22:37:46 +00:00
|
|
|
</ul>
|
|
|
|
</Panel>
|
2020-05-23 22:53:01 +00:00
|
|
|
<Panel title={"Esempio"}>
|
|
|
|
<Example>
|
|
|
|
Ho risolto il problema 3 del file <a href={"https://dolly.fim.unimore.it/2019/mod/resource/view.php?id=2716"}><code>Ex_LP_testo</code></a> con il Simplex:
|
|
|
|
<p>
|
|
|
|
<Image src={"https://i.imgur.com/1r405Mb.jpg"}/>
|
|
|
|
</p>
|
|
|
|
</Example>
|
|
|
|
</Panel>
|
2020-03-30 22:37:46 +00:00
|
|
|
</Split>
|
2020-05-23 05:38:07 +00:00
|
|
|
<Split title={"Metodo delle due fasi"}>
|
|
|
|
<Panel title={"Metodo delle due fasi"}>
|
2020-03-30 22:37:46 +00:00
|
|
|
<p>
|
2020-05-23 05:38:07 +00:00
|
|
|
Un estensione del Simplex per permettere la risoluzione di problemi con termini noti negativi.
|
2020-03-30 22:37:46 +00:00
|
|
|
</p>
|
|
|
|
<p>
|
2020-05-23 05:38:07 +00:00
|
|
|
Prevede l'introduzione di un <b>problema ausiliario</b>.
|
2020-03-30 22:37:46 +00:00
|
|
|
</p>
|
|
|
|
</Panel>
|
|
|
|
</Split>
|
2020-03-09 23:18:13 +00:00
|
|
|
</div>
|
|
|
|
)
|
|
|
|
}
|
|
|
|
}
|