Viral Search algorithm

06/14/2016
by   Matteo Gardini, et al.
Politecnico di Milano
0

The article, after a brief introduction on genetic algorithms and their functioning, presents a kind of genetic algorithm called Viral Search. We present the key concepts, we formally derive the algorithm and we perform numerical tests designed to illustrate the potential and limits.

READ FULL TEXT VIEW PDF
POST COMMENT

Comments

There are no comments yet.

Authors

page 8

page 9

06/28/2021

A Meta-Heuristic Search Algorithm based on Infrasonic Mating Displays in Peafowls

Meta-heuristic techniques are important as they are used to find solutio...
06/01/2013

Harmony search algorithm for the container storage problem

Recently a new metaheuristic called harmony search was developed. It mim...
04/07/2017

Comparison of Global Algorithms in Word Sense Disambiguation

This article compares four probabilistic algorithms (global algorithms) ...
05/30/2013

Harmony search to solve the container storage problem with different container types

This paper presents an adaptation of the harmony search algorithm to sol...
04/06/2014

A Denoising Autoencoder that Guides Stochastic Search

An algorithm is described that adaptively learns a non-linear mutation d...
04/02/2020

An anytime tree search algorithm for the 2018 ROADEF/EURO challenge glass cutting problem

In this article, we present the anytime tree search algorithm we designe...
04/13/2013

An Improved ACS Algorithm for the Solutions of Larger TSP Problems

Solving large traveling salesman problem (TSP) in an efficient way is a ...
This week in AI

Get the week's most popular data science and artificial intelligence research sent straight to your inbox every Saturday.

1 Introduzione

Un algoritmo genetico è un algoritmo euristico ispirato alla teoria darwinaiana dell’evoluzione ed ai concetti di selezione naturale ed evoluzione biologica. Gli algoritmi genetici permettono di valutare le soluzioni di partenza, ricombinarle ed, introducendo elementi di disordine, produrne di nuove convergendo, così, alla soluzione ottima.
Nel corso degli ultimi decenni molti problemi concreti sono stati affrontati come problemi di massimizzazione o minimizzazione di una certa funzione obiettivo. Basti pensare ai vari problemi di tipo industriale di minimizzazione dei costi, di massimizzazione dei ricavi, di gestione ottima delle risorse e così via. Numerosi metodi sono stati sviluppati per risolvere il problema di trovare il massimo o il minimo di una data funzione quando essa è soggetta a vincoli. Tra essi particolarmente diffusi sono il metodo del simplesso [2], il metodo dei moltiplicatori di Lagrange, i metodi del gradiente [5] e del punto interno [3]. Come è ben noto gli aspetti più critici dei problemi di ottimizzazione insorgono quando si presentano non linearità o nella funzione considerata o nei vincoli che rendono il problema non convesso, quando sono presenti più minimi o massimi locali o quando la funzione non è differenziabile: in questo ultimo caso il metodi basati sul gradiente falliscono poichè le derivate direzionali non possono essere calcolate.
L’uso degli algoritmi genetici risulta particolarmente adatto in tutte queste situazioni poichè essi presentano certe caratteristiche che gli permettono di aggirare i problemi sopra elelencati. In particolare essi:

  • permettono di risolvere un problema di ottimizzazione per il quale non è noto un efficiente metodo analitico che possa trovare una soluzione in tempo polinomiale o lineare.

  • permettono di trovare soluzioni globalmente ottime anche se la funzione obiettivo presenta numerosi minimi locali.

  • hanno capacità di adattamento automatico nel caso il problema sottostante cambi nel tempo.

  • sono ideali nel caso in cui si voglia trovare il minimo di una funzione non differenziabile, poichè non necessitano del calcolo delle derivate direzionali.

  • sono facilmente estendibili nel caso in cui si voglia affrontare un problema multiobiettivo.

  • sono intrinsicamente parallilizzabili.

