galib inside other classes

D. Brittain David.Brittain at
Thu Nov 6 06:06:54 EST 1997

On Tue, 4 Nov 1997, H. Brown Cribbs wrote:
> Hello GALib Users:
>    I was wondering what experience others had had using the Galib
>    classes within other classes.  I have a fairly complex system
>    I'm designing for some reinforcement learning research and I've
>    reached programming dilemma.
>    My problem entails evolving a individuals who have to be encoded
>    and decoded at each generation to go out into its environment for
>    evaluation.  This means that I have written a "fake" evaluator
>    that simple reads data from each individual's evalData member.
>    This worked fine in my test problem that did not entail encapsulating
>    the ga within another class.  As soon as I did that I ran into the 
>    problems with setting my evaluator and initializer due to the pointer
>    to a function now being required to be a pointer into a member function.
>    The only work around I've thought of is to include a pointer to the 
>    objects I need to encode/evaluate and define unique default initializer
>    and evaluators.  I would do such a thing in a derived class of the 
>    GALib's GASteadyStateGA.  Does this seem a "clean" solution? Or is it
>    a kludge?
>    Your opinions would be greatly appreciated as to what my options are,
>    and thanks in advance,

The wayu I solve this problem (actually I think it's based on an
example in GALib) is to derive a new class that inherits from GAGenome
and from the class which is encapsulating the Genome.

You then declare initialiser, mutator, comparator, crossover, and
evaluator as static.

class OtianGenome : public GAGenome, public Otian{


  static void OGInitialiser(GAGenome& g);
  static int OGMutator(GAGenome& g, float f);
  static float OGComparator(const GAGenome& g1, const GAGenome& g2);
  static int OGCrossover(const GAGenome&, const GAGenome&, GAGenome*,
  static float Evaluator(GAGenome& g);

The constructor then looks like this:

OtianGenome::OtianGenome(GAGenome::Evaluator f, void* u):
             primSplitgenome=new GARealGenome(constructAlleles(),f,u);
             customerAllocGenome=new SetShareGenome(customers.size());

For my problem I use the evaluator function to decode the genome (the
function call genome.buildOtian()) and then call the evaluator in the
super class:

float OtianGenome::Evaluator(GAGenome& g){
  OtianGenome & genome = (OtianGenome &)g;

  return float(genome.Otian::Obj());  

I hope this makes sense, and that I understood your question correctly.


David Brittain                                  david.brittain at
Design Information Group                        tel: +44 117 928 8914
University of Bristol                           fax: +44 117 928 8912    
83 Woodland Road
Bristol, UK.

More information about the galib mailing list