Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577

    [C++] Algoritmi genetici

    ciao,
    sto sperimentando col codice presente in questa pagina http://barcadero.wordpress.com/2011/...itmo-genetico/ ed allo scopo di comprendere le potenzialità degli algoritmi genetici, ho modificato quel sorgente per vedere se riusciva a risolvere un problema di bilanciamento.

    Dati 4 dischi di dimensioni note e date anche un certo numero di cartelle le cui dimensioni dei loro contenuti sono note, ho provato ad usare l'algoritmo per fare in modo che ad ogni disco arrivassero circa la medesima quantità di dati considerando che ciò che è contenuto nella cartella non può essere mosso in un'altra.

    Per inizializzare l'algoritmo quindi ho usato:

    //costanti
    namespace {
    const int GENE_DIM = 10; // numeri di numeri nel gene
    const int POPULATION_DIM = 4; // numero di individui nella popolazione(solo numeri PARI!!!)
    const int MAX_FITNESS = 130000; // l'algoritmo si ferma quando nasce un individuo con questo val. di fitness di 130000 MB
    }

    quindi ho personalizzato un metodo

    codice:
     void ramdomize_gene(int numero) {
    if(numero == 0){
    gene[0]=6462;
    gene[1]=9780;
    gene[2]=67332;
    gene[3]=9;
    gene[4]=12;
    gene[5]=100;
    gene[6]=6134;
    gene[7]=30580;
    gene[8]=50;
    gene[9]=1144;
    }
    if(numero == 1){
    gene[0]=6;
    gene[1]=859;
    gene[2]=152;
    gene[3]=77;
    gene[4]=43022;
    gene[5]=3;
    gene[6]=13972;
    gene[7]=1023;
    gene[8]=232;
    gene[9]=162;
    }
    if(numero == 2){
    gene[0]=2907;
    gene[1]=14;
    gene[2]=20260;
    gene[3]=7445;
    gene[4]=134751;
    gene[5]=28082;
    gene[6]=727;
    gene[7]=95101;
    gene[8]=1;
    gene[9]=30785;
    }
    if(numero == 3){
    gene[0]=3284;
    gene[1]=3266;
    gene[2]=95;
    gene[3]=198;
    gene[4]=66;
    gene[5]=7702;
    gene[6]=616;
    gene[7]=40566;
    gene[8]=0;
    gene[9]=0;
    }
     
     }
    ed il main nel seguente modo

    codice:
     //for( int s = 0; s < POPULATION_DIM; s++ ) pop[s].ramdomize_gene();
            pop[0].ramdomize_gene(0);
            pop[1].ramdomize_gene(1);
            pop[2].ramdomize_gene(2);
            pop[3].ramdomize_gene(3);

    problema: aumentando via via il valore di MAX_FITNESS si nota che i geni non vengono mai incrociati ma il motivo non è spiegabile. Scusate per la vaghezza ma non è un compito semplice, è un algoritmo che va provato per chi è volenteroso di capire ed imparare.


    grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2001
    Messaggi
    577
    scusate ma credo che il programma funzioni correttamente, semplicemente appena viene trovata una soluzione il rimescolamento dei geni non avviene.
    Nel mio caso specifico, esistono 4 individui i cui geni una volta sommati sono soluzione ed è per questo che non avviene il rimescolamento. Di sicuro tale tecnica è pensata per problemi di gran lunga molto più complessi di quello banale che ho esposto io.

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.