⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selector.cpp

📁 基于MATLAB完成的神经网络源程序 大家
💻 CPP
字号:
// 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

// Generic SELECTOR object for GA use

#include "pch.h"
#pragma hdrstop
#include "selector.h"

// *********************** CSelector Object methods **********************


CSelector::CSelector(int m,int s)
{
	method = m;
	maxratio=100;
	size=s;
	pop= new FitPair[s];
	scalescore= new float[s];
	reset();
};

void CSelector::add(float score,FHANDLE h) {                                    // add an individual
	pop[icount].rawscore=score;
	pop[icount].handle=h;
	rawsum+=score;
	if (icount!=0) {
		pmin = (pop[pmin].rawscore < score? pmin : icount);
		pmax = (pop[pmax].rawscore > score? pmax : icount);
	}
	icount++;
}

void CSelector::sort()                  // sort in score order, ascending
{
	int i,j,mn;
	float tempscore;
    FHANDLE temph;

	for (i=0;i<icount;i++)
	{       mn=i;
		for (j=i+1;j<icount;j++)
		{
			if (pop[j].rawscore < pop[mn].rawscore)
				mn=j;
		}
		tempscore=pop[i].rawscore;
		temph=pop[i].handle;
		pop[i].rawscore=pop[mn].rawscore;
		pop[i].handle=pop[mn].handle;
		pop[mn].rawscore=tempscore;
	pop[mn].handle=temph;
	}       
}

FHANDLE CSelector::roulette() { // scale and do selection on scaled scores
	int i,omin,winner;
	float slot,wedge,slope;
	if (!didscale) {
					// scale, according to method
			switch(method) {
			case EStraight:
				for (i=0;i<icount;i++) scalescore[i]=POSVAL(pop[i].rawscore);
				break;
			case ERank:
				sort();
				slope=(icount - 1 != 0? (maxratio-1)/(icount-1):0);
		// put in a score by rank
				for (i=0;i<icount;i++) scalescore[i]=1+slope*i;
				break;
			case EMinToMax:
				slope=(vmax()-vmin()!=0?(maxratio-1)/(vmax()-vmin()):0);
				for (i=0;i<icount;i++) scalescore[i]=1+slope*(pop[i].rawscore-vmin());
				break;
			case EAveToMax:
				slope=(vmax()-average()!=0? (maxratio-1)/(vmax()-average()): 0);
				for (i=0;i<icount;i++) {
					slot=1+slope*(pop[i].rawscore-average());
					scalescore[i]= slot>0? slot:.01;
				}
				break;
			}

		scalesum=0;
		for (i=0;i<icount;i++) scalesum+=scalescore[i];
		didscale=TRUE;
	}
	if (method!=ETournament)
    {
		slot=scalesum*rand_0to1();
		wedge=scalescore[0];
		winner=0;
		for (i=1;slot>=wedge && i<icount;i++) {
			winner++;
			wedge+=scalescore[i];
		}
	}
	else
	{                                       // ETOURNAMENT - return best of out of maxratio
		winner=rnd(icount);
		for (i=1;i<maxratio;i++)
		{
		omin=rnd(icount);
			if (pop[omin].rawscore > pop[winner].rawscore)
				winner=omin;
	}
	}       
	return pop[winner].handle;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -