Top Banner
EA: UN CASO PRATICO DI APPLICAZIONE Il problema delle N-Regine Autore: Valerio Colamatteo Sommario: Sulla base di tematiche esclusivamente proprie dell'Intelligenza Artificiale, l’elaborato propone un’applicazione pratica degli algoritmi evolutivi per la risoluzione del rompicapo delle N- Regine. Focus operativo dell’elaborato sarà la modifica dei parametri algoritmici di rilievo e la conseguente disamina dei risultati ottenuti. Note di Intelligenza Artificiale
49

EA: UN CASO PRATICO DI APPLICAZIONE

Jul 21, 2022

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: EA: UN CASO PRATICO DI APPLICAZIONE

EA: UN CASO PRATICO DI

APPLICAZIONE Il problema delle N-Regine

Autore:

Valerio Colamatteo

Sommario:

Sulla base di tematiche esclusivamente proprie dell'Intelligenza Artificiale, l’elaborato propone un’applicazione pratica degli algoritmi evolutivi per la risoluzione del rompicapo delle N-Regine. Focus operativo dell’elaborato sarà la modifica dei parametri algoritmici di rilievo e la conseguente disamina dei risultati ottenuti.

Note di Intelligenza Artificiale

Page 2: EA: UN CASO PRATICO DI APPLICAZIONE
Page 3: EA: UN CASO PRATICO DI APPLICAZIONE

Descrizione del problema Il problema delle N-Regine costituisce un rompicapo classico della letteratura matematica

mondiale. Proposto per la prima volta nel lontano 1848 da Max Bezzel, giocatore di scacchi

professionista dell’epoca, ha suscitato negli anni l’interesse fervido di molte menti

matematiche illustri, primo fa tutti Carl Friedrich Gauss1, che riuscì a trovare 72 delle 92

soluzioni complessive2.

L’obiettivo del rompicapo è il corretto collocamento di N-regine su di una scacchiera di

dimensioni NxN in modo che esse non si catturino a vicenda. Il numero di soluzioni elevato

espresso dalla tabella seguente è conseguenza dell’elevato grado di dipendenza tra le stesse3.

N 1 2 3 4 5 6 7 8 9 10 11 12 13 14 …

Ind: 1 0 0 1 2 1 6 12 46 92 341 1787 9233 45752 …

Totali: 1 0 0 2 10 4 40 92 352 724 2680 14200 73712 365596 …

1 Le prime soluzioni al problema risalgono già al 1850 ad opera del matematico Franz Nauck. Fu Nauck poi ad estendere il problema alla sua forma generalizzata. Nel 1874, S. Günther propose un metodo per trovare le soluzione del problema utilizzando i determinanti, metodo che venne perfezionato poi da J.W.L. Glaisher. (Fonte: Wikipedia) 2 Per una scacchiera classica 8x8 3 In particolare per il caso N=8, oggetto unico di approfondimento in questo lavoro, le soluzioni indipendenti risultano essere solo 12, a fronte delle 92 totali, ottenibili dalle stesse ottenute attraverso opportune operazioni di rotazione e riflessione matriciale. Nessun ulteriore riferimento alla questione verrà ripreso nelle pagine a seguire.

Page 4: EA: UN CASO PRATICO DI APPLICAZIONE

EA: ASPETTI PRELIMINARI

Gli aspetti preliminari del problema attengono principalmente:

- 1) La corretta codifica genotipica degli individui

- 2) La definizione di una funzione di fitness adeguata ai proposti realizzativi

dell’azione algoritmica.

Nell’ambito del problema in analisi ogni individuo viene rappresentato, dal punto di vista

fenotipico, come una diposizione pseudocasuale di N-regine sulla scacchiera. Il relativo

corredo genotipico è invece affidato a singole permutazioni nell’insieme di valori interi

1, … , e apparirà dunque rappresentato da un vettore riga di lunghezza N del tipo:

1 2 3 4 5 6 7 8

2 4 5 7 3 6 1 8

Gli indici dell’array rappresentano il numero di riga della scacchiera, il valore nella relativa

cella il numero di posizionamento in colonna della regina.

Il ricorso allo strumento permutativo per la disposizione genotipica del singolo individuo

ha, invero, natura strategica per la struttura risolutiva del problema. Esso infatti permette di

assicurare già in fase di inizializzazione dell’algoritmo l’assenza di disposizioni erronee

sulle righe della scacchiera. Ciò ha l’indubbio merito di agevolare l’ideazione pratica di

una funzione di valutazione delle validità individuali, permettendo alla stessa di dedicarsi

al monitorig delle sole celle diagonali della scacchiera.

La funzione di fitness utilizzata dunque è la seguente (in pseudocodice):

