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 Datenstrme
verwendet. */
#include <fstream> /* Fr die Ausgabe in Dateien. */
#include <ga/ga.h> /* Die Mutterklasse aller GA-Klassen */
#include <ga/GARealGenome.h> /* Die Header-Datei fr Real-Zahlen */
#include <ga/GARealGenome.C> /* Wichtig fr die Instanzierung der
Templates. */
#include <ga/GAPopulation.h> /* Bevlkerungsdetails */
#include "foolbase.h" /* Die Definitionen fr 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 mchte ...
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 kmmert. In der Fuzzy-Logic-Sektion mu§
natrlich 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,
// whrend 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 fllen.
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