E’ stata sopratutto la loro grande adattabilità e versatilità a renderli così popolari ed utilizzati. La nascita degli algoritmi genetetici trova la sua collocazione negli anni settanta quando l’informatico Ingo Rachemberg parlò per la prima volta di “stategie evoluzionistiche” [10]. Tuttavia, per vedere la prima implementazione di un algoritmo genetico bisogna attendere il 1975 quando John Henry Holland nel suo libro Adaptation in Natural and Artificial Systems [6] presentò una serie di teorie e tecniche tuttora fondamentali. E’ proprio ad Holland che si deve il così detto Teorema degli Schemi, teorema fondamentale che assicura la convergenza degli algoritmi genetici. Pensato e dimostrato da Holland per la codifica binaria, grazie ai contributi di Wright [13] ha trovato formulazione e dimostrazione anche in alcuni casi di codifica con numeri reali. Negli anni a venire gli algoritmi genetici hanno permesso un notevole sviluppo nell’intelligenza artificiale ed hanno trovato applicazione in svariati campi dalla biologia all’economia, dall’analisi numerica alla finanza quantitativa [8].
L’obiettivo di questo articolo è riassumere gli aspetti fondamentali degli algoritmi genetici per poi presentarne una variante che risulta essere particolarmente adatta ai computer con bassa potenza di calcolo e che permette di trovare il minimo assoluto di funzioni che presentano numerosi minimi locali o tempo varianti. Presenteremo formalmente questo algoritmo, che chiameremo Viral Search, e lo testeremo su vari tipi funzioni generalmente usate nelle fasi di test degli algoritmi di ottimizzazione.

2 Funzionamento

Come già accennato in precedenza, gli algoritmi genetici traggono ispirazione dall’evoluzione e dalla selezione naturale. Ecco perchè, molti termini tipici di tali algoritmi trovano un corrispettivo nella biologia e nella genetica. Per maggiore chiarezza espositiva li elenchiamo brevemente di seguito.

  • Cromosoma: Ciascuna delle soluzioni del problema in esame: di solito è costituita da un vettore di bit o numeri reali.

  • Popolazione: L’insieme di soluzioni del problema considerato.

  • Gene: Parte di un comosoma che solitamente consiste in un elemento del cromosoma o in una parte di esso.

  • Fitness: Grado di valutazione associato ad una soluzione. La “bontà” della soluzione è valutata tramite un’apposita funzione (la funzione obiettivo) che varia a seconda del problema considerato.

  • Crossover: generazione di un nuovo cromosoma ottenuta mischiando due cromosomi già esistenti.

  • Mutazione: alterazione casuale di uno o più geni del cromosoma.

Ciò che accomuna gran parte degli algoritmi genetici è il procedimento che essi adottano per evolvere verso una soluzione ottima del problema. Essi seguono i seguono, generalmente, i seguenti step.

  • Generazione casuale della popolazione di partenza. In questa prima fase viene generata casualmente una popolazione iniziale che evolverà verso la soluzione ottima di generazione in generazione.

  • Applicazione della soluzione fitness alla popolazione. In questa fase la funzione fitness viene applicata a tutti gli individui, cioè ai cromosomi, della popolazione al fine di individuare gli elementi migliori.

  • Crossover. Sulla base delle soluzioni scelte al punto precedente vengono generate soluzioni ibride.

  • Generazione di una nuova popolazione. Viene generata una nuova popolazione sulla base delle scelte effettuate ai punti precedenti.

  • Iterazione della procedura a partire dal secondo punto fino ad un prestabilito istante di tempo oppure fino a che non siano presenti evidenti miglioramenti nella funzione fitness.

E’ probabile che un procedimento come quello appena descritto possa portare l’algoritmo a ricadere in minimi locali. Onde evitare questa evenienza è spesso utile mutare casualmente uno o più geni del cromosoma così da evitare che le soluzioni ristagnino in minimi locali: introducendo tali elementi di casualità l’algoritmo è in grado di esplorare altre possibili soluzioni che, potenzialmente, potrebbero essere migliori di quelle trovate fino ad ora. Generalmente il verificarsi di una mutazione è dettato da un parametro apposito che modellizza opportunamente la probabilità di mutazione. Un ulteriore accorgimento per evitare che l’algoritmo stagni in minimi locali è la tecnica dell’elitarismo: nel momento in cui viene generata la nuova popolazione, tra i nuovi individui vengono copiati anche gli individui migliori della popolazione precedente. La discussione su ognuno degli step seguiti da un algoritmo genetico classico è complessa e vasta: per dettagli ulteriori si può fare riferimento a [9], [4], [7].

E’ fondamentale, a questo punto, garantire la convergenza di tali algoritmi verso la soluzione ottima. Come già accennato, il Teorema degli schemi di Holland, ne dimostra la convergenza.

2.1 Il teorema degli schemi

