Skip to content

Commit 2d6652f

Browse files
theory finished
1 parent ae4ea24 commit 2d6652f

File tree

6 files changed

+262
-1
lines changed

6 files changed

+262
-1
lines changed

.vscode/settings.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"matroide",
2020
"Matroidi",
2121
"MCSTP",
22+
"memetici",
2223
"metaeuristica",
2324
"metaeuristici",
2425
"minimizzabile",

algo_euristici_notes.pdf

263 KB
Binary file not shown.

algo_euristici_notes.tex

Lines changed: 261 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7193,14 +7193,274 @@ \subsubsection{Tournament selection}
71937193
la quale include nella nuova popolazione il migliore individuo della corrente (mantieni
71947194
sempre il migliori individuo trovato finora).
71957195

7196+
\subsubsection{Crossover}
7197+
L'operatore di \textbf{crossover} combina $k\geq 2$ individui per generarne altri $k$.
7198+
I più comuni impostano $k=2$ e sono:
7199+
\begin{itemize}
7200+
\item \textit{simple crossover}:
7201+
\begin{itemize}
7202+
\item estrarre una posizione casuale con una probabilità uniforme.
7203+
\item dividere la codifica in due parti nella posizione estratta.
7204+
\item scambiare le parti finali delle codifiche dei due individui
7205+
\begin{figure}[H]
7206+
\centering
7207+
\includegraphics[scale=0.5]{images/crossover_1.png}
7208+
\end{figure}
7209+
\end{itemize}
7210+
\item \textit{double crossover}:
7211+
\begin{itemize}
7212+
\item estrarre una posizione casuale con una probabilità uniforme.
7213+
\item dividere la codifica in due parti nella posizione estratta.
7214+
\item scambiare le parti estreme delle codifiche dei due individui
7215+
\begin{figure}[H]
7216+
\centering
7217+
\includegraphics[scale=0.5]{images/crossover_2.png}
7218+
\end{figure}
7219+
\end{itemize}
7220+
\end{itemize}
7221+
Generalizzando si ottiene che:
7222+
\begin{itemize}
7223+
\item $\alpha$\textit{ points crossover}:
7224+
\begin{itemize}
7225+
\item si estraggono $\alpha$ posizioni casuali con una probabilità uniforme.
7226+
\item si divide la codifica in $\alpha +1$ parti alle posizioni estratte.
7227+
\item si scambiano le parti dispari delle codifiche dei due individui (prima, terza, $\dots$)
7228+
\end{itemize}
7229+
\end{itemize}
7230+
Per piccoli valori di $\alpha$, questo implica un \textit{bias posizionale}: simboli
7231+
chiusi nella codifica tendono a rimanere chiusi. Per cancellare questo bias, uno
7232+
può adottare:
7233+
\begin{itemize}
7234+
\item \textit{uniform crossover}:
7235+
\begin{itemize}
7236+
\item costruire un vettore casuale binario $m\in U(\mathbb{B}^n)$ ("maschera").
7237+
\item se $m_i=1$ scambia i simboli in posizione $i$ dei due individui,
7238+
se $m_i=0$ li mantiene invariati.
7239+
\begin{figure}[H]
7240+
\centering
7241+
\includegraphics[scale=0.5]{images/uniform_crossover.png}
7242+
\end{figure}
7243+
\end{itemize}
7244+
\end{itemize}
71967245

