📄 selector.h
字号:
// Copyright Andy Singleton, 1993,1994
// This code is released for non-commercial use only
// For questions or upgrades contact:
// Andy Singleton, Creation Mechanics Inc.
// PO Box 248, Peterborough, NH 03458
// Internet: p00396@psilink.com
// Compuserve 73313,757
// Phone: (603) 563-7757
/////////////////////////////////////////////////////////////////////
// SELECTOR.H Generic selector for GA use
//
// SELECTOR OBJECT - selects individuals by scaled scores
// also provides statistics
// also sorts
// To use:
// CSelector CSelectorOb(size,scaling_method, ratio_of_max_to_min)
// CSelectorOb.reset()
// CSelector.sort()
// For each individual in selection window
// CSelectorOb.add(fitness_score, individual_number)
// Selected_individual = CSelectorOb.roulette()
/////////////////////////////////////////////////////////////////////
#ifndef _SELECTOR_H
#define _SELECTOR_H
#define FHANDLE int // individual handle. Could be int or pointer
class FitPair {
public:
float rawscore; // Fitness Score
FHANDLE handle; // Individual handle
};
#define IMAX 200 // maximum number of individuals to score
enum {EStraight,ERank,EMinToMax,EAveToMax,ETournament};
// EStraight - scaled fitness = raw score if >0, exp(raw score) if <0. Weak on negatives
// ERank - Scaled fitness according to rank = 1+(maxratio-1)*rank/(icount-1)
// EMinToMax - Scaled fitness line from min to max = 1+((maxratio-1)/(max-min))*(raw_score-min)
// EAveToMax - Scaled fitness line from ave to max. Cutoff negative values at .01
// ETournament - tournament fitness. Return the best.
// return positive fitness from +- value
//#define POSVAL(v) (v>0? 1+v : exp(v))
#define POSVAL(v) (v>0? v : 0)
class CSelector { // Class to score fitness and select individuals
FitPair* pop; // population so far
float* scalescore; // scaled scores
int size; // max number of pairs to insert
int didscale; // flag whether we scaled already
int icount; // count of individuals in array
int method; // scaling method, enumerated above
int pmin; // population minimum (number of individual)
int pmax; // population maximum (number of individual)
float rawsum; // population sum (raw)
float scalesum; // population sum (scaled)
float maxratio; // ratio of max to ave or min
public:
CSelector(int m = EStraight,int s=IMAX); // scaling method, size
~CSelector() {delete[] pop;delete[] scalescore;};
void reset() {icount = 0;pmin=0;pmax=0;rawsum=0;didscale=0;};
void add(float score,FHANDLE h); // add an individual
FHANDLE roulette(); // roulette wheel selection on scaled scores
float average() {return icount>0? rawsum/icount:0;};
float vmin() {return pop[pmin].rawscore;}; // minimum value
FHANDLE imin() {return pop[pmin].handle;}; // minimum individual
float vmax() {return pop[pmax].rawscore;};
FHANDLE imax() {return pop[pmax].handle;};
void sort(); // sort in score order
FHANDLE GetHandle(int i) {return pop[i].handle;};
int count() {return icount;};
};
#endif
/////////////////////////////////////////////////////////////////////
// EOF SELECTOR.H
/////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -