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

📄 population.cpp

📁 - XCS for Dynamic Environments + Continuous versions of XCS + Test problem: real multiplexer +
💻 CPP
字号:
/*	XCSR_DE1.0
*	--------------------------------------------------------
*	Learning classifier system based on accuracy in dynamic environments
*
*	by  Huong Hai (Helen) Dam
*	z3140959@itee.adfa.edu.au
*	UNSW @ ADFA, Canberra Australia
*	Artificial Life and Adaptive Robotics Laboratory
*	http://www.itee.adfa.edu.au/~alar
*
*	Last modified: 24-11-2005
*
*/
#include "population.h"
#include <math.h>

Population::Population(int seed)
{	
	random = new Random(); 
	random->setSeed(seed);
	num_new_rules = 0;
	num_delete_rules = 0;
}
Population::~Population()
{
	int size = c_classifiers.size();
	for(int i = 0; i < size; i++)
		delete c_classifiers[i];
	c_classifiers.clear();
}

int Population::getPopSize()
{
	int my_size=0;
	for(int i = 0; i < c_classifiers.size(); i++)
		my_size += c_classifiers[i]->getNum();
	
	return my_size;
}

void Population::addClassifier(Classifier *c){
	c->validateClassifier();
	c_classifiers.push_back(c);
	num_new_rules ++;
}

Classifier* Population::getClassifierC(int i){
	
	return c_classifiers[i];
}

int Population::getClassifierP(Classifier *c){
	int pos = -1;
	
	int size = c_classifiers.size();
	for(int i = 0; i  < size; i++)
	{
		if(c_classifiers[i]->matchClassifier(c))
		{
			pos = i;
			break;
		}
	}
	return pos;
}

void Population::deleteClassifier(int i)
{
	int schema = c_classifiers[i]->getSchema();
	delete c_classifiers[i];
	c_classifiers.erase (c_classifiers.begin() + i);
	num_delete_rules ++;
}
void Population::emptyPopulation()
{
	int size = c_classifiers.size();
	for(int i = size-1; i >= 0; i--)
		deleteClassifier(i);
}
void Population::deletePartialPopulation(double proportion)
{
	int size = c_classifiers.size();
	for(int i = size -1; i >= 0; i--)
	{
		if(random->nextDouble()<proportion)
			deleteClassifier(i);
	}
}
void Population::reinitParam()
{
	int size = c_classifiers.size();
	for(int i = size -1; i >= 0; i --)
		c_classifiers[i]->resetParam();
}
void Population::deleteFromPopulation()
{
	int i;
	int check = FALSE;
	
	double meanf = 0.0;
	int total = 0;
	
	int num_classifier = getNumMacro();
	for(i = 0; i < num_classifier; i++)
	{
		Classifier *tempc = getClassifierC(i);
		meanf += tempc->getFitness();
		total += tempc->getNum();
	}
	if(total != 0)
	{
		meanf = meanf/(double)total;
	}
	else
	{
		meanf = 0.0;
	}
	double voteSum = 0.0;
	//Get delete proportion , which depend on the average fitness
	for(i = 0; i < num_classifier; i++)
	{
		voteSum += (double)getClassifierC(i)->getNum() * deleteVote(getClassifierC(i), meanf);
	}
	double choicePoint = (double)random->nextDouble() * voteSum;
	voteSum = 0.0;
	for (i = 0; i < num_classifier; i++)
	{
		voteSum += getClassifierC(i)->getNum() * deleteVote(getClassifierC(i), meanf);
		if(voteSum > choicePoint)
		{
			if(getClassifierC(i)->getNum() > 1){
				getClassifierC(i)->decreaseNum();
			}
			else{
				deleteClassifier(i);
			}
			break;
		}
		
	}
}
//Using the deletion vote which realizes niching as well as removal of 
//the lowest fitness classifiers
double Population::deleteVote(Classifier *cl, double avgFitInPop)
{
	//double vote = cl->getAS() * cl->getNum();
	double vote = 1.0;
	if((cl->getExp() >= THETADEL) && (cl->getFitness()/cl->getNum() < DELTA *avgFitInPop))	
		vote = vote * avgFitInPop/(cl->getFitness()/(double)cl->getNum());
	return vote;
}

int Population::getNumNewRules()
{
	int num = num_new_rules;
	num_new_rules = 0;
	return num;
}
int Population::getNumDeleteRules()
{
	int num = num_delete_rules;
	num_delete_rules = 0;
	return num;
}