Fitness(individual){ value=0; n=length(individual);

Page 5: EA: UN CASO PRATICO DI APPLICAZIONE

for i=1:n for j=1:n if abs(i-j)==abs(individual (i)- individual (j)) && i!=j value=value+1; end end end value = value /2; value =(n*(n-1)/2)- value; //(n*(n-1)/2) è il numero max possibile // di regine presenti // sulle diaginali che si mangiano tra di loro }

La funzione Fitness prende in input il genotipo di uno specifico individuo (individual)

restituendo in uscita una sua valutazione in termini di numero di regine che NON sono

sotto attacco per tal configurazione4.

Affinché due regine siano in posizione di attacco, ossia si trovino lungo una stessa diagonale

di una sottomatrice quadrata di NxN, deve verificarsi che la distanza in termini di numero di

righe tra le due regine sia pari a quella in termini di numero di colonne. Tali differenze

vengono misurate attraverso i due cicli for innestati permettono di scorrere la matrice della

scacchiera per ogni riga e colonna o, del tutto equivalentemente, l’array individual5. Ad ogni

passo si verifica che la distanza (assoluta) tra le regine posizionate nelle righe e sia

pari a quella tra le rispettive colonne e , 1… , 1… , ! .

In termini più rigorosi, date 2 regine qualsiasi, si verifica che la proiezione verticale della 1°

regina sul vertice adiacente della 2° sia uguale alla proiezione orizzontale della prima regina

sul suo stesso vertice adiacente adiacente (cioè adiacente la 1° regina).

4 Il problema è stato impostato come di massimizzazione della funzione obiettivo (Fitness) e non di minimizzazione. A ragion di ciò la funzione restituisce non il numero di regine sotto attacco per la configurazione in esame ma il residuo (assoluto) tra quest’ultimo fattore numerico e la quantità massima di regine attaccabili tra di loro in una scacchiera NxN (sempre pari alla soma dei numeri da 1 a N-1, ossia alla

progressione aritmetica ∗

) 5 Quest’ultimo, infatti, pur essendo rappresentativo esclusivamente delle coordinate (in termini di indici di riga e colonna) delle posizioni delle N regine su una scacchiera NxN, può essere inteso, senza alcuna perdita di generalità, come una rappresentazione esaustiva dell’intera scacchiera. Ciò in quanto la conoscenza delle posizioni delle regine (codificata dal vettore individual) appare fornire indirettamente tutti gli elementi di rilievo per una ricostruzione logica completa dell’intera matrice degli scacchi.

Page 6: EA: UN CASO PRATICO DI APPLICAZIONE

Ad es. nell’array esemplificativo prima illustrato:

1 2 3 4 5 6 7 8

2 4 5 7 3 6 1 8

Corrispondente alla seguente rappresentazione fenotipica6:

La funzione Fitness restituirebbe valore f=23, il, che indicherebbe la presenza di 5 regine

sotto tiro. Le stesse, facilmente individuabili previa analisi descrittiva della figura

sovrastante, seguendo la logica operativa della funzione utilizzata possono essere

agevolmente rintracciate nei valori dell’array:

2 3 4 5

6 … 8

6 … 8

3 … 7 3 … 5

5 … 3

6 Immagine ottenuta con software applicativo Matlab 7.10.0 (R2010a)

5 … 1

Page 7: EA: UN CASO PRATICO DI APPLICAZIONE

5 … 7 3 … 1

Una soluzione alternativa potrebbe essere la seguente:

Fitness_Version2(individual){ N=length(individual); A[n][n]={0}; for i = n A(i,individual(i)) = 1; end f = 0; // valore di fitness iniziale // Creo una matrice di zeri con degli 1 nelle sole posizioni in cui ci sono le regine Num =(n-2)*2+1 ->>> Numero colonne utili nella scacchiera for i = -(n-2):(:n-2) // == for i= -6:6 // In una scacchiera 8x8 ci sono 13 diagonali di almeno due caselle, // poiché in generale: // basta escludere le due caselle terminali in alto a dx e in basso a sx // ed escludere la diagonale principale, quindi: // 6 = (8 - 2) *2 +1) // tot diag = q last pos diag principale // quindi sono 6 diagonali a dx e 6 a sx della diagonale principale + // la diagonale principale ovviamente... x=My_diag(A,i); // Se c’è più di una regina (x>1) su questa diagonale, incrementa //proporzionalmente la funzione di costo // se sono 2 allora c’è solo una regina posizionata male, se sono più di // due invece le regine errate sono x*(x-1)/2 (cioè sempre la somma dei // primi x-1 numeri) if x == 2 f = f + (x-1); end if x>2 f = f + (x*(x-1))/2; end end // Ripete tutto per le diagonali inverse

Page 8: EA: UN CASO PRATICO DI APPLICAZIONE

for i = -(n-2):(:n-2) // == for i= -6:6 x=My_inv_diag(A,i); // Calcola il totale parziale di f if x == 2 f = f + (x-1); end if x>2 f = f + (x*(x-1))/2; end end } My_diag(A,p){ B[1][size(A,1)]={0}; if p>=0 for i=1:(8-p) B(i)=[A(i,i+p)]; end x = sum(B); end return x; if p<0 p=abs(p); for i=1:(8-p) B(i)=[A(i+p,i)]; end x = sum(B); end return x; } My_inv_diag(A,p){ B[size(A,1)][1]={0};

Page 9: EA: UN CASO PRATICO DI APPLICAZIONE

if p>=0 for i=0:(7-p) B(i+1,1)=[A(i+1,8-i-p)]; end x = sum(B); end return x; if p<0 p=abs(p); for i=0:(7-p) B(i+1,1)=[A(i+1+abs(p),(8-i))]; end x = sum(B); end return x; }

La funzione appena descritta altro non fa che ispezionare tutte le diagonali della matrice e

trovare quelle sulle quali sono disposte più di una sola regina.

Il calcolo delle diagonali che si effettua tiene conto sia delle diagonali principali (ossia

tutte le diagonali da sinistra verso destra) che di quelle inverse (ossia tutte quelle da sinistra

verso sinistra) per un totale di 26 su una classica scacchiera 8x8. Convenzionalmente, poi,

le diverse diagonali vengono etichettate con indici positivi e negativi nell’ordine numerico

seguente:

> 0 > 0 0 1 2 . . . 6 6 . . . 2 1 0

0 0 - 1 - 1 - 2 - 2 . . < 0 . . < 0

. .

- 6 - 6

Page 10: EA: UN CASO PRATICO DI APPLICAZIONE

Con quest’ultima immagine può ritenersi esaurita la trattazione degli aspetti preliminari del

problema. Ora si passa alla descrizione dei parametri algoritmici in gioco.

Page 11: EA: UN CASO PRATICO DI APPLICAZIONE

EA: L’ANALISI DEI PARAMETRI I vari esperimenti condotti sono stati effettuati attraverso l’algoritmo genetico basato su tali

caratteristiche tecniche:

Dimensione scacchiera (NxN) 8x8 (non variabile)

Rappresentazione individui Permutazione di interi 1,… ,Dimensione popolazione (P) Variabile

Numero generazioni (gen) Variabile

Tipologia Crossover Singolo cut-point,

probabilità di applicazione (pc): variabile

Tipologia Mutazione Swap di due posizioni scelte random

probabilità di applicazione (pm): variabile

Selezione genitori Migliori 2 su 5 scelti casualmente (B2O5)7

(non variabile)Survival selection Sostituzione individuo peggiore8

# di run ind. per ogni esperimento 20

Condizione di terminazione Raggiungimento # di fitness-evaluations

Definiti i parametri, per ogni esperimento (effettuato eseguendo 20 run consecutivi) viene

calcolata la fitness media e il tasso di scostamento medio9 di quest’ultima dal regime ottimo

di riferimento,28, calcolato in ogni generazione.

Vengono prodotti i seguenti risultati descrittivi:

- Andamento grafico della fitness per ogni generazione, e dell’individuo best in ogni

generazione sulla stessa scala di valori;

7 Maggiori dettagli in seguito. Sono stai fatti dei run appositi per testare l’applicazione della tecnica alternativa Roulette Wheel. 8 Maggiori dettagli in seguito. 9 Quest’ultimo è da intendersi come il movimento convergente/divergente della fitness verso l’ottimo distributivo. In virtù di ciò essa assume un andamento esattamente speculare a quello della fitness. Nel seguito, nonché sui prospetti grafici presentati a breve, essa assumerà la nomenclatura, concettualmente più espressiva, di errore-medio distributivo. È stato calcolato come il rapporto tra ma media generazionale limite (28.00) e quella effettivamente ottenuta, il tutto detratto di un fattore -1 per esprimere il tasso di superiorità percentuale dell’ottimo sulla fitness corrente.

Page 12: EA: UN CASO PRATICO DI APPLICAZIONE

- Andamento grafico dell’errore per ogni generazione;

- Rappresentazione delle soluzioni uniche trovate;

- Diagramma completo individuo-fitness dell’ultima popolazione;

- Eventuali andamenti grafici comparati per diversi settaggi dei parametri.

Ora un approfondimento in merito alla diagrammazione della fitness media e dell’errore

medio.

La logica imperativa con cui sono state svolti questi esperimenti ha ritenuto di dover

“facilitare” il compito dell’algoritmo prevedendo una clausola specifica per la fase di

Survival Selection. La stessa dovrebbe prevedere infatti la sostituzione dell’intera progenie

generata a seguito dell’applicazione degli operatori genetici (crossover e mutazione). Nel

caso di specie però si è ritenuto, alla luce delle prime analisi svolte, di far sì che tale

sostituzione sia effettivamente effettuata solo in presenza di individui migliori rispetto a

quelli selezionati per la sostituzione (worst individuals). Ciò permette all’algoritmo una

convergenza assoluta verso l’ottimo, evitando inutili fasi di continua esplorazione una

individuata una soluzione best. Quanto detto è mostrato nelle immagini di comparata che

seguono.

Page 13: EA: UN CASO PRATICO DI APPLICAZIONE
Page 14: EA: UN CASO PRATICO DI APPLICAZIONE
Page 15: EA: UN CASO PRATICO DI APPLICAZIONE

I parametri critici del problema: selezione e sostituzione degli individui Si intende ora trovare una validazione all’impianto strutturale utilizzato nell’algoritmo

attraverso proponendo l’applicazione della Roulette-wheel selection (RWS), come

alternativa di selezione degli individui ed applicandola a P/2 coppie di individui per ogni

generazione, unitamente ad una survival selection di tipo tradizionale10. Ecco i risultati:

N=8_P=30_gen=600___pc=1_pm=0.311

Andamento Errore medio

Andamento fitness media‐valore max 

10 Si adotta la regola classica per la quale vengono sostituiti direttamente i genitori della prole e non il worst. 11 Il riferimento è alla directory allegata a questo progetto, da cui sono tratte le immagini. Come al solito, N indica la grandezza della scacchiera, P la dimensione della popolazione, gen il numero di generazioni, pm e pc, rispettivamente, probabilità di mutazione e crossover. Graph_1 invece indica il singolo run a quale si riferisce, il primo in questo caso.

Page 16: EA: UN CASO PRATICO DI APPLICAZIONE

Dettaglio fitness ultima pop.           

      Numero di soluzioni trovate

I valori medi complessivi invece, registrati nell’arco di 20 run indipendenti sono i seguenti:

Comparata fitness‐valore max                       (valori medi) 

Page 17: EA: UN CASO PRATICO DI APPLICAZIONE

Errore medio complessivo

 

Come mostra la legenda nell’immagine iniziale nessuna popolazione, su un totale di 12000

600 ∙ 20 , ha raggiunto la stabilità asintotica limite di 28.

Le ragioni possono essere molteplici, principalmente:

- L’estrema vicinanza di quasi tutte le soluzioni della popolazione iniziale.

Il gioco delle N-Regine costituisce una eccezione nel panorama applicativo degli

algoritmi di ricerca locale, contraddistinguendosi per una landscape piuttosto uniforme dal

punto di vista altimetrico, ossia dalle asperità tutte molto simili tra di loro, senza quindi

grandi picchi o valli profondissime. Ciò in quanto tutte le soluzioni, a partire dalle quelle

iniziali generate casualmente, si trovano già relativamente vicine all’obiettivo. Il fatto di aver

considerato come soluzioni delle permutazioni rende ancora più evidente tale aspetto.

Nei numerosi run di prova che hanno portato alla redazione di questo lavoro non si è mai

ravvisata la presenza di valori estremamente bassi. Nonostante in teoria i valori assumibili

vadano da 0 a 28, in realtà le configurazioni più basse come livello di fitness sono meno

probabili da ottenere perché rappresentative di disposizioni pressoché uniche dal punto di

vista fenotipico12. Valori medi per popolazione inferiore a 23.00 si sono registrati molto

12 Basti pensare ai casi estremi. Una soluzione con valore di fitness si verifica solo quando tutte le regine sono disposte perfettamente in diagonale e sono soltanto due quindi (ossia quante sono le diagonali principali, in una matrice). Le soluzioni ottime invece sono molto più di due come detto in fase introduttiva (Tabella riepilogativa delle soluzioni presente a pagina 3). In generale, poi tutte le soluzioni con valori di fitness molto bassa (ad es. inferiore a 10), hanno necessariamente più di 2 regine sulla stessa diagonale principale.

Page 18: EA: UN CASO PRATICO DI APPLICAZIONE

raramente e comunque, che si ricordi, mai inferiori a 20, dunque relativamente vicini al

massimo assoluto.

Effettuando, a convalida di quanto detto, dei test sperimentali appositi, si sono riscontrati i

seguenti valori medi di fitness per numero di generazioni e dimensione della popolazione:

P\Gen 30 100 300 1000

100 23.0143 23.0018 23.0169 22.9955

1000 23.0107 23.0025 22.9998 22.9952

Ciò detto, lo spazio delle soluzioni è comunque estremamente vasto, assolutamente

impraticabile per una ricerca esaustiva13. Più nel dettaglio basti pensare che le N regine

potrebbero potenzialmente essere disposte in un numero di differenti combinazioni pari

a 14.

Ad ogni modo quanto detto si traduce, quindi, nel caso di applicazione della RWS, in una

moderata probabilità di selezionare individui che non siano i migliori, palesando una

insufficiente pressione selettiva.

- Il meccanismo adottato di sostituzione della progenie nella popolazione iniziale.

Nelle fasi più avanzate dell’algoritmo, se anche venisse generato un individuo best,

questo come da ipotesi della RWS, andrebbe a sostituire necessariamente uno dei due

individui che l’ha generato, il quale, molto probabilmente, nelle fasi conclusive, sarà

anch’egli già un individuo best. Per cui, ciò che si verifica, è che tipicamente nelle

generazioni conclusive si perviene ad una situazione in cui la popolazione è costituita da

tutti individui best (repliche) e solo 1 o 2 soltanto con una fitness appena inferiore,

13 Si è già evidenziato, nella pagina iniziale di questo lavoro, come il numero di soluzioni cresca in maniera molto rapida rispetto alla dimensione della scacchiera (N). Ciò, inevitabilmente, all’aumentare di N rende il problema ben presto inadeguato ad una ricerca sistematica/esaustiva. 14 Il numero risulta ridotto in virtù dell’aver considerato l’ipotesi di poter posizionare solo una regina su ogni riga (altrimenti sarebbe ! ). Per N=8 il numero di soluzioni da ispezionare, numericamente ancora trattabile, è di 16777216.

Page 19: EA: UN CASO PRATICO DI APPLICAZIONE

cosicché questi ultimi, rappresentando degli outlier per la popolazione corrente non

verranno più selezionati dalla RWS la quale provvederà a generare invece sempre nuovi

elementi che al più potranno avere fitness pari a quella dei genitori ma che non andranno

a sostituire gli individui con fitness peggiore (ma piuttosto i loro diretti genitori).

Tutto ciò viene effettuato tenendo comunque ferma l’ipotesi fatta in precedenza circa

l’inclusione della condizione di sostituzione degli individui (post-applicazione degli

operatori genetici) che prevede l’aggiornamento della popolazione iniziale solo previa

superiorità in termini di fitness della progenie sviluppatasi nella generazione in corso.

Non attuando quest’ultima clausola la situazione degenera, rendendo di fatto

randomizzato l’algoritmo. Lo dimostrano le immagini seguenti:

N=8_P=30_gen=600___pc=1_pm=0.3\Graph_1

  Andamento fitness media‐valore max 

   

Andamento Errore medio     

Page 20: EA: UN CASO PRATICO DI APPLICAZIONE

Dettaglio fitness ultima pop.

     I valori medi complessivi invece, registrati nell’arco dei soliti 20 run indipendenti sono i seguenti:

Comparata fitness‐valore max  

(valori medi)     

     

     Error medio complessivo    

   

  

Si mostra ora, invece, cosa accade se si fondono i due approcci sin qui tentati, ossia

la RWS e il B2R5.

Page 21: EA: UN CASO PRATICO DI APPLICAZIONE

Ciò che si è fatto è dunque applicare la roulette wheel precedentemente descritta

variando la sola fase di sostituzione degli individui. In particolare ora a venire sostituiti non

sono le coppie di genitori della prole ma, a seguito di un meccanismo di sorting dell’intera

popolazione, gli individui worst della generazione precedente. In tal modo l’algoritmo

converge in maniera incredibilmente veloce verso la stabilità, come mostrato nelle immagini

a seguire.

N=8_P=30_gen=600___pc=1_pm=0.3\GRAPH\Graph_7

 

 

 - In alto a dx un dettaglio 

dell’ultima popolazione;   

- in alto l’andamento medio della fitness e del valore di max sul singolo run; 

 

   -       In alto l’errore medio                          sul singolo run;  

-       A dx le soluzion uniche           trovate

Page 22: EA: UN CASO PRATICO DI APPLICAZIONE

I risultati medi complessivi, effettuati valutando i dati di 20 run, non tradiscono ole attese e

le impressioni percepibili dall’analisi di una singola esecuzione.

Il grafico mostra in legenda ben 5340 popolazioni con media massima, 

pari all’89% esatto

Situazione speculare, come sempre, per l’errore medio complessivo 

Pur evidenziando rendimenti massimali, la soluzione in questione non è stata

adoperata per le analisi sperimentali condotte in questo lavoro in quanto comportevole di un

aggravio computazionale complessivo non trascurabile, capace di aumentare notevolmente

i tempi di esecuzione medi.

Tutto ciò sottolinea come la scelta della tecnica di selezione sia in realtà non

determinate per le sorti evolutive dell’algoritmo e di come lo siano piuttosto, il numero di

Page 23: EA: UN CASO PRATICO DI APPLICAZIONE

individui da selezionare ad ogni nuova generazione e la successiva regola di sostituzione

degli stessi.

Ovviamente, quanto detto sulla RWS è facilmente estendibile, concettualmente,

anche ad altre tipologie di tecniche selettive, prima fra tutte quella del Tournament. Di

quest’ultimo e di altre tecniche note in letteratura non si sono prodotte, ad ogni modo,

evidenze dimostrative certe della loro minor adattabilità al contesto applicativo ivi di

discussione. Una trattazione più ampio respiro applicativo, atta a ricomprendere le tematiche

suddette sarebbe infatti venuta meno alle prerogative redattive del presente lavoro,

circoscritte, è bene ricordarlo, alla costituzione di un esclusiva componente integrativa degli

obiettivi formativi previsti dal corso afferente ed estensiva delle mere capacità

teorico/nozionali proprie della materia.

Page 24: EA: UN CASO PRATICO DI APPLICAZIONE
Page 25: EA: UN CASO PRATICO DI APPLICAZIONE

EA: L’ANALISI DEI RISULTATI Il primo esperimento effettuato è volto semplicemente alla valutazione del corretto

funzionamento dell’algoritmo e viene riportato come base esemplificativa di riferimento

per il proseguo dell’analisi. I parametri di rilievo sono:

N=8 -- P=30 -- gen=300 -- pc=0.9 -- pm=0.9

Fitness media Totale: 27.049689 std: 0.306755 -- Errore medio Totale: 0.035259

Si propongono, a titolo di esempio, i risultati ottenuti15. L’esecuzione viene ripetuta

mantenendo invariati tutti i parametri in gioco.

15 Il materiale di seguito illustrato, ivi e nel proseguo di questo lavoro, è interamente tratto dalla directory in allegato alla medesima.

Page 26: EA: UN CASO PRATICO DI APPLICAZIONE

L’andamento della fitness media mostra una convergenza molto lenta al valore limite

target 28. Nello specifico, dalla prima apparizione di un individuo con fitness massima che

avviene pressappoco alla generazione 30, l’algoritmo impiega all’incirca ben 180

generazioni per omologarsi attorno a tale individuo e convergere al valore ottimo finale.

Appare quindi evidente sin da ora come la fase esplorativa dell’algoritmo sia eccessiva in tal

caso.

La diagrammazione dell’errore medio non può che confermare quanto già emerso dal grafico

precedente, ossia una eccessiva “resistenza” all’uniformarsi degli individui. Ciò è

chiaramente causato dagli elevati valori di pc (probability-crossover) e pm (probability-

mutation), il che assicura una forte spinta al cambiamento da parte degli individui selezionati

per la riproduzione.

Page 27: EA: UN CASO PRATICO DI APPLICAZIONE

Il grafico precedente, invece, mostra semplicemente i valori in dettaglio dell’ultima

popolazione dell’algoritmo, appartenente alla generazione numero 300. Ovviamente, come

già ampiamente evidente dalle immagini precedenti la convergenza richiesta, all’istante

conclusivo dell’evoluzione la convergenza al limite è già avvenuta e quindi tutti gli individui

si sono già uniformati ad uno dei 4 differenti individui best generatosi nelle generazioni

precedenti. Ragion per cui tutti gli individui, a partire dalla generazione 215 risultano avere

tutti fitness massima.

Infine, segue la rappresentazione della (unica in questo caso) soluzione al problema delle 8-

Regine prodotto dall’algoritmo genetico.

Infine, i valori medi complessivi risultanti dall’esecuzione dei 20 run espressi in

termini medi di fitness ed errore.

Page 28: EA: UN CASO PRATICO DI APPLICAZIONE

Uno tra i primi esperimenti effettuati è stato quello di far variare, coeteris paribus, la

probabilità di mutazione dell’algoritmo nell’intero range di valori [0,1] con un incremento

minimo di 0.1. I parametri vitali dell’algoritmo, per questo esperimento, sono dunque i

seguenti:

N=8 -- P=30 -- gen=300 -- pc=1 -- pm= 0, 0.1, … , 0.9, 1

Fitness media Totale: 27.1299 std: 0.32842 -- Errore medio Totale: 0.032266

Avendo effettuato variazioni incrementali successive del pm, nonché avendo

effettuato, come di consueto per tutti gli esperimenti, 20 run indipendenti per ogni variazione

del parametro pm, si ha dunque a che fare ora con una quantità di informazione notevolmente

Page 29: EA: UN CASO PRATICO DI APPLICAZIONE

superiore rispetto a quella del caso precedente. Per tale motivo si mostreranno, nel dettaglio,

solo gli andamenti medi del pm in corrispondenza di un unico valore di pc (1).

Pm=0

Pm=0.1

Pm=0.2

Page 30: EA: UN CASO PRATICO DI APPLICAZIONE

Pm=0.4

Pm=0.3

Pm=0.5

Pm=0.6

Page 31: EA: UN CASO PRATICO DI APPLICAZIONE

Pm=0.7

Pm=0.8

Pm=0.9

Pm=1

Si nota facilmente come all’aumentare del fattore pm la distanza lineare tra la riga rossa e la

curva blu aumenti sensibilmente, pregiudicando, in particolar modo nell’ultimo caso, l’attesa

convergenza al valore 28 di fitness.

Page 32: EA: UN CASO PRATICO DI APPLICAZIONE

Una sintesi dei risultati è la seguente:

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

Mean 26.91 26.91 27.26 27.25 27.34 27.17 27.18 27.34 27.23 27.02 26.97

Std 0.290 0.391 0.449 0.399 0.307 0.406 0.269 0.2773 0.209 0.368 0.215

Err. 0.040 0.041 0.033 0.028 0.024 0.031 0.030 0.024 0.028 0.036 0.044

TOT: Mean: 27.1300 std: 0.3285 Err.: 0.0326

In termini grafici:

Page 33: EA: UN CASO PRATICO DI APPLICAZIONE

Lo stesso esperimento è stato comunque ripetuto per ogni valore di pc nell’intervallo [0,1] con passo di campionamento 0.1.16 Ecco alcuni risultati:

16 Onde evitare un sovraccarico delle funzionalità espressive del presente lavoro che, si ricorda, non rappresenta oggetto individuale di valutazione e non intende perseguire finalità analitiche proprie, tali risultati non verranno inclusi nel proseguo. Saranno comunque presenti nella specifica directory in allegato.

Page 34: EA: UN CASO PRATICO DI APPLICAZIONE

Cosa dire a riguardo delle immagini mostrate? Innanzitutto si intuisce da subito come

l’analisi del pm, data la similarità grafica dei prospetti mostrati, richieda molta attenzione.

Non basta infatti fotografarne l’andamento qualitativo di massima per intuirne i pro e i

contro. I principali 2 aspetti da notare, sono:

- La non generalizzata proficuità del pm in termini di fitness media;

- La granulosità del pm nell’apportare modifiche alla fitness media che, allorché

estremamente parcellizzate in un range di valori ristretto (tipicamente mai superiore

a [0.1 , 0.5/0.6] ), risultano determinanti nel moto di convergenza dell’algoritmo.

Si parta con ordine analizzando per prima l’immagine riferita al valore di pm=0.

Page 35: EA: UN CASO PRATICO DI APPLICAZIONE

È immediato constatare una convergenza

rapidissima della spezzata (in colore rosso)

alla curva blu della fitness, tanto rapida

quando assolutamente inefficace. La

convergenza, velocissima, non è diretta

infatti verso la soluzione ottima globale

ma, in media, verso una solo locale (valore

2.7.00). La statistica inserita

nell’immagine conferma quest’idea: solo l’11% delle popolazioni complessive (su 6000,

ossia 300 generazioni da 20 individui ciascuna) ha avuto la l’evoluzione desiderata, tutte le

altre sono rimaste fossilizzate su soluzioni solo sub-ottime. Stante l’efficacia del pc, a breve

comprovata, appare evidente già da ora come allora il solo crossover non sia affatto

sufficiente per assicurare l’andamento asintotico richiesto dall’algoritmo, a meno di

soluzioni fortunose iniziali (a cui possono di fatto essere ascritte quell’11% di popolazioni

convergenti a al valore limite 28). Ciò che emerge con decisione è anche l’incapacità

dell’impianto algoritmo così impostato di generare individui best. Lo si vede chiaramente

dalla spezzata rossa che non va di molto oltre (e a fatica) la soglia del 27.00. E’ questo, a

detta personale, la principale causa del fallimento dell’algoritmo ed è nient’altro che il

risultato di un serie vorticosa di effetti strettamente connessi tra di loro:

- Come qualsivoglia tecnica di selezione degli individui, anche quella ivi adottata

cerca di privilegiare in termini probabilistici la ricombinazione tra individui best,

dunque abbastanza simili tra di loro. Stante ciò, nella fase inziale l’algoritmica svolge

il suo lavoro senza problemi, ciò in quanto partendo da valori medi di fitness

relativamente bassi il solo operatore di crossover riesce facilmente a generare

individui con una fitness migliore di quella dell’individuo worst. Gli individui con

fitness bassa nella popolazione di partenza tendono, in virtù del meccanismo di

survival selection adottato, a essere tutti rimpiazzati da individui migliori portando

ad un innalzamento medio immediato della curva blu. Tale meccanismo, oltre a

scongiurare ogni ipotesi di possibile randomizzazione l’algoritmo, fa sì che a mano

a mano che si procede nel tempo diventi sempre più complesso continuare a sostituire

Page 36: EA: UN CASO PRATICO DI APPLICAZIONE

efficacemente gli individui peggiori. Ciò, essenzialmente, accade per 2 differenti

ordini di motivi:

a) Il meccanismo di selezione tenderà, da un certo punto in poi, a