In questa sezione esporremo il teorema degli schemi, risultato fondamentale che prova la convergenza degli algoritmi genetici. Una discussione completa può essere trovata in [1]. Per poter provare tale risultato è necessario definire cosa sia uno schema. Supponiamo, per semplicità, di considerare la codifica binaria e con una generica componente di un vettore. Uno schema è costituito dall’alfabeto dei segni (in caso di codifica binaria e ) aumentato di . Uno schema rappresenta quindi tutte le stringhe di uno spazio che coincidono con lo schema eccetto il carattere , ad esempio coincide con e con nell’alfabeto dei segni .

Quanto trattato il questo paragrafo si applica per l’analisi di un classico algoritmo genetico con ciclo interno del seguente tipo

1:  
2:  Select new population from the old one by single string selection based on a positive fitness function.
3:  Ricombine by crossover and mutation.
4:  Evaluate .
5:  Repeat.
Algorithm 1 Algoritmo Genetico Classico

Definito cosa sia un algoritmo genetico classico, passiamo ora a dare alcune definizioni necessarie per comprendere il teorema. Definiamo la lunghezza di uno schema, cioè la distanza tra il primo e l’ultimo componente fisso. Ad esempio . Sia inoltre l’ordine dello schema, cioè il numero di componenti fisse: ad esempio . Sia poi il fitness di uno schema, cioè il fitness medio di tutte le stringhe della popolazione che contengono lo schema . Ad esempio se lo schema contiene individui allora

dove è il fitness dell’individuo . Siano inoltre la dimensione della popolazione in e il fitness totale della popolazione.
Possiamo dedurre allora che ogni individuo hai probabilità di essere selezionato. Definito allora il numero di individui all’istante che presentano lo schema ci si può aspettare che

(1)

Se definiamo il fitness medio della popolazione come l’Equazione può essere scritta come

(2)

L’Equazione afferma che il numero di individui che presenta lo schema cresce ad ogni step temporale come il rapporto del fitness di ed il fitness totale. Quindi possiamo affermare che uno schema con prolifererà nelle generazioni successive, mentre uno schema con fitness inferiore alla media tenderà ad estinguersi. La formula afferma quindi che, in periodi di tempo lunghi, un buono schema prolifererà esponenzialmente mentre un cattivo schema si avvierà all’estinzione con velocità esponenziale.

A questo punto, è necessario analizzare i fenomeni di crossover e mutazione e di come essi impattino sulla possibilità che uno schema prevalga o meno sugli altri col passare del tempo.
Un punto di crossover è selezionabile in punti possibili, dove è la lunghezza del vettore che rappresenta l’individuo. rappresenta la probabilità che lo schema venga distrutto durante il corssover e quindi la probabilità di sopravvivenza è data da

Osserviamo che è presente il invece di perchè potrebbe capitare che lo schema sia spezzato e ricombinato esattamente. Possiamo allora affermare che vale

cioè il numero di individui alla generazione seguente che presentano lo schema è legato alla probabilità di sopravvivenza dello schema stesso. Osserviamo che la formula afferma che schemi corti hanno una probabilità di sopravvivenza più elevata rispetto a schemi più lunghi.

Passiamo ora ad analizzare gli effetti della mutazione sul processo di evoluzione dello schema. Sia la probabilità che un singolo componente dello schema cambi. Ogni mutazione è indipendente dalle altre così che la probabilità che uno schema sopravviva alla mutazione è pari a

Si osservi quindi che più uno schema è lungo e minore sarà la sua proabiltà di sopravvivere alla mutazione. Assumendo che otteniamo che . Infine otteniamo che

(3)

Arrivati a questo punto possiamo enunciare il teorema degli schemi.

Teorema 1 (Teorema Degli Schemi).

Con la nomenclatura introdotta sopra l’Equazione vale.

La formula afferma che quando si è in presenza di schemi corti con elevato valore della funzione di fitness e basso ordine ci sono maggiori probabilità di sopravvivenza. Tali schemi nella seguente generazione dell’algoritmo genetico classico sono soggetti ad una crescita esponenziale mentre gli altri schemi seguono una decrescita esponenziale.

3 Viral Search

In questa sezione introdurremo un nuovo tipo di algoritmo genetico che chiameremo Viral Search. Tale algoritmo è un algoritmo di ottimizzazione che mira a trovare un minimo/massimo globale di una funzione data. Inizieremo a descrivere euristicamente il suo funzionamento per poi fornirne una descrizione più formale.

3.1 L’idea

