Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262

    [qualsiasi]algoritmo di crossover

    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

  2. #2
    Utente di HTML.it L'avatar di gokan
    Registrato dal
    Feb 2003
    Messaggi
    262
    ho risolto facendo un ciclo del genere:
    codice:
    i=1;
    while (i!=0) do
    begin
    k= Trova q in p;   //k conterrà un indice di p
    if p[k]!=r[k] then 
                   r[k]=q[i]
                   i=k;    
    else //abbiamo trovato un ciclo
      for j=1 to length(r)
        if (r[j]==*) then 
                       r[j]=q[j];
                       i=0; //si può uscire;
    sembra che così il programma funzioni

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.