selezionare con elevata probabilità individui uguali tra di loro o

molto simili.

b) A sua volta, il meccanismo di sostituzione fa sì che ci sia una

rapida convergenza della popolazione verso gli individui best.

Questi due fattori, unito all’assenza di mutazione, concatenandosi continuamente nel

corso dell’esecuzione algoritmica, assicurano la perdita progressiva e continuativa di varietà

genetica. Si intuisce quindi come i meriti della mutazione siano da rintracciare in questo caso

nel ruolo determinate che essa gioca nella determinazione di nuovi individui best.

Per convincersi di ciò basti osservare lo stesso prospetto grafico in corrispondenza di pm=1.

Si nota subito come la spezzata ora mostri

una ripidità molto più accentuata arrivando

in poche generazioni a generare individui

con fitness massima. Il problema è però

chiaramente il fatto che la fase esplorativa

risulta in questo caso assolutamente

eccessiva e ciò, per via della convergenza

che appare ora estremamente lenta,

conduce a risultati complessivi, nell’arco delle 300 generazioni, addirittura inferiori a quelle

fatte registrate nel caso di analisi precedente (pm=0). La grande differenza che però vige tra

le due fattispecie di analisi è che mentre la prima, è bene sottolinearlo, è in una situazione di

stallo indefinito da cui certamente non uscirà (indipendentemente dal numero di

generazioni), la seconda circostanza invece è all’estremo opposto sotto tale aspetto, ossia