7246+
\paragraph{Crossover vs Scatter Search e Path Relinking}\mbox{}\\
7247+
L'operatore di crossover assomiglia alla fase di ricombinazione di SS e PR. Le
7248+
principali differenze sono:
7249+
\begin{enumerate}
7250+
\item ricombina i simboli delle codifiche, anziché:
7251+
\begin{itemize}
7252+
\item ricombinare le soluzioni (SS)
7253+
\item esegue una catena di scambi sulle soluzioni (PR)
7254+
\end{itemize}
7255+
\item opera sull'intera popolazione, anziché solo su un set di riferimento $R$
7256+
\item opera su coppie casuali di individui, anziché scansionare metodicamente tutte le
7257+
coppie di soluzioni di $R$
7258+
\item genera una coppia di nuovi individui, anziché
7259+
\begin{itemize}
7260+
\item generare una singola soluzione intermedia (SS)
7261+
\item visitando le soluzioni intermedie e scegliendone una (PR)
7262+
\end{itemize}
7263+
\item i nuovi individui entrano nella popolazione, invece di diventare candidati per
7264+
l'insieme di riferimento.
7265+
\end{enumerate}
7266+
\subsubsection{Mutation}
7267+
L'operatore \textit{mutation} modifica un individuo per generarne uno simile.
7268+
\begin{itemize}
7269+
\item scansiona e codifica $\xi$ un simbolo alla volta
7270+
\item decide con una probabilità $\pi_m$ di modificare il simbolo corrente.
7271+
\end{itemize}
7272+
Il tipo di modifica solitamente dipende dalla codifica:
7273+
\begin{itemize}
7274+
\item \textbf{codifiche binarie} (\textit{binary encodings}): ribaltano $\xi_i$ in $\xi_i':=1-\xi_1$
7275+
\item \textbf{stringhe simboliche} (\textit{symbol strings}): sostituiscono
7276+
$\xi_c$ con un simbolo casuale $\xi'_c\in B_c\setminus\{\xi_c\}$ selezionato con
7277+
una probabilità uniforme.
7278+
\item \textbf{permutazioni}: sono presenti molte proposte.
7279+
\begin{itemize}
7280+
\item scambio di due elementi casuali nella permutazione (\textit{swap})
7281+
\item inversione dell'allungamento tra due posizioni casuali della permutazione
7282+
\item $\dots$
7283+
\end{itemize}
7284+
\end{itemize}
7285+
\paragraph{Mutation vs euristiche di scambio}\mbox{}\\
7286+
L'operatore \textit{mutation} ha delle forti relazioni con le operazioni di scambio. Le
7287+
principali differenze sono che:
7288+
\begin{enumerate}
7289+
\item modifica i simboli di una codifica, anziché scambiando gli elementi di una
7290+
soluzione.
7291+
\item opera su simboli casuali, anziché esplorare un vicinato sistematicamente.
7292+
\item opera su un numero casuale di simboli, anziché scambiando un numero fisso
7293+
di elementi.
7294+
\end{enumerate}
71977295

7296+
\subsubsection{Il problema di fattibilità}
7297+
Se la codifica non è completamente invertibile, crossover e mutation talvolta possono generare
7298+
codifiche che non corrispondono a soluzioni fattibili.
7299+
Noi distinguiamo tra:
7300+
\begin{itemize}
7301+
\item \textit{codifiche fattibili} (\textit{feasible encodings}) che corrispondono a soluzioni fattibili.
7302+
\item \textit{codifiche infattibili} (\textit{unfeasible encodings}) che corrispondono
7303+
a leciti (legal), ma infattibili sottoinsiemi.
7304+
\end{itemize}
7305+
L'esistenza di codifiche infattibili implica molteplici svantaggi:
7306+
\begin{itemize}
7307+
\item \textbf{inefficienza}: tempo computazionale perso nella gestione di oggetti inutili.
7308+
\item \textbf{inefficacia}: l'euristica esplora meno soluzioni (possibilmente, nessuna).
7309+
\item \textbf{problemi di progettazione}: la fitness deve essere definita su sottoinsiemi infattibili.
7310+
\end{itemize}
7311+
Qui sono presenti tre approcci principali per affrontare questo problema:
7312+
\begin{enumerate}
7313+
\item codifiche speciali e operatori (evitare o limitare la non fattibilità).
7314+
\item procedure di riparazione (rendere la non fattibilità fattibile).
7315+
\item funzioni di penalità (accettare la non fattibilità, ma scoraggiarla).
7316+
\end{enumerate}
71987317

7318+
\subsubsection{Codifiche speciali e operatori}
7319+
L'idea consiste nell'investigare:
7320+
\begin{itemize}
7321+
\item codifiche che (quasi) sempre restituiscono soluzioni fattibili, come:
7322+
\begin{itemize}
7323+
\item codifiche di permutazione (permutation1 encodings) e decodifiche
7324+
order-first split-second, per problemi di partizione (CMSTP, VRP, $\dots$).
7325+
\item codifiche di permutazione e euristica costruttiva per la decodifica,
7326+
di problemi di scheduling (PSMP, $\dots$)
7327+
\end{itemize}
7328+
\item operatori crossover e mutation che mantengono la fattibilità, come:
7329+
\begin{itemize}
7330+
\item operatori che simulano $k$-scambi per il TSP
7331+
\end{itemize}
7332+
\end{itemize}
7333+
Questi metodi:
7334+
\begin{itemize}
7335+
\item tendono ad approssimare da vicino l'euristica dello scambio e della
7336+
ricombinazione basata sul concetto di vicinato.
7337+
\item abbandonare l'idea di astrazione e concentrarsi sul problema specifico,
7338+
contrariamente agli algoritmi genetici classici.
7339+
\end{itemize}
71997340