L’idea sottesa all’algoritmo del Viral Search è la seguente: si suppone che ci siano alcuni individui, che chiameremo virus, che si muovono aleatoriamente nello spazio dei parametri. Ognuno di essi in ogni punto in cui si trova “valuta” le condizioni dello spazio circostante e decide di diffondersi se tale condizione è migliore della migliore condizione di diffusione verificatasi fino a quel momento. Se le condizioni sono favorevoli inizia a riprodursi continuamente, generando un’ “epidemia” più o meno localizzata al termine della quale si estingue, ricordando però quale è stata la condizione migliore che gli ha permesso di proliferare. Estinta l’epidemia il virus ricomincia a muoversi aleatoriamente alla ricerca di zone ulteriormente migliori dove poter generare una nuova pandemia.

In un’ottica di minimizzazione tramite algoritmi genetici il virus non è altro che il cromosoma, il mezzo di cui si serve il virus per valutare la possibilità di diffusione è la funzione obiettivo e la durata dell’epidemia è il numero di generazioni durante le quali si riproduce il virus. Al termine dell’esecuzione dell’algoritmo la migliore condizione di diffusione trovata dai virus che popolano lo spazio dei parametri altri non è se non un minimo della funzione obiettivo, possibilmente un minimo globale.

Ora che abbiamo illustrato euristicamente come opera il viral search, passiamo alla sua formalizzazione.

3.2 L’algoritmo

Iniziamo questa sezione col definire la terminologia che utilizzeremo in seguito. Siano

  • : numero di generazioni, ovvero la durata del processo di diffusione del virus.

  • : numero di generazioni virali, ovvero la durata di un’epidemia localizzata.

  • : numero di individui, cioè il numero di virus che esplorano lo spazio dei parametri.

  • : numero di individui virali, cioè il numero di “copie di se stesso” che il virus singolo genera quando trova una zona di diffusione favorevole.

  • : valore funzione obiettivo.

  • : valore della funzione obiettivo globale.

  • : migliore individuo trovato.

  • : migliore individuo trovato globalmente.

L’algoritmo può essere sintetizzato come indicato nel seguente Algoritmo 2.

1:  Set ,,,,, and .
2:  Generate new population .
3:  while  do
4:     for  to  do
5:        Evaluate Objective Function and set it to value .
6:        if  then
7:           Start viral diffusion and set and as the best local indivual found and its associated value of objective function.
8:        end if
9:        if  then
10:           Set
11:           Set
12:        end if
13:     end for
14:     Move randomly viral population .
15:  end while
Algorithm 2 Viral Search

Analizziamo i singoli passi dell’algoritmo.

La prima istruzione è la fase di inizializzazione dei parametri. Si sceglie il numero di generazioni ed il numero di generazioni virali . Maggiore è e maggiore sarà la durata dell’esplorazione globale dello spazio dei parametri. invece determina la durata della ricerca del minimo locale in una certa area selezionata. Se si vuole privilegiare una ricerca di tipo globale, sospettando l’esistenza di più minimi locali, potrebbe essere opportuno scegliere .
Altra scelta da compiere è il numero di individui virali che si muovono alla ricerca di zone di diffusione migliori (parametro ) ed il numero di copie virali generate ogni volta che si presenta una zona di diffusione migliore delle precedenti (parametro ). Come nel caso precedente, se si volesse privilegiare una ricerca di tipo globale è opportuno scegliere . Un buon accorgimento è scegliere il numero di individui come funzione crescente del numero di parametri così che possa essere garantito un numero sufficientemente alto di individui in grado di esplorare adeguatamente tutto lo spazio dei parametri. Vanno anche assegnati i valori iniziali a ed a che, inizialmente, possono essere posti pari a , mentre i valori di e di risulteranno non assegnati.

L’istruzione  2 è dedicata alla generazione della popolazione iniziale di individui. Tale popolazione può essere generata in vari modi, avendo però cura di rispettare i vincoli sui parametri. Supponiamo che sia il vettore dei limiti superiori dei parametri e quello dei limiti inferiori. La popolazione viene generata tenendo conto di questi limiti, creando una nuvola di punti casuali oppure cercando di posizionare gli individui di modo che coprano il più uniformemente possibile lo spazio dei parametri.