pur registrando prestazioni di poco inferiori sulle 300 generazioni dall’esperimento, in realtà

l’eccessiva variabilità genetica non risulta indeterminatamente ostativa della convergenza

cercata. Più in dettaglio la convergenza non avviene nel corso del numero di generazioni

Page 37: EA: UN CASO PRATICO DI APPLICAZIONE

considerato ma sicuramente avverrebbe protraendo nel tempo l’esecuzione dell’algoritmo e

dunque innalzando il numero di generazioni.

Quindi, parafrasando la situazione con termini economici, l’una (pm=0) crea profitto e

distrugge valore, l’altra (pm=1) crea valore senza (ancora) riuscire a creare profitto, e ciò,

ad ogni modo, rende comunque nettamente più desiderabile la seconda circostanza alla

prima.

In ogni caso, poi, i risultati migliori si ottengono sicuramente per valori meno “estremi” di

pm, in particolare le migliori performance risultano esserci in corrispondenza di pm=0.7.

Ulteriori spunti di analisi sono dati dai seguenti punti.

A parte i valori più alti, cioè 0.9 e 0.1 per cui 300 generazioni non sono sufficienti di fatto,

ciò che si osserva è il fatto di come la curva blu riesca comunque ad “attaccarsi” alla rossa

ma con delle sostanziali differenze:

