[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