Dal passo successivo inizia il vero e proprio algoritmo. Finchè non viene raggiunto il limite di generazione , oppure, in alternativa, viene soddisfatto un qualche criterio basato sulla funzione obiettivo [8], per ogni invidividuo in viene valutata la funzione obiettivo. Se il valore della funzione obiettivo è minore del valore della funzione obiettivo globale viene generata una nuvola di punti localizzata e viene eseguito un algoritmo di ricerca locale di tipo genetico. In questo articolo per tutte le ricerche locali verrà utilizzato il Differential Evolution, la cui descrizione può essere trovata in [11]. L’area in cui viene effettuata la ricerca può essere scelta in vari modi: un modo è selezionare l’individuo che ha identificato un miglioramento per la funzione obiettivo globale e selezionarlo come centro di cubo -dimensionale in cui avverrà la “diffusione”Ṫerminata la ricerca locale il valore della funzione obiettivo globale diventa il valore della funzione obiettivo associata all’individuo migliore dell’intera popolazione cioè il cromosoma che ha realizzato il minimo della funzione obiettivo globale. A questo punto la popolazione viene mossa aleatoriamente o pseudo-casualmente e l’algoritmo può ripetersi fino a .

Il movimento della popolazione deve essere oggetto di un’attenta analisi. Oltre ad essere possibile che un individuo esca dallo spazio dei parametri, problematica facilmente risolvibile, potrebbe capitare che, soprattutto in spazi particolarmente grandi, un movimento casuale non riesca a riempire completamente una particolare zona. Per ovviare a questo problema una strategia potrebbe essere la seguente: definiamo un numero di “centri ”, ovvero dei punti fissi nello spazione -dimensionale dei parametri. Per ogni individuo , ad ogni generazione, si calcola a quale centro esso è più vicino. L’invidividuo si muove aleatoriamente per un certo numero di generazioni, dopo di che si calcola quali centri siano stati meno visitati degli altri e si muovono alcuni individui dai centri più visitati ai centri meno visitati. Questo procedimento garantisce un’esplorazione più uniforme dello spazio dei parametri soprattutto nel caso in cui esso diventi particolarmente ampio, ovvero nei casi in cui sia elevato per qualche . Nel caso in cui si vogliano usare dei “centri ”è necessario garantire una distribuzione uniforme dei centri, oltre ad utilizzarne un numero adeguato alla dimensione del problema, intesa sia come numero di parametri coinvolti nell’ottimizzazione sia come dimensione dell’ area di esplorazione. Nel caso in cui si avessero delle informazioni a priori sulla funzione da minimizzare è possibile disporre i centri in modo tale che vengano posti nei punti in cui si sospetta si possa trovare il minimo cercato.

Da ultimo osserviamo che questo algoritmo, come tutti gli algoritmi genetici, è intrinsecamente parallelizzabile. La parallelizzazione può avvenire facilmente dividendo l’insieme su cui si vuole minimizzare la funzione in insiemi tali che ed affidando la ricerca su ognuno dei sottoinsiemi ad un diverso calcolatore.

4 Risultati Numerici

In questa sezione presenteremo i risultati numerici che testimoniano la bontà dell’algoritmo presentato in precedenza. L’algoritmo verrà testato per ricercare i punti di massimo o minimo di funzioni usate tipicamente per testare l’efficacia di algoritmi di minimizzazione. Queste funzioni sono difficili da ottimizzare perchè presentano molti minimi locali, hanno zone a derivata nulla, hanno punti estremanti variabili nel tempo oppure non sono differenziabili. Una lista di queste funzioni può essere trovata in [12]. Analizzeremo il comportamento dell’algoritmo e ne ossereveremo il costo computazionale. Tutti gli esprerimenti sono stati condotti sul un PC desktop AMD Athlon(tm) II X4 620 Processor 2.6 GHz e 4 GB di RAM.

4.1 La funzione di Rosenbrock

La funzione di Rosenbrock è una funzione non convessa largamente utilizzata per testare gli algoritmi di minimizzazione. La funzione di Rosenbrock in due dimensioni ha la seguente espressione analitica:

dove solitamente e . Essa presenta una “valle” di minimi ed un unico punto di minimo globale posto in . Trovare la valle è generalmente semplice, ma convergere al minimo globale è complesso. La funzione di Rosenbrock, nel suo caso bidimensionale, è mostrata in Figura .

Figure 1: Funzione di Rosenbrock