- Una volta che completata la convergenza tra le due curve, più il pm è basso e più è

difficile che possa verificarsi un nuovo scollamento, ossia che la media degli

individui best si innalzi ancora, cosa invece auspicabile se non si è ancora raggiunto

un valore di fitness medio adeguato. Nel caso limite, ossia quando pm=0, sarà

impossibile che ciò avvenga, indipendentemente dal numero di generazioni. Con un

valore intermedio, cioè da 0.1 in poi, non è per nulla assicurato che, nei termini

generazionali previsti, avvengano compiutamente sia lo scollamento delle due curve

e sia, soprattutto, il successivo riallineamento.

- All’aumentare progressivo di pm aumenta anche, distintamente, la distanza lineare

tra la rossa e la blu, cioè la distanza tra l'origine degli assi e la proiezione ortogonale

sull'ascissa del punto di incrocio delle due linee. Contestualmente ciò rallenta la

convergenza della blu alla rosa che comunque, come detto, date le ipotesi del

problema, ci sarà sicuramente per valore asintotico di gen. Quindi il trade-off in

questo caso è tutto tra la generazione di sempre nuovi individui best che fanno salire

la linea rossa (che si realizza in corrispondenza di alti valori di pm) e alta la velocità

di convergenza delle due curve (bassa probabilità di mutazione).

