[galib] problem with genome

Fábio Roberto Teodoro fr.teodoro at gmail.com
Wed Sep 28 18:43:01 EDT 2011


You should pass as a template parameter the type of the elements in the array
that defines the genome.

Something like the following code should work for you (if I correctly
understand your code):

GA1DArrayGenome<int> genome(NUM_TAR, Objective);

See <http://lancet.mit.edu/galib-2.4/API.html#genome_1darray>.

HTH

On Sun, Sep 25, 2011 at 08:34:21PM +0200, TECPRO at terra.es wrote:
>    Hello,
> 
> 
>    I am new to gelib and when trying to define a genome I get the
>    following error:
> 
> 
>    ex1.c: In function ‘int altermain(task_info)’:
> 
>    ex1.c:49: error: missing template arguments before ‘genome’
> 
>    ex1.c:49: error: expected ‘;’ before ‘genome’
> 
>    ex1.c:57: error: ‘genome’ was not declared in this scope
> 
> 
>    I am modifying the ex1.c example changing the GA2Dbinary to a
>    GA1DArrayGenome and I have defined a new objetive function.
> 
>    Thanks in advance.
> 
> 
> 
>    #include <ga/GASimpleGA.h> // we're going to use the simple GA
> 
>    #include <ga/GA2DBinStrGenome.h> // and the 2D binary string genome
> 
>    #include <ga/std_stream.h>
> 
>    #include <ga/GA1DArrayGenome.h>
> 
>    #define cout STD_COUT
> 
>    #include "header.h"
> 
> 
>    #include <ga/GAArray.h>
> 
>    #include <ga/GAGenome.h>
> 
>    #include <ga/GAAllele.h>
> 
> 
> 
>      int NUM_TAR = 29;
> 
>      int MAX_NUM = 15;
> 
> 
>    int altermain(task_info tasklist)
> 
>    {
> 
>      cout << "Example 1\n\n";
> 
>      cout << "This program tries to fill a 2DBinaryStringGenome with\n";
> 
>      cout << "alternating 1s and 0s using a SimpleGA\n\n"; cout.flush();
> 
> 
>    // See if we've been given a seed to use (for testing purposes).  When
>    you
> 
>    // specify a random seed, the evolution will be exactly the same each
>    time
> 
>    // you use that seed number.
> 
> 
> 
>    int argc = 0;
> 
>    char **argv = NULL;
> 
>      for(int ii=1; ii<argc; ii++) {
> 
>        if(strcmp(argv[ii++],"seed") == 0) {
> 
>          GARandomSeed((unsigned int)atoi(argv[ii]));
> 
>        }
> 
>      }
> 
> 
>    // Declare variables for the GA parameters and set them to some default
>    values.
> 
> 
>      int width    = 10;
> 
>      int height   = 5;
> 
>      int popsize  = 30;
> 
>      int ngen     = 400;
> 
>      float pmut   = 0.001;
> 
>      float pcross = 0.9;
> 
> 
> 
>    // Now create the GA and run it.  First we create a genome of the type
>    that
> 
>    // we want to use in the GA.  The ga doesn't operate on this genome in
>    the
> 
>    // optimization - it just uses it to clone a population of genomes.
> 
>      GA1DArrayGenome genome(NUM_TAR, Objective);
> 
> 
>      //GA2DBinaryStringGenome genome(width, height, Objective);
> 
> 
>    // Now that we have the genome, we create the genetic algorithm and set
> 
>    // its parameters - number of generations, mutation probability, and
>    crossover
> 
>    // probability.  And finally we tell it to evolve itself.
> 
> 
>      GASimpleGA ga(genome);
> 
>      ga.populationSize(popsize);
> 
>      ga.nGenerations(ngen);
> 
>      ga.pMutation(pmut);
> 
>      ga.pCrossover(pcross);
> 
>      ga.evolve();
> 
> 
>    // Now we print out the best genome that the GA found.
> 
> 
>      cout << "The GA found:\n" << ga.statistics().bestIndividual() <<
>    "\n";
> 
> 
>    // That's it!
> 
> 
> 
>      return 0;
> 
>    }
> 
> 
> 
> 
> 
>    // This is the objective function.  All it does is check for
>    alternating 0s and
> 
>    // 1s.  If the gene is odd and contains a 1, the fitness is incremented
>    by 1.
> 
>    // If the gene is even and contains a 0, the fitness is incremented by
>    1.  No
> 
>    // penalties are assigned.
> 
>    //   We have to do the cast because a plain, generic GAGenome doesn't
>    have
> 
>    // the members that a GA2DBinaryStringGenome has.  And it's ok to cast
>    it
> 
>    // because we know that we will only get GA2DBinaryStringGenomes and
> 
>    // nothing else.
> 
> 
>    /*
> 
>    float
> 
>    Objective(GAGenome& g) {
> 
>      GA2DBinaryStringGenome & genome = (GA2DBinaryStringGenome &)g;
> 
>      float score=0.0;
> 
>      int count=0;
> 
>      for(int i=0; i<genome.width(); i++){
> 
>        for(int j=0; j<genome.height(); j++){
> 
>          if(genome.gene(i,j) == 0 && count%2 == 0)
> 
>    score += 1.0;
> 
>          if(genome.gene(i,j) == 1 && count%2 != 0)
> 
>    score += 1.0;
> 
>          count++;
> 
>        }
> 
>      }
> 
>      return score;
> 
>    }
> 
>    */
> 
> 
>    float Objective(GAGenome& g)
> 
>    {
> 
> 
>    GA1DArrayGenome & genome = (GA1DArrayGenome &)g;
> 
> 
>    float score=0;
> 
>    int i,j;
> 
>    int tiempo_contador[1000]; for (j=1; j<= MAX_NUM;
>    j++){tiempo_contador[j]=0;}
> 
>    //printf(" (%d)evaluacion %d ",es_inicial,contador);
> 
>    //fflush(stdout);
> 
>    for(i=0;i<genome.length();i++)
> 
>    {
> 
>     tiempo_contador[ genome.gene(i) ]=tiempo_contador[ genome.gene(i) ]+
>    structarray[i].value;
> 
>    }
> 
>    for(j=1;j<=MAX_NUM;j++){
> 
>     if(tiempo_contador[j]>score) score=tiempo_contador[j];
> 
>    }
> 
>    return(score);
> 
>    }

> _______________________________________________
> galib mailing list
> galib at mit.edu
> http://mailman.mit.edu/mailman/listinfo/galib


-- 
Fábio Roberto Teodoro



More information about the galib mailing list