Defining the objective

Jan Braun Jan.Braun at zerberus.escape.de
Fri Jun 5 02:43:45 EDT 1998


Good morning,

I have a little problem in programming with galib.  I'm still quite
new in (C-, C++-) Programming, so please help me.

I programmed algorithm in multiple modules and in terms of C++ in
multiple classes, one of which is class ga, the other interesting is
class Fool_Base.  In class ga I setup the Genetic Algorithm as follows


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Class ga >>>
//
// @(#) ga -- genetic optimisation stuff
//

//
// Time-stamp:  <Thu Jun  4 20:35:05 1998 -- Jan Braun>
//

//
// @(#) $Id: $
// @(#) $Keywords: Genetic-Algorithms, gene, alelle $
// $KnownCompatibility: GAlib-2.4.2, Linux-2.0.33, egcs-1.0.3a, binutils-2.9.1,  $
//

//
//              $Header: $
// Description: This Module handles all that genetic stuff,
//              i. e. creating, initializing, cloning the individuals
//              ans evolving them over n populations..  
//     Version: $Id: $
//	Author: jb -- Jan Braun <Jan.Braun at zerberus.escape.de>
//  Maintainer: jb -- Jan Braun <Jan.Braun at zerberus.escape.de>
//	  Date: Wed Jun  3 1998 -- Jan Braun <Jan.Braun at zerberus.escape.de>
//   Copyright: (c) 1998 Jan Braun
//


//
// Change Log:
// $Log: $
//


// ==================================================== &Preprocessor ===
#ifndef lint
static char *rcsid = "$Id:$";
#endif /* lint */


#define Debug


// ======================================================== &Includes ===
#include <stdio.h>		/* Die normale Ein- und Ausgabe wie
				   man sie aus ANSI-C kennt.  */
#include <iostream>		/* Die Ein- und Ausgabe, wie man sie
				   in C++ als Eingriff in Datenstršme
				   verwendet.  */
#include <fstream>		/* FŸr die Ausgabe in Dateien.  */
#include <ga/ga.h>		/* Die Mutterklasse aller GA-Klassen */
#include <ga/GARealGenome.h>	/* Die Header-Datei fŸr Real-Zahlen  */
#include <ga/GARealGenome.C>	/* Wichtig fŸr die Instanzierung der
				   Templates.  */
#include <ga/GAPopulation.h>	/* Bevšlkerungsdetails */
#include "foolbase.h"		/* Die Definitionen fŸr die
				   Regelbasis. */
#include "ga.h"			/* Die Deklarationen die in diesem
				   Modul vorgenommen werden.  */

using namespace std;



// ============================================================ &Code ===

/* This is class ga{}!  */

// ---------------------------------------------------- &Constructors ---

// ..................................................... &Constructor ...
/* This is the default Constructor.  */

ga::ga()
{
#ifdef Debug
  cerr << "Debug: Default-Constructor for ga is working"
       << " ... ";
#endif /* Debug */

  // nothing, so far

#ifdef Debug
  cerr << "done!" << endl;
#endif /* Debug */
}


// ..................................................... &Constructor ...
/* This is a specialized Constructor.  */

ga::ga(const int& lvs,		// number of the LVs
       const int& out)		// which is the outgoing LV?
{
#ifdef Debug
  cerr << "Debug: Constructor for ga is working"
       << " ... ";
#endif /* Debug */


  // wieviele Variablen sind zu erzuegen?
  lv_number     = lvs;
  // Welche ist die Ausgangsvariable?
  lv_out_number = out;
  // Falls man die Werte in eine Datei drucken mšchte ...
  ofstream outfile;
    

  /* Je nachdem, wieviele Werte man zu berechnen hat; hierin werden
     sie abgelegt.  Dabei ist zu beachten, da§ diese Funktion sich nur
     um die Eingangsvariablen kŸmmert.  In der Fuzzy-Logic-Sektion mu§
     natŸrlich eine Variable mehr vorhanden sein: die
     Ausgangsvariable.  */
  GARealAlleleSetArray allele;	// Liste mit den Genen anlegen.
  if (lvs == 3)
    {
      // In diesem Fall werden nur zwei Allele angelegt und optimiert,
      // wŠhrend das dritte die restlichen Prozente bis 100 %
      // darstellt.
      allele.add(X_MIN, X_MAX);	// Wertebereich des einen Genes festlegen
      allele.add(X_MIN, X_MAX);	// Wertebereich des anderen Genes
				// festlegen.
    }
  else /* lvs != 3 */
    {
      for (int i=0; i<lv_number-1; i++)
	{
	  allele.add(X_MIN, X_MAX);
	} /* for int i=0; ... */
    } /* lvs != 3 */
    
  GARealGenome genome(allele,
		      Fool_Base::Objective); // Aus den Allelen und der
				// Fitnessfunktion wird ein Genom!

  GASimpleGA ga(genome);	// Bei dem Algorithmus handelt es sich
				// um einen einfachen GA, der auf die
				// Genome angewandt wird.


#ifdef Debug
  cerr << "done!" << endl;
#endif /* Debug */
}


