📄 gabasega.c
字号:
// $Header: /usr/people/mbwall/src/galib/ga/RCS/GABaseGA.C,v 1.5 1999/03/27 19:19:46 mbwall Exp $
/* ----------------------------------------------------------------------------
gabase.C
mbwall 28jul94
Copyright (c) 1995 Massachusetts Institute of Technology
all rights reserved
Source file for the base genetic algorithm object.
---------------------------------------------------------------------------- */
#include <stdio.h>
#include <string.h>
#include <ga/GABaseGA.h>
#include <ga/garandom.h>
#include <ga/gaversion.h> // gets the RCS string in for ident purposes
//#define GA_DEBUG
// Here we assign the default values of the GAlib default parameters.
int gaDefNumGen = 250;
float gaDefPConv = 0.99;
int gaDefNConv = 20;
float gaDefPMut = 0.01;
float gaDefPCross = 0.90;
int gaDefPopSize = 50;
int gaDefNPop = 10;
float gaDefPRepl = 0.5;
int gaDefNRepl = 10;
int gaDefNumOff = 2;
float gaDefPMig = 0.1;
int gaDefNMig = 5;
int gaDefSelectScores = GAStatistics::Maximum;
int gaDefMiniMaxi = 1;
GABoolean gaDefDivFlag = gaFalse;
GABoolean gaDefElitism = gaTrue;
// Here are a few termination functions that you can use.
GABoolean
GAGeneticAlgorithm::TerminateUponGeneration(GAGeneticAlgorithm & ga){
return(ga.generation() < ga.nGenerations() ? gaFalse : gaTrue);
}
// The test for convergence == 0 is a hack. Technically convergence should be
// modified to return 1 or 0 depending on whether a maximization or minimize is
// happening, but on the other hand a stats object has no business knowing what
// the ga is trying to do.
GABoolean
GAGeneticAlgorithm::TerminateUponConvergence(GAGeneticAlgorithm & ga){
GABoolean val = gaFalse;
if(ga.minimaxi() == GAGeneticAlgorithm::MINIMIZE) {
if(ga.convergence() == 0 || ga.convergence() > ga.pConvergence())
val = gaFalse;
else
val = gaTrue;
}
else {
if(ga.convergence() < ga.pConvergence())
val = gaFalse;
else
val = gaTrue;
}
return val;
}
GABoolean
GAGeneticAlgorithm::TerminateUponPopConvergence(GAGeneticAlgorithm & ga){
if(ga.statistics().current(GAStatistics::Mean) /
ga.statistics().current(GAStatistics::Maximum) < ga.pConvergence())
return gaTrue;
else
return gaFalse;
}
GAParameterList&
GAGeneticAlgorithm::registerDefaultParameters(GAParameterList& p) {
p.add(gaNminimaxi, gaSNminimaxi, GAParameter::INT, &gaDefMiniMaxi);
p.add(gaNnGenerations, gaSNnGenerations, GAParameter::INT, &gaDefNumGen);
p.add(gaNnConvergence, gaSNnConvergence, GAParameter::INT, &gaDefNConv);
p.add(gaNpConvergence, gaSNpConvergence, GAParameter::FLOAT, &gaDefPConv);
p.add(gaNpCrossover, gaSNpCrossover, GAParameter::FLOAT, &gaDefPCross);
p.add(gaNpMutation, gaSNpMutation, GAParameter::FLOAT, &gaDefPMut);
p.add(gaNpopulationSize, gaSNpopulationSize,
GAParameter::INT, &gaDefPopSize);
p.add(gaNnBestGenomes, gaSNnBestGenomes,
GAParameter::INT, &gaDefNumBestGenomes);
p.add(gaNscoreFrequency, gaSNscoreFrequency,
GAParameter::INT, &gaDefScoreFrequency1);
p.add(gaNflushFrequency, gaSNflushFrequency,
GAParameter::INT, &gaDefFlushFrequency);
p.add(gaNrecordDiversity, gaSNrecordDiversity,
GAParameter::INT, &gaDefDivFlag);
p.add(gaNscoreFilename, gaSNscoreFilename,
GAParameter::STRING, gaDefScoreFilename);
p.add(gaNselectScores, gaSNselectScores,
GAParameter::INT, &gaDefSelectScores);
return p;
}
// When we create a GA, we stuff the parameters with the basics that will be
// needed by most genetic algorithms - num generations, p convergence, etc.
GAGeneticAlgorithm::GAGeneticAlgorithm(const GAGenome& g) : stats(), params() {
pop = new GAPopulation(g, gaDefPopSize);
pop->geneticAlgorithm(*this);
ud = (void *)0;
cf = GAGeneticAlgorithm::DEFAULT_TERMINATOR;
minmax = gaDefMiniMaxi;
params.add(gaNminimaxi, gaSNminimaxi, GAParameter::INT, &minmax);
ngen = gaDefNumGen;
params.add(gaNnGenerations, gaSNnGenerations, GAParameter::INT, &ngen);
nconv = gaDefNConv; stats.nConvergence(nconv);
params.add(gaNnConvergence, gaSNnConvergence, GAParameter::INT, &nconv);
pconv = gaDefPConv;
params.add(gaNpConvergence, gaSNpConvergence, GAParameter::FLOAT, &pconv);
pcross = gaDefPCross;
params.add(gaNpCrossover, gaSNpCrossover, GAParameter::FLOAT, &pcross);
pmut = gaDefPMut;
params.add(gaNpMutation, gaSNpMutation, GAParameter::FLOAT, &pmut);
int psize = pop->size();
params.add(gaNpopulationSize, gaSNpopulationSize, GAParameter::INT, &psize);
stats.scoreFrequency(gaDefScoreFrequency1);
params.add(gaNscoreFrequency, gaSNscoreFrequency,
GAParameter::INT, &gaDefScoreFrequency1);
stats.flushFrequency(gaDefFlushFrequency);
params.add(gaNflushFrequency, gaSNflushFrequency,
GAParameter::INT, &gaDefFlushFrequency);
stats.recordDiversity(gaDefDivFlag);
params.add(gaNrecordDiversity, gaSNrecordDiversity,
GAParameter::INT, &gaDefDivFlag);
stats.scoreFilename(gaDefScoreFilename);
params.add(gaNscoreFilename, gaSNscoreFilename,
GAParameter::STRING, gaDefScoreFilename);
stats.selectScores(gaDefSelectScores);
params.add(gaNselectScores, gaSNselectScores,
GAParameter::INT, &gaDefSelectScores);
stats.nBestGenomes(g, gaDefNumBestGenomes);
params.add(gaNnBestGenomes, gaSNnBestGenomes,
GAParameter::INT, &gaDefNumBestGenomes);
scross = g.sexual();
across = g.asexual();
}
GAGeneticAlgorithm::GAGeneticAlgorithm(const GAPopulation& p) :
stats(), params() {
pop = new GAPopulation(p);
pop->geneticAlgorithm(*this);
ud = (void *)0;
cf = GAGeneticAlgorithm::DEFAULT_TERMINATOR;
minmax = gaDefMiniMaxi;
params.add(gaNminimaxi, gaSNminimaxi, GAParameter::INT, &minmax);
ngen = gaDefNumGen;
params.add(gaNnGenerations, gaSNnGenerations, GAParameter::INT, &ngen);
nconv = gaDefNConv; stats.nConvergence(nconv);
params.add(gaNnConvergence, gaSNnConvergence, GAParameter::INT, &nconv);
pconv = gaDefPConv;
params.add(gaNpConvergence, gaSNpConvergence, GAParameter::FLOAT, &pconv);
pcross = gaDefPCross;
params.add(gaNpCrossover, gaSNpCrossover, GAParameter::FLOAT, &pcross);
pmut = gaDefPMut;
params.add(gaNpMutation, gaSNpMutation, GAParameter::FLOAT, &pmut);
int psize = pop->size();
params.add(gaNpopulationSize, gaSNpopulationSize, GAParameter::INT, &psize);
stats.scoreFrequency(gaDefScoreFrequency1);
params.add(gaNscoreFrequency, gaSNscoreFrequency,
GAParameter::INT, &gaDefScoreFrequency1);
stats.flushFrequency(gaDefFlushFrequency);
params.add(gaNflushFrequency, gaSNflushFrequency,
GAParameter::INT, &gaDefFlushFrequency);
stats.recordDiversity(gaDefDivFlag);
params.add(gaNrecordDiversity, gaSNrecordDiversity,
GAParameter::INT, &gaDefDivFlag);
stats.scoreFilename(gaDefScoreFilename);
params.add(gaNscoreFilename, gaSNscoreFilename,
GAParameter::STRING, gaDefScoreFilename);
stats.selectScores(gaDefSelectScores);
params.add(gaNselectScores, gaSNselectScores,
GAParameter::INT, &gaDefSelectScores);
stats.nBestGenomes(p.individual(0), gaDefNumBestGenomes);
params.add(gaNnBestGenomes, gaSNnBestGenomes,
GAParameter::INT, &gaDefNumBestGenomes);
scross = p.individual(0).sexual();
across = p.individual(0).asexual();
}
GAGeneticAlgorithm::GAGeneticAlgorithm(const GAGeneticAlgorithm& ga) :
stats(ga.stats), params(ga.params){
pop = ga.pop->clone();
pop->geneticAlgorithm(*this);
cf = ga.cf; ud = ga.ud;
ngen = ga.ngen; nconv = ga.nconv; pconv = ga.pconv;
pcross = ga.pcross; pmut = ga.pmut; minmax = ga.minmax;
scross = ga.scross; across = ga.across;
}
GAGeneticAlgorithm::~GAGeneticAlgorithm() {
delete pop;
}
void
GAGeneticAlgorithm::copy(const GAGeneticAlgorithm& ga) {
if(pop) pop->copy(*(ga.pop));
else pop = ga.pop->clone();
pop->geneticAlgorithm(*this);
stats = ga.stats;
params = ga.params;
cf = ga.cf; ud = ga.ud;
ngen = ga.ngen; nconv = ga.nconv; pconv = ga.pconv;
pcross = ga.pcross; pmut = ga.pmut; minmax = ga.minmax;
scross = ga.scross; across = ga.across;
}
const GAParameterList&
GAGeneticAlgorithm::parameters(const GAParameterList& list){
for(int i=0; i<list.size(); i++)
setptr(list[i].fullname(), list[i].value());
return params;
}
const GAParameterList&
GAGeneticAlgorithm::parameters(int& argc, char **argv, GABoolean flag){
params.parse(argc, argv, flag); // get the args we understand
for(int i=0; i<params.size(); i++)
setptr(params[i].fullname(), params[i].value());
return params;
}
#ifndef NO_STREAMS
const GAParameterList&
GAGeneticAlgorithm::parameters(const char* filename, GABoolean flag){
params.read(filename, flag);
for(int i=0; i<params.size(); i++)
setptr(params[i].fullname(), params[i].value());
return params;
}
const GAParameterList&
GAGeneticAlgorithm::parameters(istream& is, GABoolean flag){
params.read(is, flag);
for(int i=0; i<params.size(); i++)
setptr(params[i].fullname(), params[i].value());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -