Esegue operazioni di crossover su AST nella programmazione genetica

8

Quindi in generale quando si esegue un crossover in GA, si capovolge direttamente una sezione casuale nel "genoma", con la sezione corrispondente nell'altro genitore, e si modifica in base alla frequenza di mutazione.

Considera le sequenze di seguito:

0100 1000 0001 1011

0010 0110 1101 1111

Un crossover senza alcuna mutazione potrebbe apparire come questo:

0100 0110 1101 1011

0010 1000 0001 1111

In questo caso, i blocchi 2 e 3 sono stati scambiati ei blocchi 1 e 4 sono rimasti invariati.

Non sono sicuro di come funzionerebbe in GP con gli alberi di sintassi astratti, tuttavia, poiché non vi è alcuna garanzia che il punto nell'albero astratto di riferimento nel primo genitore sia compatibile con la sezione dal secondo genitore, ad esempio una sezione potrebbe avere un tipo di ritorno di booleano mentre l'altra ha un tipo di stringa di ritorno, come nell'esempio seguente:

    p1
   /  \
  b    i
 /\   /\
b  f i  s

    p2
   /  \
  s    b
 /\   /\
i  n s  i

se dovessi provare ad attraversare il ramo 1 del genitore 1 che ha un tipo di ritorno di b, con il ramo 1 del genitore 2 che ha un tipo di ritorno di s, creerebbe un errore di sintassi se dovesse essere eseguito, quindi, come eseguirò correttamente un crossover su un AST, sarebbero apprezzati esempi specifici.

    
posta Jordan LaPrise 29.04.2016 - 19:34
fonte

1 risposta

5

Una prima osservazione è che la GA canonica è basata su una rappresentazione di lunghezza fissa (un numero fisso di geni in < em> loci sul cromosoma).

Quindi gli operatori di crossover GA sono simili alla riproduzione biologica biologica: il materiale genetico di madre e padre è combinato in modo tale che i geni del bambino si trovino (approssimativamente) nella stessa posizione in cui si trovavano nei genitori.

È molto diverso dal crossover GP tradizionale basato su albero, che può spostare un sottoalbero in una posizione completamente diversa nella struttura ad albero.

Questa forma di crossover può succedere poiché il GP standard assume una "limitazione" nota come chiusura :

all the variables, constants, arguments for functions and values returned from functions must be of the same data type.

Una rappresentazione basata su AST è una forma di programmazione genetica (strongmente) tipizzata e introduce alcuni vincoli sui possibili punti di attraversamento.

Ogni nodo dell'AST è associato a un tipo e, prima di eseguire il crossover, devi creare un elenco di punti di crossover compatibili:

       p1[1]                          p2[1]
      /     \                        /     \
  [2]b       i[5]                [2]s       b[5]
  /  \       /  \                /  \       /  \
[3]b [4]f [6]i  [7]s           [3]i [4]n [6]s  [7]i


b(p1): [2, 3]      b(p2): [5]
f(p1): [4]         f(p2): []
i(p1): [5, 6]      i(p2): [3, 7]
s(p1): [7]         s(p2): [2, 6]
n(p1): []          n(p2): [4]

Ora:

  1. seleziona un punto di crossover casuale [P] da p1
  2. scambia il sottoalbero [P] con uno secondario da p2

per es.

  1. selezione casuale per p1 è [5]
  2. sotto-alberi compatibili da p2 hanno radice in [3] e [7] . La selezione casuale è [7] .

Il risultato del crossover è:

    p1                p2
   /  \              /  \
  b    i            s    b
 /\                / \  / \
b  f              b   fs   i 
                          / \
                         i   s

I bambini non hanno la stessa forma ma è abbastanza standard in GP.

Questo è un approccio molto di base. Con il tempo devi considerare vari altri aspetti:

  • spesso i punti di crossover non sono selezionati con probabilità uniforme :

    typical GP primitive sets lead to trees with an average branching factor (the num-ber of children of each node) of at least two, so the majority of the nodes will be leaves. Consequently the uniform selection of crossover points lead to crossover operations frequently exchanging only very small amounts of genetic material (i.e. small subtrees); many crossovers may in fact reduce to simply swapping two leaves.

    To counter this, Koza (1992) suggested the widely used approach of choosing functions 90% of the time and leaves 10% of the time.

    (da A Field Guide to Genetic Programming di Riccardo Poli, William Langdon, Nicholas McPhee, John Koza )

    Quindi semplici elenchi di punti di crossover compatibili non potrebbero essere sufficienti.

  • potresti dover utilizzare operatori speciali per ridurre le dimensioni dell'albero (ad esempio Mutazione di sollevamento, Riduzione delle differenze)

  • in alcuni contesti potresti desiderare un operatore crossover che tenda a preservare la posizione del materiale genetico ( omologo ).

    es. con crossover omologo di un punto devi analizzare i due alberi genitore dai nodi radice e selezionare il punto di crossover solo dalle parti dei due alberi nella regione comune.

    The common region is related to homology, in the sense that the common region represents the result of a matching process between parent trees. Within the common region between two parent trees, the transfer of homologous primitives can happen like it does in a linear bit string genetic algorithm

    ("Una guida sul campo alla programmazione genetica")

    Il crossover omologo presenta interessanti dettagli di implementazione (dovrebbe essere coordinato con l'elenco dei punti di crossover compatibili con il tipo).

  • La rappresentazione basata su AST può introdurre varie forme di "bias strutturali" che gli operatori di crossover / mutazione devono riconoscere.

Ultimo ma non meno importante ci sono altre rappresentazioni ben adattate per implementare la programmazione genetica tipizzata (anche non basata su albero). Le rappresentazioni lineari possono essere la scelta migliore per alcuni linguaggi di programmazione (è abbastanza semplice realizzare crossover omologo quando si usano rappresentazioni lineari e gli operatori omologhi sono ampiamente usati nel GP lineare).

Due meravigliose risorse gratuite per ulteriori dettagli sono:

risposta data 30.04.2016 - 13:15
fonte

Leggi altre domande sui tag