7341+
\subsubsection{Procedure di riparazione}
7342+
Una procedura di riparazione $x_R(\xi)$
7343+
\begin{itemize}
7344+
\item riceve una codifica $\xi$ che restituisce un sottoinsieme non fattibile
7345+
$x(\xi)\notin X$
7346+
\item restituisce una soluzione fattibile $x_R\in X$
7347+
\end{itemize}
7348+
Questa procedure è applicata ad ogni codifica non fattibile $\xi\in\Xi^{(g)}$
7349+
\begin{itemize}
7350+
\item in alcuni metodi la codifica $\xi(x_R(x(\xi)))$ sostituisce $\xi$ in $X^{(g)}$
7351+
\item in altre $\xi$ rimane in $\Xi^{(g)}$ e $x_R(\xi)$ è utilizzata solo per aggiornare $x^*$
7352+
\end{itemize}
7353+
La prima famiglia di metodi: mantiene una popolazione di soluzioni fattibili. Ma
7354+
introducono:
7355+
\begin{itemize}
7356+
\item un forte bias in favore di codifiche fattibili
7357+
\item un bias in favore delle soluzioni fattibili più facilmente ottenibili
7358+
con la procedura di riparazione.
7359+
\end{itemize}
7360+
\subsubsection{Funzioni di penalità}
7361+
\paragraph{Misurando la non fattibilità}\mbox{}\\
7362+
Se la funzione obiettivo è estesa ai sottoinsiemi non fattibili $x\in 2^B\setminus X$,
7363+
la funzione fitness $\phi(\xi)$ può essere estesa ad una qualsiasi codifica, ma
7364+
molti sottoinsiemi non fattibili hanno una fitness più grande della soluzione ottimale.
7365+
L'operatore \textit{selection} tende a favorire certi sottoinsiemi infattibili. Per
7366+
evitare questo, la funzione di fitness deve combinare:
7367+
\begin{itemize}
7368+
\item la funzione obiettivo $f(x(\xi))$
7369+
\item una misura di non fattibilità $\psi(x(\xi))$
7370+
\[
7371+
\begin{cases}
7372+
\psi(x(\xi))=0 & \text{se }x(\xi)\in X\\
7373+
\psi(x(\xi))>0 & \text{se }x(\xi)\notin X
7374+
\end{cases}
7375+
\]
7376+
\end{itemize}
7377+
Se i vincoli del problema sono espressi da uguaglianze o disuguaglianze, $\psi(x)$ può
7378+
essere definito come la somma pesata delle violazioni.
7379+
\textit{Come definire i pesi?}\textit{Sono fissi, variabili o adattivi?}
7380+
\paragraph{Definizione della fitness}\mbox{}\\
7381+
Le combinazioni più tipiche sono:
7382+
\begin{itemize}
7383+
\item \textbf{penalità assoluta}: date due codifiche $\xi$ e $\xi'$
7384+
\begin{itemize}
7385+
\item se entrambe sono fattibili, quella con la $f$ più piccola è migliore.
7386+
\item se esattamente una è fattibile, quella fattibile è migliore dell'altra.
7387+
\item se entrambe non sono fattibili, quella con il $\psi$ più piccolo è migliore
7388+
(\textit{adatta per "rank selection" e "tournament selection"}).
7389+
\end{itemize}
72007390

7391+
\item \textbf{penalità proporzionale}: le codifiche infattibili hanno una penalità
7392+
che è crescente con la violazione.
7393+
$$\varphi(\xi)=f(x(\xi))-\alpha\psi(x(\xi))+M\;\;\text{per i problemi di massimizzazione}$$
7394+
$$\varphi(\xi)=-f(x(\xi))-\alpha\psi(x(\xi))+M\;\;\text{per i problemi di minimizzazione}$$
7395+
dove l'offset $M$ garantisce che $\varphi(\xi)\geq 0 $ per tutte le codifiche.
7396+
\item \textbf{penalità ottenuta da riparazione}:
7397+
cioè mantenere la codifica non fattibile, ma derivarne la fitness
7398+
dal valore obiettivo della soluzione riparata
7399+
$$\varphi(\xi)=f(x_R(\xi))\text{ o }\varphi(\xi)=UB-f(x_R(\xi))$$
7400+
visto che solitamente $f(x_R(x(\xi)))\geq f(x(\xi))$
7401+
\end{itemize}
72017402

