[galib] Getting several genomes of only 0's...
David Love
wvpryde at hotmail.com
Wed Jan 2 18:33:11 EST 2008
----------------------------------------
> Date: Sun, 23 Dec 2007 01:32:54 -0500
> From: p at dirac.org
> To: galib at mit.edu
> Subject: Re: [galib] Getting several genomes of only 0's...
>
> On Wed 19 Dec 07, 4:57 PM, anselmop at sc.usp.br <anselmop at sc.usp.br> said:
> > > Message: 1
> > > Date: Tue, 18 Dec 2007 15:14:11 -0700
> > > From: David Love <wvpryde at hotmail.com>
> > > Subject: [galib] Getting several genomes of only 0's after completion
> > > of first generation, before mutation and crosso
> > > To: <galib at mit.edu>
> > > Message-ID: <BAY101-W1050FE12A5C28FF3DD0D83B4630 at phx.gbl>
> > > Content-Type: text/plain; charset="iso-8859-1"
> > >
> > >
> > > Hi everyone,
> > >
> > > I'm doing a GASimpleGA using the GA1DArrayGenome data type. I've
> > > noticed that after the GA has finished evaluating the first
> > > generation I receive several genomes for evaluation where every gene
> > > is given by 0.0, which occurs before the mutation and crossover
> > > operations. For my problem, a genome with only zero entries is
> > > invalid, so the algorithm cannot continue.
> > >
> > > Is it possible for me to avoid getting these zero genomes? If so, how?
> > >
> > > If you need any more information about what I am doing, I can try to
> > > provide that.
> > >
> > > Thanks,
> > > David
> >
> >
> > Hi, David.
> >
> > Did you provide the genome with an initialization function? If not,
> > GALib will use a default initialization, which (hopefully) initializes
> > each gene of the genome with zero value. Quoting GALib's manual, "This
> > operator does not actually create new genomes, rather it 'stuffs' the
> > genomes with the primordial genetic material from which all solutions
> > will evolve."
>
>
> > When you create a GAPopulation or a GAGeneticAlgorithm object, you
> > must pass a GAGenome object as argument. It is then cloned to create
> > all the n population individuals. In other words, after that, all the
> > individuals in the population are identical. The initialization
> > function must be called for each individual so that they get diverse
> > genetic material. Your initialization function must do some sort of
> > variation in order to accomplish this, using, for example, random
> > numbers.
> >
> >
> > What may be happenning with your code is that you didn't provide an
> > initialization function, and all the individuals are identical to the
> > first one, which may have all its genes initializes to zero.
> >
> > In case this isn't your problem, a code snnipet may help to clarify things
> >
> >
> > Good luck
> >
> >
> > Anselmo
>
>
> Ola Anselmo,
>
> A previous poster had asked about some code that I looked into and it
> *appeared* (I haven't checked this against the source code yet) that in the
> absence of an initializer, the genes were being set to their lower limit (at
> least for the genome/ga combo he was using).
>
> Dave, unless you already have a good idea where the solution is, you want to
> start out with as diverse a population as possible. If 50 people were to
> look for a needle laying on the ground somewhere in a football field,
> they'll find it faster if they start looking in random places than if they
> all started looking in the same general location.
>
> Pete
>
> --
> GPG Fingerprint: B9F1 6CF3 47C4 7CD8 D33E 70A9 A3B9 1945 67EA 951D
> Last night I dreamt of 09-f9-11-02-9d-74-e3-5b-d8-41-56-c5-63-56-88-c0
>
> "A mathematician is a machine for converting coffee p at dirac.org
> into theorems." -- Paul Erdös http://www.dirac.org
> _______________________________________________
> galib mailing list
> galib at mit.edu
> http://mailman.mit.edu/mailman/listinfo/galib
Anselmo and Pete,
Thanks for the replies. I do have the initializer defined, and it is working correctly as far as I can tell. I will post my main() and Initializer() below. I only get the genomes of 0 entries after the completion of the first generation of (correctly initialized) genomes, and before the mutation and crossover sequence begins. For the time being, I have simply amended my code so that the 0 genomes return a very bad objective value without being evaluated in the normal way. When I began to write this, I started with the code from ex1.C (as I recall) and modified it from there. The code that I have (anything specified in all caps is given by a #define):
int main(int argc, char **argv) {
for(int ii=1; ii genome( length, Objective );
genome.initializer(::Initializer);
genome.mutator(::Mutator);
genome.crossover(::Crossover);
genome.comparator(::Comparator);
GASimpleGA ga(genome);
ga.minimize();
ga.nBestGenomes( 5 );
ga.nConvergence( 10 );
ga.populationSize(popsize);
ga.nGenerations(ngen);
ga.pMutation(pmut);
ga.pCrossover(pcross);
ga.selectScores( GAStatistics::AllScores );
ga.scoreFrequency( 1 );
ga.flushFrequency( 5 );
ga.evolve();
cout << "The GA found:\n" << ga.statistics() << "\n";
cout << "The GA found:\n" << ga.statistics().bestPopulation() << "\n";
return 0;
}
------------------------------------------------------------------------------------------------
void Initializer(GAGenome& g) {
GA1DArrayGenome& genome = (GA1DArrayGenome&)g;
int ii;
static int n = 1;
printf( "Inside Initializer, n = %d\n", n++ );
float LayerNumber;
int Sum = MULT_LENGTH;
int Number = -1;
int MaxInt = getlen( NUM_PIECEWISE_CONST_LAYERS, Sum, Number );
LayerNumber = (float) GARandomInt(1, MaxInt);
genome.gene( 0, LayerNumber );
for( ii = 1; ii <= NUM_PIECEWISE_CONST_LAYERS; ii++ ) {
genome.gene( ii, GARandomFloat( minwidth, maxwidth ) );
}
for( ii = NUM_PIECEWISE_CONST_LAYERS + 1; ii < NUM_PIECEWISE_CONST_LAYERS + 3; ii++ ) {
genome.gene( ii, GARandomFloat( minwidth, maxwidth ) );
}
cout << genome << endl;
}
_________________________________________________________________
i’m is proud to present Cause Effect, a series about real people making a difference.
http://im.live.com/Messenger/IM/MTV/?source=text_Cause_Effect
More information about the galib
mailing list