本文整理汇总了C++中GAPopulation::order方法的典型用法代码示例。如果您正苦于以下问题:C++ GAPopulation::order方法的具体用法?C++ GAPopulation::order怎么用?C++ GAPopulation::order使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类GAPopulation
的用法示例。
在下文中一共展示了GAPopulation::order方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: while
// Update the genomes in the 'best of all' population to reflect any
// changes made to the current population. We just grab the genomes with
// the highest scores from the current population, and if they are higher than
// those of the genomes in the boa population, they get copied. Note that
// the bigger the boa array, the bigger your running performance hit because
// we have to look through all of the boa to figure out which are better than
// those in the population. The fastest way to use the boa is to keep only
// one genome in the boa population. A flag of 'True' will reset the boa
// population so that it is filled with the best of the current population.
// Unfortunately it could take a long time to update the boa array using the
// copy method. We'd like to simply keep pointers to the best genomes, but
// the genomes change from generation to generation, so we can't depend on
// that.
// Notice that keeping boa is useful even for overlapping populations. The
// boa keeps individuals that are different from each other - the overlapping
// population may not. However, keeping boa is most useful for populations
// with little overlap.
// When we check to see if a potentially better member is already in our
// best-of-all population, we use the operator== comparator not the genome
// comparator to do the comparison.
void
GAStatistics::
updateBestIndividual(const GAPopulation & pop, GABoolean flag){
if(boa == (GAPopulation *)0 || boa->size() == 0) return; // do nothing
if(pop.order() != boa->order()) boa->order(pop.order());
if(flag == gaTrue){ // reset the BOA array
int j=0;
for(int i=0; i<boa->size(); i++){
boa->best(i).copy(pop.best(j));
if(j < pop.size()-1) j++;
}
return;
}
if(boa->size() == 1){ // there's only one boa so replace it with bop
if(boa->order() == GAPopulation::HIGH_IS_BEST &&
pop.best().score() > boa->best().score())
boa->best().copy(pop.best());
if(boa->order() == GAPopulation::LOW_IS_BEST &&
pop.best().score() < boa->best().score())
boa->best().copy(pop.best());
}
else{
int i=0, j, k;
if(boa->order() == GAPopulation::HIGH_IS_BEST) {
while(i < pop.size() && pop.best(i).score() > boa->worst().score()){
for(k=0;
pop.best(i).score() < boa->best(k).score() && k < boa->size();
k++);
for(j=k; j<boa->size(); j++){
if(pop.best(i) == boa->best(j)) break;
if(pop.best(i).score() > boa->best(j).score()){
boa->worst().copy(pop.best(i)); // replace worst individual
boa->sort(gaTrue, GAPopulation::RAW); // re-sort the population
break;
}
}
i++;
}
}
if(boa->order() == GAPopulation::LOW_IS_BEST) {
while(i < pop.size() && pop.best(i).score() < boa->worst().score()){
for(k=0;
pop.best(i).score() > boa->best(k).score() && k < boa->size();
k++);
for(j=k; j<boa->size(); j++){
if(pop.best(i) == boa->best(j)) break;
if(pop.best(i).score() < boa->best(j).score()){
boa->worst().copy(pop.best(i)); // replace worst individual
boa->sort(gaTrue, GAPopulation::RAW); // re-sort the population
break;
}
}
i++;
}
}
}
return;
}
示例2:
// This is an implementation of speciation using the sharing method described
// by goldberg in his book. This requires a user-defined distance function in
// order to work. The distance function returns a value between
// 0 and 1 inclusive to tell us how similar two genomes are to each other.
// A value of 0 means that the two genomes are identical to each other, a
// value of 1 means they are completely different.
// A single genome is identical to itself, so d(i,i) is 0.
// If alpha is 1 then we don't use pow().
// If we have a comparator to use, use it. If not, use the comparator of
// each genome.
// We can cut in half the number of calls to the sharing function by keeping
// one half of the ixj matrix. This is because d(i,j) is the same as d(j,i).
// We cache the distances in an upper right triangular matrix stored as a
// series of floats.
// If the population is maximizing then we derate by dividing. If the
// population is minimizing then we derate by multiplying. First we check to
// see if there is a GA using the population. If there is, we use its min/max
// flag to determine whether or not we should be minimizing or maximizing. If
// there is not GA with the population, then we use the population's sort order
// as the basis for whether to minimize or maximize.
// *** This could be done with n*n/2 instead of n*n, to reduce storage, but we
// can't reduce computation any more...
// *** probably should use the diversity built-in to the population...
void
GASharing::evaluate(const GAPopulation& p) {
if(p.size() > (int)N){
delete [] d;
N = p.size();
d = new float[N*N];
}
int n = p.size();
int i, j;
if(df) {
for(i=0; i<n; i++){ // calculate and cache the distances
d[i*n+i] = 0.0; // each genome is same as itself
for(j=i+1; j<n; j++)
d[i*n+j] = d[j*n+i] = (*df)(p.individual(i), p.individual(j));
}
}
else {
for(i=0; i<n; i++){ // calculate and cache the distances
d[i*n+i] = 0.0; // each genome is same as itself
for(j=i+1; j<n; j++)
d[i*n+j] = d[j*n+i] = p.individual(i).compare(p.individual(j));
}
}
int mm;
if(_minmax == 0) {
if(p.geneticAlgorithm())
mm = p.geneticAlgorithm()->minimaxi();
else
mm = ((p.order() == GAPopulation::HIGH_IS_BEST) ?
GAGeneticAlgorithm::MAXIMIZE : GAGeneticAlgorithm::MINIMIZE);
}
else {
mm = _minmax;
}
for(i=0; i<n; i++){ // now derate the fitness of each genome
double sum = 0.0;
for(j=0; j<n; j++) {
if(d[i*n+j] < _sigma) {
if(_alpha == 1)
sum += ((d[i*n+j] >= _sigma) ? 0.0 : 1.0 - d[i*n+j]/_sigma);
else
sum += ((d[i*n+j]>=_sigma) ? 0.0 : 1.0-pow(d[i*n+j]/_sigma,_alpha));
}
}
double f;
if(mm == GAGeneticAlgorithm::MINIMIZE)
f = p.individual(i).score() * sum;
else
f = p.individual(i).score() / sum;
p.individual(i).fitness((float)f); // might lose information here!
}
}
示例3: setConvergence
// Use this method to update the statistics to account for the current
// population. This routine increments the generation counter and assumes that
// the population that gets passed is the current population.
// If we are supposed to flush the scores, then we dump them to the specified
// file. If no flushing frequency has been specified then we don't record.
void
GAStatistics::update(const GAPopulation & pop){
++curgen; // must do this first so no divide-by-zero
if(scoreFreq > 0 && (curgen % scoreFreq == 0)) setScore(pop);
if(Nscrs > 0 && nscrs >= Nscrs) flushScores();
maxever = (pop.max() > maxever) ? pop.max() : maxever;
minever = (pop.min() < minever) ? pop.min() : minever;
float tmpval;
tmpval = (on*(curgen-1) + pop.ave()) / curgen;
on = tmpval;
tmpval = (offmax*(curgen-1) + pop.max()) / curgen;
offmax = tmpval;
tmpval = (offmin*(curgen-1) + pop.min()) / curgen;
offmin = tmpval;
setConvergence((pop.order() == GAPopulation::HIGH_IS_BEST) ?
pop.max() : pop.min());
updateBestIndividual(pop);
numpeval = pop.nevals();
}
示例4: memset
// Reset the GA's statistics based on the population. To do this right you
// should initialize the population before you pass it to this routine. If you
// don't, the stats will be based on a non-initialized population.
void
GAStatistics::reset(const GAPopulation & pop){
curgen = 0;
numsel = numcro = nummut = numrep = numeval = numpeval = 0;
memset(gen, 0, Nscrs*sizeof(int));
memset(aveScore, 0, Nscrs*sizeof(float));
memset(maxScore, 0, Nscrs*sizeof(float));
memset(minScore, 0, Nscrs*sizeof(float));
memset(devScore, 0, Nscrs*sizeof(float));
memset(divScore, 0, Nscrs*sizeof(float));
nscrs = 0;
setScore(pop);
if(Nscrs > 0) flushScores();
memset(cscore, 0, Nconv*sizeof(float));
nconv = 0; // should set to -1 then call setConv
cscore[0] =
((pop.order() == GAPopulation::HIGH_IS_BEST) ? pop.max() : pop.min());
// cscore[0] = pop.max();
// setConvergence(maxScore[0]);
updateBestIndividual(pop, gaTrue);
aveCur = aveInit = pop.ave();
maxCur = maxInit = maxever = pop.max();
minCur = minInit = minever = pop.min();
devCur = devInit = pop.dev();
divCur = divInit = ((dodiv == gaTrue) ? pop.div() : (float)-1.0);
on = pop.ave();
offmax = pop.max();
offmin = pop.min();
numpeval = pop.nevals();
for(int i=0; i<pop.size(); i++)
numeval += pop.individual(i).nevals();
}