7403+
\paragraph{Regolazione del peso}\mbox{}\\
7404+
Sperimentalmente, è meglio utilizzare la più piccola penalità effettiva:
7405+
\begin{itemize}
7406+
\item se la penalità è troppo piccola, troppo poche soluzioni possibile sono trovate.
7407+
\item se la penalità è troppo grande, la ricerca è confinata in una parte della
7408+
regione fattibile.
7409+
\end{itemize}
7410+
Un buon valore del parametro $\alpha$ può essere trovato regolando:
7411+
\begin{itemize}
7412+
\item \textbf{metodi dinamici}: incrementando $\alpha$ lungo il tempo
7413+
(\textit{prima si raggiungono buoni sottoinsieme, dopo si rafforza
7414+
la fattibilità}).
7415+
\item \textbf{metodi adattivi}: aggiornare $\alpha$ in base alla situazione
7416+
\begin{itemize}
7417+
\item incrementa $\alpha$ quando codifiche non fattibili dominano la popolazione.
7418+
\item decrementa $\alpha$ quando codifiche fattibili dominano
7419+
\end{itemize}
7420+
\item \textbf{metodi evolutivi}: codifica $\alpha$ in ogni individuo, in modo
7421+
da selezionare e rifinire entrambe le soluzione ed il parametro dell'algoritmo.
7422+
\end{itemize}
72027423

7424+
\subsubsection{Algoritmi memetici}
7425+
Algoritmi memetici (Moscato, 1989) sono ispirati dal concetto di "meme" (Dawkins, 1989)
7426+
il quale è l'unità di base di informazione culturale riproducibile.
7427+
\begin{itemize}
7428+
\item i geni sono selezionati solo al livello di espressione fenotipica.
7429+
\item i meme si adattano direttamente, come nell'evoluzione larmarckiana.
7430+
\end{itemize}
7431+
Fuori dalla metafora, gli algoritmi memetici si combinano:
7432+
\begin{itemize}
7433+
\item operatori \textit{"genotipici"} che manipolano le codifiche (crossover e mutation).
7434+
\item operatori \textit{"fenotipici"} cje manipolano le soluzioni (ricerca locale).
7435+
\end{itemize}
7436+
In breve, le soluzioni si migliorano con gli scambi prima della ricodifica. Diversi
7437+
parametri determinano come applicare la ricerca locale:
7438+
\begin{itemize}
7439+
\item quanto spesso (ad ogni generazione, or dopo una sufficiente diversificazione)
7440+
\item a quali individui (tutti, i migliori, i più diversificati)
7441+
\item per quanto tempo (fino ad un ottimo locale, oltre, or fermandosi prima)
7442+
\item con quale metodo (steepest descnt, VNS, ILS, $\dots$)
7443+
\end{itemize}
72037444

7204-
7445+
\subsubsection{Strategie evolutive}
7446+
Sono state proposte da Rachenberg e Schwefel (1971). Le principali differenze
7447+
rispetto alla genetica classica sono:
7448+
\begin{itemize}
7449+
\item le soluzioni sono codificate in vettori reali
7450+
\item una piccola popolazione di $\mu$ individui generano $\lambda$ candidati
7451+
discendenti (originalmente, $\mu=1$).
7452+
\item i nuovi individui competono per costruire la nuova popolazione
7453+
\begin{itemize}
7454+
\item nella strategia $(\mu,\lambda)$ i migliori $\mu$ discendenti
7455+
sostituiscono la popolazione originale, anche se alcuni sono dominati
7456+
\item nella strategia $(\mu+\lambda)$ i migliori $\mu$ individui
7457+
complessivamente (predecessori o discendenti) sopravvivono nella nuova
7458+
popolazione
7459+
\end{itemize}
7460+
\item l'operatore \textit{mutation} somma alle codifiche un rumore casuale
7461+
con una distribuzione normale di media zero
7462+
$$\xi':=\xi+\delta\text{ con }\delta\in N(0,\delta)$$
7463+
\item originalmente l'operatore di \textit{crossover} non era utilizzato (ora lo è)
7464+
\end{itemize}
72057465

72067466
\end{document}

images/crossover_1.png

45.3 KB
Loading

images/crossover_2.png

81.7 KB
Loading

images/uniform_crossover.png

127 KB
Loading

0 commit comments

Comments
 (0)