ea: un caso pratico di applicazione
TRANSCRIPT
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
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.
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);
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.
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
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
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};
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
Con quest’ultima immagine può ritenersi esaurita la trattazione degli aspetti preliminari del
problema. Ora si passa alla descrizione dei parametri algoritmici in gioco.
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.
- 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.
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.
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)
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.
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.
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
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.
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
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
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.
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.
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.
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.
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
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
Pm=0.4
Pm=0.3
Pm=0.5
Pm=0.6
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.
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:
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.
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.
È 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
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
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).
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%.
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.
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.
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
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:
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.:
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.
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.
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:
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
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.