In questo esperimento numerico fissiamo come estremi del dominio il quadrato di vertici , ,, . Poniamo ed, inizialmente, , , ed . Utilizziamo, inoltre, un metodo di movimento degli individui basato sulla definizione dei centri, così da cercare di esplorare tutte le zone in maniera uniforme, ponendo dove è il numero di centri per asse. In totale si avranno, essendo lo spazio di ricerca bidimensionale, centri. Da questa osservazione deduciamo che definire in tal modo i centri costituisce una criticità al crescere del numero delle dimensioni siccome la crescita del numero di centri è esponenziale nel numero dei parametri da cui dipende la funzione obiettivo. A questo problema si può ovviare utilizzando meno centri, parallelizzando l’algoritmo, in modo tale da analizzare zone più piccole in parallelo oppure si può optare per un movimento completamente casuale degli individui. Per quanto rigarda la funzione di Rosenbrock scegliamo e , così da avere un minimo in . La correttezza dell’algoritmo si evince dai risultati mostrati in Tabella .

Viral Search Rosenbrock
Minimo Analitico Minimo Numerico
Table 1: Test numerico sulla funzione di Rosenbrok.

E’ possibile aumentare la precisione dell’algoritmo aumentando o il numero di generazioni oppure il numero di individui . In Tabella sono riportati i risultati ottenuti aumentando il numero di individui ed il numero di generazioni . Notiamo che l’algoritmo, a discapito della velocità, aumenta la sua precisione.

5 50 1.577528 2.499517 0.345470 2.327730
10 75 1.188800 1.413805 0.035677 1.041527
30 100 1.063673 1.131522 0.004056 0.957370
60 200 1.000619 1.001172 0.000001 1.336336
100 300 0.956890 0.915136 0.001884 3.798816
400 1200 1.000222 1.000432 0.000000 50.314480
Table 2: Convergenza dell’algoritmo all’aumentare del numero di individui e di generazioni. e

Un’idea di con che velocità migliori l’algoritmo all’aumentare del numero di generazioni a parità di individui è invece data dalla Figura : sull’asse delle è posto il numero di generazioni mentre sull’asse delle è mostrato il valore della funzione obiettivo. Si nota chiaramente che all’aumentare del numero di generazioni il valore della funzione obiettivo diventa prossimo allo a supporto della dimostrazione di convergenza dell’algoritmo.

Figure 2: Miglioramento della funzione obiettivo all’aumentare del numero di generazioni con .

Ciò che invece non incide eccessivamente sulla velocità di convergenza dell’algoritmo è il numero di generazioni virali ed il numero di individui virali, cioè . Ogni volta che viene chiamato l’algoritmo su una determinata porzione di area è opportuno usare un numero adeguato di e , dipendenti dalla dimensione dell’area da esplorare, tale da garantire la corvergenza dell’algoritmo genetico locale. Questo fatto è ben visibile dai risultati riportati in Tabella : si vede che non si nota nessun rilevante miglioramento a partire da e , segno che probabilmente una scelta ottimale per i parametri e sia proprio quest’ultima. Osserviamo che tanto più grande è l’area da esplorare tanto maggiori dovranno essere i parametri e per poter ottenere buoni risultati.

5 50 0.543221 0.294429 0.208690 0.517534
10 75 1.003317 1.006599 0.000011 0.555820
30 100 0.856556 0.733349 0.020588 0.687655
60 200 1.084461 1.176444 0.007149 1.448558
100 300 0.973215 0.947145 0.000717 2.077930
400 500 0.999746 0.999457 0.000000 17.368053
400 1200 1.000222 1.000432 0.000000 50.314480
Table 3: Convergenza dell’algoritmo all’aumentare del numero di individui virali e di generazioni virali. e

4.2 La funzione di Schaffer

Consideriamo ora un’altra funzione che viene tipicamente utilizzata nei test di ottimizzazione: la funzione di Schaffer. Essa è una funzione che ammette la seguente espressione analitica:

Tale funzione è di tipo oscillatorio, presenta numerosi limiti locali, un solo minimo globale nel punto ed è rappresentata in Figura . L’elevato numero di minimi locali rende molto difficile individuare l’unico minimo globale.

Figure 3: Funzione di Schaffer

Proviamo ora a cercare il minimo assoluto utilizzando l’algoritmo di Viral Search. Ripetendo un esperimento analogo a quello eseguito per la funzione di Rosenbrock, sempre sul rettangolo di vertici , ,, , otteniamo i risultati riportati in Tabella . In questo caso osserviamo che è necessario un maggior numero di individui per da garantire un buon ricoprimento dello spazio delle soluzioni. Man mano che lo spazio delle soluzioni diventa ampio, sia in numero di variabili, sia in estensione si verifica un aumento del tempo computazionale ed un aumento del numero di individui necessari per poter garantire la covergenza. In tal caso, un’appropriata scelta dei centri potrebbe risultare vincente, ad esempio posizionandoli nelle zone in cui ci si aspetta che la funzione possa presentare dei minimi.