// ................................................ &Copy-Constructor ...
/* This is the copy-constructor  */

ga::ga(const ga&)
{
#ifdef Debug
  cerr << "Debug: Copy-Constructor for ga is working"
       << " ... ";
#endif /* Debug */

  // . . .

#ifdef Debug
  cerr << "done!" << endl;
#endif /* Debug */
}


// ....................................................... Destructor ...
/* Beware: The destructor may be declared inline in file ``ga.cc''!  */

ga::~ga()
{
#ifdef Debug
  cerr << "Debug: Destructor for ga is working"
       << " ... ";
#endif /* Debug */

  // . . .

#ifdef Debug
  cerr << "done!" << endl;
#endif /* Debug */
}
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Class ga <<<




Here is the interesting part of the class Fool_Base, which defines the
Objective:

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> part of class Fool_Base >>>
// .................................................... &compute_ga() ...
/* This creates and runs a genetic algorithm  */
void Fool_Base::compute_ga()
{
  ga Gene(lv_anzahl, out_variable);
  
}



// ..................................................... &Objective() ...
/* This function evaluates the single genomes to obtain its fitness.
   Of course, it returns a double-value.  */
float Fool_Base::Objective(GAGenome& g)
{
  // .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..  Variables  ..
  // local Variables
  d_vec genome_vec;		// Vector to store the genomes in the
				// right order.  In place if the
				// out-variable, a simple 0 is
				// stored.
  double alpha, beta, gamma;	// Drei Gene oder Anteile.


  // .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. Code  ..
  // Get a reference of G.  We need to cast it into the right type.
  GARealGenome& genome = (GARealGenome &)g;
  
  // Vektor initialisieren.
  genome_vec.clear();
  genome_vec.reserve(lv_anzahl);
  

  /* Wenn es sich um ein Problem mit drei Genen handelt, dann werden
     im genetischan Algorithmus nur zwei davon ausgerechnet und das
     dritte als die fehlenden Prozente bis 100 % ausgerechnet.   */
  if (lv_anzahl == 3)
    {
      alpha = genome.gene(0);
      beta  = genome.gene(1);
    }
  else /* lv_anzahl != 3 */
    {
      // Vektor mit den Werten fŸllen.
      for (int i=0; i<lv_anzahl; i++)
	{
	  if (i == out_variable)
	    {
	      // Jetzt erfinden wir ein Genome, da§ nachher Ÿberlesen 
	      // wird :-)
	      genome_vec.push_back(0.0);
	    }
	  else /* i != lv_out_number */
	    {
	      genome_vec.push_back(genome.gene(i));
	    } /* i != lv_out_number */
	} /* for int i=0; ... */
    } /* lv_anzahl != 3 */

  
  /* den Vektor an die Fitness-Funktion Ÿbergeben; ihr Ergebnis sei
     auch unser Ergebnis.   */
  return((float)compute_fuzzy(genome_vec));
}
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< part of class Fool_Base <<<


As you can see, the ga-object is called from a Fool_Base-object.  It
should be able to use the function float
Fool_Base::Objective(GAGenome& g).  But if I compile this (using
egcs-1.0.3a, which is now working  :-) I get the following
compiler-error.  I don't know, what I must Do to get this running :-(


>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Compiler-Log >>>
c++ -c  -O2 -g -Wall -Wno-unused -fguiding-decls foolbase.cc
c++ -c  -O2 -g -Wall -Wno-unused -fguiding-decls ga.cc
ga.cc: In method `ga::ga(const int &, const int &)':
ga.cc:140: no matching function for call to `GA1DArrayAlleleGenome<float>::GA1DArrayAlleleGenome (GAAlleleSetArray<float> &, float (Fool_Base::)(GAGenome &))'
/usr/local/include/ga/GARealGenome.C:21: candidates are: GA1DArrayAlleleGenome<float>::GA1DArrayAlleleGenome(unsigned int, const GAAlleleSet<float> &, float (*)(GAGenome &), void *)
/usr/local/include/ga/GARealGenome.C:35:                 GA1DArrayAlleleGenome<float>::GA1DArrayAlleleGenome(const GAAlleleSetArray<float> &, float (*)(GAGenome &), void *)
/usr/local/include/ga/GA1DArrayGenome.h:154:                 GA1DArrayAlleleGenome<float>::GA1DArrayAlleleGenome(const GA1DArrayAlleleGenome<float> &)
make: *** [ga.o] Error 1
make: Target `all' not remade because of errors.

<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< Compiler-Log <<<

Cann anybody *please* help me?

	Jan

-- 
                                  Jan Braun
    Beratung Rechenzentrum               E-Mail: Jan.Braun at tu-bs.de
    Technische Universit"at              WWW: http://www.tu-bs.de/~c0031015/
    38092 Braunschweig                   Tel: +49/531/391-5555
    http://www.tu-bs.de/rz/beratung/     Fax: +49/531/391-5549

===== ypchsh /usr/local/bin/emacs :-)  (-: ``Go FORTH now and create ...''====






More information about the galib mailing list