Page 38: EA: UN CASO PRATICO DI APPLICAZIONE

Tutti gli esperimenti sin qui condotti sono poi stati replicati apportando una leggera

modifica procedura di elaborazione genetica dell’algoritmo, ossia rendendo l’applicazione

del pm non più svincolata ma del tutto subordinata a quella del pc. L’azione mutativa viene

dunque ora effettuata solo in corrispondenza di un’avvenuta azione combinatoria da parte

del crossover.

Tale logica operativa, la più in linea con i principi di replicabilità biologica che sottostanno

l’applicazione degli algoritmi genetici, risulta palesare un chiaro deficit prestazionale

rispetto al caso precedente. I motivi, ovvi, di ciò vanno rintracciati nella già di per sé flebile

azione di variazione genetica che la specifica struttura implementativa adottata comporta.

L’applicazione con maggiore frequenza dell’azione mutativa non può dunque che irrobustire

la fase esplorativa dell’algoritmo che comunque, è bene sempre ricordarlo, è tenuta sempre

sotto stretto controllo dalla specifica condizione di survival selection adottata.

Quanto asserito è quindi deducibile, in via estensiva, dalle immagini che seguono:

Con rifermento al caso pc=0.1 la migliore performance, registrata in occasione di pm=0.1,

fa segnare appena uno 0.167% di TBP. Tutte le altre non portano nessuna popolazione alla