10 50 3.877474 7.042075 0.058862 1.703371
50 75 -1.808829 -7.528476 0.054960 2.266957
100 100 -0.973998 -2.689123 0.008081 2.597825
400 150 -0.096062 0.098659 0.000019 6.383318
1000 200 0.470023 -0.470468 0.000442 21.300443
1500 300 -0.205643 0.205748 0.000085 46.546393
Table 4: Convergenza dell’algoritmo all’aumentare del numero di individui e di generazioni. La convergenza non monotona decrescente al minimo è dovuta alla diversa inizializzazione del seme per la generazione dei numeri aleatori necessari all’algoritmo. e

Dai risultati si nota come anche nel caso in cui si debba cercare il minimo globale di una funzione con molti minimi locali l’algoritmo di Viral Search riesce, in un tempo ragionevole, a trovare il minimo globale, cosa impossibile per un metodo basato sul semplice calcolo del gradiente quale può essere il metodo del gradiente coniugato. Ancora una volta, come nel caso precednte, notiamo che aumentando i valori di e è possibile migliorare ulteriormente il risultato ottenuto a discapito, però, della velocità di esecuzione.

4.3 Una funzione tempo variante

Mostriamo ora come un algoritmo di questo tipo possa essere utilizzato nel caso in cui si voglia minimizzare una funzione tempo variante. Supponiamo di voler minimizzare la seguente funzione, definita per e .

Tale funzione presenta inizialmente un minimo globale in ma, con lo scorrere del tempo, appare un minimo globale in , come visibile in Figura .

(a) Superificie per .
(b) Superificie per .
(c) Superificie per .
(d) Superificie per .
Figure 4: Superficie tempo variante. In è presente l’unico minimo globale in , mentre in il minimo globale si trova in .

In Tabella osserviamo come l’algoritmo identifichi inizialmente il minimo in , dopo di che, al mutare del minimo, esso trovi il nuovo minimo in . Questa potenzialità dell’algoritmo può essere sfruttata nei problemi di ottimizzazione tempo varianti in cui la funzione cambia nel tempo. Inoltre, scegliendo un numero non troppo elevato di individui è possibile mantenere attivo l’algoritmo in background utilizzando, di fatto, una minima potenza di calcolo. Solo nel momento in cui verrà trovato un nuovo minimo verrà richiesta la potenza di calcolo necessaria per poter esplorare la zona di interesse.

10000 -2.505741 -2.501649 -1.999929
20000 -2.504568 -2.496689 -1.999936
30000 -2.504568 -2.496689 -1.999936
40000 -2.499187 -2.501268 -1.999995
50000 -2.499187 -2.501268 -1.999995
60000 -2.499187 -2.501268 -1.999995
70000 1.957308 1.967954 -2.325962
80000 2.007791 1.929722 -2.649089
90000 1.985048 2.006218 -2.998347
Table 5: Minimo globale trovato dall’algoritmo con parametri: , , , .

4.4 Una funzione multidimensionale

Da ultimo proponiamo una massimizzazione di una funzione multidimensionale detta Funzione di Shekel, Essa nel caso -dimensionale con minimi presenta la forma seguente:

(4)

Nell’esperimento che condurremo consideriamo

e

(5)

Sotto tali condizioni, nella regione , è presente un massimo globale , e . Per dare un’idea di come si presenta tale funzione ne riportiamo il caso bidimensionale in Figura e le relative curve di livello in Figura .

Figure 5: Funzione di Schekel tridimensionale, presenta un massimo globale in .
Figure 6: Curve di livello per la funzione di Schekel.

Lanciamo l’algoritmo proposto precedentemente considerando diversi valori di e . Osserviamo dai risultati in Tabella che all’aumentare del numero di generazioni e di individui l’algoritmo arriva a convergenza, individuando il massimo globale .