void Population::snapshotReport(ofstream &resultfile)
{
	int nclassifiers = c_classifiers.size();
	//resultfile<<"No.  Fitness      Prediction      Prediction Error     Condition   Action  Number"<<endl;
	
	for(int i = 0; i <  nclassifiers ; i++)
	{
		Classifier *temp = getClassifierC(i);
		for(int j=0; j < COND_OFFSET; j++)
		{
			resultfile<<temp->getIntervalMin(j)<<"\t";
			resultfile<<temp->getIntervalMax(j)<<"|";
		}
		resultfile<<temp->getAction()<<"\t";
		resultfile<<temp->getPrediction()<<"\t";
		resultfile<<temp->getPredictionError()<<"\t";
		resultfile<<temp->getFitness()<<"\t";
		resultfile<<temp->getNum()<<"\t";
		resultfile<<temp->getExp();
		resultfile<<endl;
	}
	
}
//Return order and length of the schema in the population
int** Population::getBBData()
{
	int **bb_inf = new int *[COND_OFFSET+1];
	int psize = getNumMacro();
	int order, length;
	int i,j;
	for(i = 0; i < COND_OFFSET+1; i++)
		bb_inf[i]= new int[COND_OFFSET];
	for(i = 0; i < COND_OFFSET+1; i++)
	{
		for(j = 0; j < COND_OFFSET; j++)
		{
			bb_inf[i][j] = 0;
		}
	}
	for(int i = 0; i  < psize; i++)
	{
		order = getClassifierC(i)->getSchemaOrder();
		length = getClassifierC(i)->getSchemaLength();
		bb_inf[order][length] ++;
	}
	return bb_inf;
}
#ifdef MP
//The first two array elements are the macro number and numericity of classifiers, which the condition is a schema id and having a correct action. The last two array elements are number and numericity of classifiers with incorrect action.
double* Population::getNumSchemas(double threshold, int id)
{
	int popsize = getNumMacro();
	double *num_schema = new double[4];
	int i;
	for(i = 0; i < 4; i++)
	{
		num_schema[i] = 0.;
	}
	for(i = 0; i < popsize; i++)
	{
		if(getClassifierC(i)->isASchema(threshold, id))
		{
			getClassifierC(i)->setSchema(id);
			if((id%2 == 0 && getClassifierC(i)->getAction() == 0)||//Schema 0,2,4,6 has 0 as a corrected class
				(id%2 == 1 && getClassifierC(i)->getAction() == 1))//Schema 1,3,5,7 has 1 as a corrected class
			{
				num_schema[0]+=getClassifierC(i)->getFitness()*
					getClassifierC(i)->getPrediction();
				num_schema[1]+=getClassifierC(i)->getNum();
			}
			else
			{
				num_schema[2]+=getClassifierC(i)->getFitness()*
					getClassifierC(i)->getPrediction();
				num_schema[3]+= getClassifierC(i)->getNum();
			}
		}
	}
	return num_schema;
}
double* Population::getNumClassifiersInSchema(double threshold, int id)
{
	int popsize = getNumMacro();
	double *num_classifiers = new double[4];
	int i;
	for(int i = 0; i < 4; i++)
	{
		num_classifiers[i] = 0.;
	}
	for(i = 0; i < popsize; i++)
	{
		if(getClassifierC(i)->belongToSchema(threshold, id))
		{
			if((id%2 == 0 && getClassifierC(i)->getAction() == 0)||//Schema 0,2,4,6 has 0 as a corrected class
				(id%2 == 1 && getClassifierC(i)->getAction() == 1))//Schema 1,3,5,7 has 1 as a corrected class
			{
				num_classifiers[0]+=getClassifierC(i)->getFitness()* 
					getClassifierC(i)->getPrediction();
				num_classifiers[1]+=getClassifierC(i)->getNum();
			}
			else
			{
				num_classifiers[2]+=getClassifierC(i)->getFitness()*
					getClassifierC(i)->getPrediction();
				num_classifiers[3]+= getClassifierC(i)->getNum();
			}
		}
	}
	
	return num_classifiers;
}
#endif
int* Population::getNumMacroInRegion()
{
	int *num = new int[5] ;
	for (int j = 0; j < 5; j++)
		num[j] = 0;
	int popsize = getNumMacro();
	for(int i = 0; i < popsize; i++)
	{
		
		for(int j = 0; j < COND_OFFSET; j++)
		{
			double max = c_classifiers[i]->getIntervalMax(j);
			double min = c_classifiers[i]->getIntervalMin(j);
			if(min  > LOWER_BOUND && max < UPPER_BOUND)
				num[1]++;
			else if(min <= LOWER_BOUND && max >= UPPER_BOUND)
				num[4]++;
			else	if(min > LOWER_BOUND && max >= UPPER_BOUND)
			{
				num[3]++;
			}
			else if(min <= LOWER_BOUND && max < UPPER_BOUND)
			{
				num[2]++;
			}
			else
				cout<<"Strange interval:"<<min<<", "<<max<<endl;
			
		}
		
	}
	return num;
}

⌨️ 快捷键说明

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