convergenza cercata. Dunque, in questo caso, si ottengono prestazioni segnatamente inferiori

a quelle del caso precedente.

La soluzione di sx, in corrispondenza di

pm=0.1, appare generata in maniera

fortunosa, per tutte le altre si ha TBT=0%.

Page 39: EA: UN CASO PRATICO DI APPLICAZIONE

Più in generale ciò che accade è che, nel caso di pc e pm dipendenti tra di loro (caso 1 da ora

in avanti), si sono chiaramente fatte registrare prestazioni di gran lunga inferiori per valori

piccoli di pc, a dimostrazione ulteriore

della superiorità esplorativa del pm.

Applicando sostanzialmente il solo pm

infatti, ossia apportando di volta in volta

delle modificazioni quasi random per gli individui e senza praticamente alcuna ingerenza

combinatoria di più elementi tra di loro (crossover quasi nullo), è stato sufficiente per

ottenere già degli ottimi risultati. Ciò in quanto, ad ogni modo, effettuare degli swap casuali

all’interno di individuo può teoricamente portare all’esplorazione dell’intero spazio delle

soluzioni. Dunque una soluzione di questo tipo, a differenza di quella ottenibile

considerando il solo pc, è comunque adottabile, con in più, di riflesso, gli ovvi benefici

apportanti dal minore onere computazionale delegato al calcolatore.

Anticipiamo brevemente l’analisi del

pc mostrando subito questo parallelo con il

caso pc=0.9 e pm=0.

Le immagini mostrano che si riesce ad

ottenere un TBP solo del 20%, a

dimostrazione della minore portanza

esplorativa del crossover rispetto alla mutazione.

Page 40: EA: UN CASO PRATICO DI APPLICAZIONE

Basta invece una minima componente

aggiuntiva di pm (0.1) per ottenere un

sensibile miglioramento delle prestazioni

Per valori alti di pc invece la situazione tende a capovolgersi ed in questa fase è l’eccesso

di variabilità indotto da pm a ridurre le prestazioni comparate con il caso 1. D’altro canto ciò

dimostra come, per valori alti di pm, si

renda necessario solo una piccola

componente mutativa per indirizzare

correttamente lo sviluppo della

popolazione e, soprattutto, di come,

effettivamente, la forza di questi

algoritmi risieda proprio nel rapporto di forza tra questi due parametri che, se fatti agire in

comunione operativa come nel caso 1,(figura in basso a sx e in alto a dx) e con il giusto

settaggio generano un speed-up prestazionale evidente, come evidenziato dall’immagine

seguente.

Page 41: EA: UN CASO PRATICO DI APPLICAZIONE

L’esperimento precedente è stato ripetuto facendo variare pc in luogo di pm. I risultati grafici

complessivi sono i seguenti:

N=8 -- P=30 -- gen=300 -- pc= 0, 0.1,… , 0.9, 1 -- pm=0.6

Page 42: EA: UN CASO PRATICO DI APPLICAZIONE
Page 43: EA: UN CASO PRATICO DI APPLICAZIONE

Il caso di adozione è quello in cui si considerano pc e pm in maniera indipendente (caso 2).

Il risultato medio mostra un andamento generalizzato molto costante (molto di più rispetto

al caso 1 che si osserverà a breve come complemento), apparendo a tratti quasi rettilineo.

Ovviamente, stante il caso di applicabilità appena discusso, la media complessivamente

risulta da subito molto alta poiché già dai punti iniziali (se si esclude il caso pc=0, pm=0

ovviamente) l’ingerenza della mutazione nel processo evolutivo fa si che si raggiungano già

per valori minimi di pm soluzioni sub-ottime che altrimenti, (caso 1) verrebbero raggiunte

solo per valori intermedi di pm attorno a 0.6.

Si scopre poi che l’andamento è quindi qualitativamente molto simile a quello fatto registrare

variando pm invece di pc. Certamente però è facile notare che la variazione di pm causa un

moto oscillatorio molto più elevato.

