Ciao, devo scrivere un algoritmo che mi faccia il crossover tra due cromosomi. Il problema lo riporto a:
2 vettori genitori ed un vettore figlio
Faccio un esempio, siano i due vettori:
codice:
p= [1 2 3 4 5 6 7 8 9 ]
q= [4 1 2 8 7 6 9 3 5 ]
da questi due vettori devo trovarne un terzo (un figlio che chiamo r ) che ha le seguenti prorpietà.
Scelgo come primo elemento del vettore r il primo elemento del vettore p. Si ha che la situazione iniziale è:
codice:
r= [1 * * * * * * * * * ]
dove gli asterischi fanno intendere che non esiste ancora un valore per r[2], r[3]..r[9].
A questo punto, guardo l'elemento presente nella posizione 1 di q ossia il numero 4. Vado a mettere il numero 4 nel vettore r:
codice:
r= [1 * * 4 * * * * * ]
Adesso ritorno a guardare la posizione 4 del vettore q, ci trovo 8 e lo metto in r (nella posizione giusta, che è quella corrispondente a p )
codice:
r= [1 * * 4 * * * 8 * ]
Nella posizione 8 di q c'è il 3, per cui si ha:
codice:
r= [1 * 3 4 * * * 8 * ]
La posizione 3 di q c'è il 2 e dunque:
codice:
r= [1 2 3 4 * * * 8 * ]
Adesso, alla posizione 2 di q c'è l'1, che abbiamo già messo in r, si chiude allora il ciclo e nelle posizione vuote rimanenti di r, cioè:
codice:
r= [1 2 3 4 * * * 8 * ]
si vanno a mettere i rimanenti elementi presenti in q e rispettivi (in indice) ad r, ossia
codice:
r= [1 2 3 4 7 6 9 8 5 ]
Spero di aver fatto capire come funziona l'algoritmo, si deve operare una sorta di zig-zag. Ho fatto una bozza di algoritmo (io lo dovrei scrivere in matlab, ma va bene anche in pseudo-codice)
codice:
r[1]=p[1];
K= Trova q[i] in p; //k conterrà un indice di p
if p[k]!=r[k] then r[k]=q
else //abbiamo trovato un ciclo
for j=1 to length(r)
if (r[j]==*) then r[j]=q[j]
Il mio problema è fare un ciclo che di volta in volta mi salti da una posizione all'altra di p e mi vada a vedere la corrispondente posizione in q.
Mi date una mano?
Grazie