📄 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.GABooleanGAGeneticAlgorithm::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;}voidGAGeneticAlgorithm::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_STREAMSconst 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 + -