È però interessante constatare come, di fatto, pc e pm abbiano un peso quantitativamente

leggermente differente nelle dinamiche di sviluppo dell’algoritmo.

A dimostrazione di come il pm sia un responsabile di salti esplorativi maggiori rispetto al pc

basti osservare come, un pm=0.1 risulta già sufficiente, anche in corrispondenza di pc=0 per

ottenere una soluzione superiore o uguale a 27.00 e come invece occorra un pc pari ben a

0.9 per raggiungere/superare tale soglia, in corrispondenza di pm=0. Tale circostanza inoltre,

si verificata in un unico caso, quindi è possibile possa ritenersi come frutto di circostanze

fortunose.

Infatti:

Page 44: EA: UN CASO PRATICO DI APPLICAZIONE

Considerando infine risultati ottenuti secondo la versione dell’algoritmo con pm e pc

indipendenti (caso 1) risulta chiaramente più accentuata la discrepanza quantitativa tra le due

curve che presentano valori di attacco anche di 2 punti di differenza. Ad es.:

Page 45: EA: UN CASO PRATICO DI APPLICAZIONE

Nel caso in cui si adottasse l’approccio opposto a quello sinora considerato, ossia il

caso 2, si otterrebbero degli andamenti tutti estremamente simili a quelli registrati nel caso

dell’immagine inziale con pm=0 (caso 1).

Ciò in quanto, come prevedibile, l’aumento del pc comporterebbe un progressivo effetto

migliorativo delle prestazioni (e non solo in assenza di mutazione). Ciò, banalmente, per due

motivi. Il primo è che l’algoritmo applicherebbe in tal caso ogni tipo di variazione genetica

agli individui selezionati solo se ad essi venisse applicato l’operatore di crossover, così da

far entrare in gioco la mutazione esclusivamente sulla prole risultante dal crossover. Il

secondo motivo è che, come più volte ribadito, la tipologia generale di selezione dei parents

adottata è quella di tipo B2O5, che dunque già di per se è limitativa in termini di variazioni

genetiche complessivamente apportate ad ogni generazione.

In corrispondenza di pc=0 quindi il valore medio sarebbe ovviamente sempre pari a quello

della popolazione iniziale. Esattamente ciò che si verifica nell’immagine iniziale, in cui

l’effetto iniziale molto evidente di salita della curva si attenua progressivamente

all’aumentare del pc, ossia man mano che si acquisisce una sistematicità applicativa dello

strumento ricombinatorio principe per questo lavoro.

La tabella seguente aiuta a chiarire quanto detto.

Page 46: EA: UN CASO PRATICO DI APPLICAZIONE

0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1

Mean 0 25.15 27.26 26.43 26.57 26.59 26.74 26.97 26.85 26.97 27.17

TBP(%) 0 0 4.08 9.47 13.68 11.38 14.06 25.55 19.78 20.11 37.21

TOT: Mean: 24.2455 (26.6700)17 std: 14.1200 (15.5320)18

Si passa ora all’analisi dei parametri P e gen.

I dati mostrano come determinate per ottenere il giusto compromesso tra esplorazione

e sfruttamento sia il rapporto tra P e gen, tenendo fermo gen e variando solo P tra 10 e 100,

si ottiene infatti quanto segue:

N=8 -- P= 10, 20,… , 70, 100 -- gen=300 -- pc=0.9 -- pm=0.6

Media Totale (P=10) = 27.343650, Errore Totale= 0.024244 Media Totale (P=50) = 26.899777, Errore Totale= 0.040977

Media Totale (P=70) = 26.523567, Errore Totale= 0.055755 Media Totale (P=100) = 26.005853, Errore Totale= 0.076724

Le statistiche denotano un peggioramento progressivo delle prestazioni. Infatti:

17 La fitness media tra parentesi è stata calcolata escludendo lo zero iniziale. 18 La std media tra parentesi è stata calcolata escludendo lo zero iniziale.

Page 47: EA: UN CASO PRATICO DI APPLICAZIONE

Ripetendo lo stesso esperimento con gen=30 invece di 300, la situazione peggiora ancora,

come atteso del resto.

Da notare come i valori di fitness media e di errore in corrispondenza di p=100 siano molto

analoghi a quelli registrati per gen=300, poiché il rapporto tra i due fattori (P/gen) è molto

simile, 1/3 ~ 30/100.

Nel dettaglio:

Page 48: EA: UN CASO PRATICO DI APPLICAZIONE

Media Totale (P=100, gen=300) = 26.005853, Errore Totale= 0.076724 Media Totale (P=100, gen=30) = 26.059167, Errore Totale= 0.074711

Facendo variare solo gen invece la situazione chiaramente migliora, non tanto per

l’importanza strategia dei valori che essa assume col susseguirsi dei run ma, di nuovo, per

la crescita costante del rapporto tra le grandezze P e gen.

N=8 -- P= 100 -- gen= 30, 60,… , 270, 300 -- pc=0.9 -- pm=0.6

Il dettaglio di alcuni valori:

Media Totale (gen=30) = 24.004000, Errore Totale= 0.166519 Media Totale (gen=150) = 25.358677, Errore Totale= 0.104201

Media Totale (gen=210) = 25.725343, Errore Totale= 0.088489 Media Totale (gen=300) = 25.989370, Errore Totale= 0.077404

Page 49: EA: UN CASO PRATICO DI APPLICAZIONE

Da ultimo, si fanno variare insieme, proporzionalmente, entrambi i parametri, P e gen.

Il risultato, come da previsione, è una sostanziale invarianza delle prestazioni, a conferma

ulteriore di quanto sia in realtà il, rapporto tra queste due grandezze ad alterare le prestazioni

dell’algoritmo e non la loro singola e indipendente variazione.

N=8 -- P= 10, 20,… , 70, 100 -- gen= 30, 60,… , 270, 300 -- pc=0.9 -- pm=0.6

Ecco i risultati di quest’ultimo esperimento condotto.

Proiettando gli stessi dati sulla stessa scala di valori dell’esperimento in cui si varia solo P,

si osserva una sostanziale perdurante invarianza dei valori in causa.