5 50 6.2702 1.6316 6.1299 2.0350 1.8386 0.0908
10 75 3.9449 3.3552 3.6989 4.0596 2.0552 0.0893
30 100 3.9745 4.0870 4.0552 4.3697 4.5422 0.0782
60 200 3.8479 4.2399 3.7180 3.7828 3.7622 0.2350
100 300 3.6842 4.1257 3.9470 4.4123 3.0385 0.2931
400 1200 3.9609 3.9791 3.9159 3.9956 9.6834 4.0686
800 1500 3.9977 3.9588 3.9570 4.0526 9.9235 9.9994
1000 2000 4.0051 3.9984 4.0108 4.0576 10.1953 16.6048
2000 3000 3.9706 3.8976 3.9277 4.0657 8.7743 49.7099
5000 5000 4.0124 3.9811 3.9981 3.9879 10.4688 206.6701
Table 6: Convergenza dell’algoritmo all’aumentare del numero di individui e di generazioni. e

Ovviamente all’aumentare del numero di dimensioni corrisponde un aumento del tempo di computazione necessario per arrivare a convergenza. Ciò è dovuto, come osservato più volte, al fatto che, per garantire un buon risultato di ottimizzazione, è necessario utilizzare un sempre maggior numero di individui ed a scapito della velocità di computazione.

5 Conclusioni

Si è visto come l’algorimo di Viral Search riesca a trovare i punti estremanti di funzioni di difficile ottimizzazione grazie ad un approccio di tipo euristico. Gli sviluppi possibili di questo algoritmo sono molti e tanti sono i miglioramenti implementabili a partire dalla sua parallelizzazione. Altro miglioramento implementabile è cercare di ridurre l’aleatorietà del movimento degli individui nello spazio delle soluzioni. E’ noto e facilmente verificabile numericamente che all’aumentare del numero delle dimensioni il movimento totalmente casuale non riesce a coprire adeguatamente lo spazio delle soluzioni a meno di aumentare spropositamente il numero di individui . Un’idea potrebbe essere quella di far muovere gli individui per inerzia verso le zone di maggior incremento della funzione, seguendo quello che è l’approccio dei metodi steepest-descend, mantenendo comunque una componente aleatoria nel movimento così da evitare il ristagno in minimi locali.
Uno dei punti forza dell’algoritmo è la gestione dell’allocazione di memoria. Infatti tale algoritmo esegue una notevole allocazione di memoria solo quando viene lanciato l’algoritmo di ricerca locale. La memoria RAM resta occupata solo per il tempo necessario all’esecuzione dell’algoritmo di ricerca locale, dopo di che essa viene liberata e torna disponibile per altre applicazioni e calcoli. Ciò permette all’algoritmo essere eseguito con un basso dispedio di risorse e di richiedere maggiore potenza di calcolo solo nel momento in cui essa è effettivamente necessaria.

References

  • [1] Claiton L. Bridges and David E. Goldberg. 2nd int’l conf. n genetic algorithms and their applications. In An analysis of reproduction and crossover in a binary-coded genetic algorithm, 1987.
  • [2] G.B. Dantzig. Linear programming and extensions. Princeton University Press, 1963.
  • [3] G.B. Dantzig. Linear programming 2: Theory and extensions. Springer-Verlag, 2003.
  • [4] D.B.. Fogel. Evolutionary computation: toward a new philosophy of machine intelligence. IEEE Press, New York, 1995.
  • [5] M.R. Hestens and E. Stiefel. Methods of conjugate gradients for solving linear systems. Journal of Research of the National Bureau of Standards, 6:49, 1952.
  • [6] John H. Holland. Adaption in Natural and Artificial Systems. Bradford Books, 1975.
  • [7] J.R. Koza. Genetic programming: on the programming of computers by means of natural selection. MIT Press, Cambridge, 1992.
  • [8] A. Manicardi. Algoritmi genetici a supporto del problema della calibrazione, 2012/2013.
  • [9] R. Poli, W. B. Langdon, and N. F. McPhee. A field guide to genetic programming. lulu.com, 2008.
  • [10] I. Rachemberg. Evolutions strategie - Optimierung technischer Systeme nach Prinzipien der biologischen Evolution. PhD thesis, Technical University, Berlin, 1971.
  • [11] R. Storn and K. Price.

    Differential evolution - a simple and efficienti heuristic for global optimization over continuo spaces.

    Journal of Global Optimization, 11:519–523, 1997.
  • [12] Wikipedia. Test function for optimization. https://en.wikipedia.org/wiki/Test_functions_for_optimization, 2015.
  • [13] Alden H. Wright. Genetic algorithms for real parameter optimization, 1991.