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

📄 population.h

📁 标准遗传算法的源代码
💻 H
字号:
// population.h: interface for the population class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_POPULATION_H__EBC520C7_10A5_11D4_BAC1_9349EAE2243A__INCLUDED_)
#define AFX_POPULATION_H__EBC520C7_10A5_11D4_BAC1_9349EAE2243A__INCLUDED_

#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000

/////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <time.h>
#define GEN_LENGTH 16   //基因串长度
#define N_PARAMETER 1   //代表参数的个数
#define CODE_LENGTH 16   //每个参数基因编码长度
#define P_MUTATION  0.001 //变异率
#define P_MATING    0.7   //杂交率

///////////////////////////////////////////////////////
//       INDIVIDUAL POPULAION  CALSS                 //
//               个体类定义                          //
///////////////////////////////////////////////////////
class population  
{
public:
	double fitness;//适应度
	unsigned int gen_chain1[GEN_LENGTH],gen_chain2[GEN_LENGTH];//双链基因
	unsigned int decode_chain[GEN_LENGTH];//译码基因
	double x[N_PARAMETER];//参数实际值
	
public:
	population();
	void initial(void);//个体初始化函数
	void fitness_function(void);//适应度函数
	void decode(void);//译码函数
	virtual ~population();
	
};

population::population()
{
}
/********************************************************/
/*                POPULATION INITIAL                    */
/*                个体初始化函数                        */
/*********************************************************/
void population::initial(void){
	int i;
	unsigned int k;
	for(i=0;i<GEN_LENGTH;i++){  
		if((rand()*2/RAND_MAX)>=1) k=1;
		else k=0; 
		gen_chain1[i]=k;	
	}	
	for(i=0;i<GEN_LENGTH;i++){  
		if((rand()*2/RAND_MAX)>=1) k=1;
		else k=0; 
		gen_chain2[i]=k;
	}
	return;	
}

/********************************************************/
/*                  GENE DECODE                         */
/*                  基因译码函数                        */
/*********************************************************/
/*
比如两条基因分别为  10001000 00001000 ,然后做异或操作,同则为0,不同则为1,
则上式解码出来应该是127。 
这是一个解码操作,两条基因异或出来就是参数的实际值。
上式然后再除255,就是真实的参数值,既是0.48. 
*/
void population::decode(){ 
	long sum1,sum2,sum_all;
	int i,j,begin_l,end_l; 
	for(j=0;j<N_PARAMETER;j++) {  
		sum2=1;sum1=0;sum_all=0;
		begin_l=j*CODE_LENGTH;end_l=(j+1)*CODE_LENGTH;
		for(i=begin_l;i<end_l;i++){
			if(gen_chain1[i]==gen_chain2[i]) {
				decode_chain[i]=0; sum1=sum1;
			}
			if(gen_chain1[i]!=gen_chain2[i]){
				decode_chain[i]=1;sum1=sum1+sum2;
			}
		    sum_all=sum_all+sum2;
	        sum2=sum2*2;
		}
		 x[j]=(double)((double)sum1/(double)sum_all);
	}
	return;
}

/********************************************************/
/*                FITNESS FUNCATION                     */
/*                    适应度函数                        */
/*********************************************************/
void population::fitness_function(){
	decode();
	fitness=x[0]*x[0];
	return;
}



population::~population()
{
	
}

///////////////////////////////////
//   WAREHOUSE CLASS DEFINE      //
//   优良基因仓库类定义          //
////////////////////////////////////


class warehouse
{
public:
	double average_fitness;//优良基因平均适应度
	int warehouse_size;//基因库个体总数
	int now_size;//基因库现在库存量
	population *pop;//优良个体基因
	
	warehouse();
	void initial(int size1);//基因库初始化函数
	int add_individual(population pop1);//基因库内增加个体函数
	void statistic(void);//基因库内统计函数
	~warehouse();
};

warehouse::warehouse(){
	now_size=0;warehouse_size=0;
}
/********************************************************/
/*                WAREHOUSE  INITIAL                    */
/*                基因库初始化函数                        */
/*********************************************************/
void warehouse::initial(int size1){
	warehouse_size=size1;
	pop=(population *)malloc(sizeof(population)*size1);
	if(pop==NULL)   {cout<<"内存分配失败!"<<endl;exit(0);}
	return;
}
/********************************************************/
/*               STATISTIC FUCATION                     */
/*                基因库统计函数                        */
/*********************************************************/
void warehouse::statistic(){
	int i;
	double sum1;
	sum1=0.0;
	if(now_size!=0){   
		for(i=0;i<now_size;i++)	sum1=sum1+pop[i].fitness;
		average_fitness=sum1/(double)now_size;		
	}
	else
		average_fitness=0.0;
	return;
}
/********************************************************/
/*                ADD INDIVIDUAL                        */
/*                基因库增加基因函数                    */
/*********************************************************/
int warehouse::add_individual(population pop1){ 
	int i;
	if(now_size<warehouse_size){
		pop[now_size]=pop1;
		now_size++;
	}else{
		for(i=0;i<warehouse_size;i++){
			if(pop1.fitness>pop[i].fitness) pop[i]=pop1;
		}
	}
	return(1);
}



warehouse::~warehouse()
{
	
}
///////////////////////////////////////////////////////
//                 MATING POOL CLASS                 //
//                 交配池类定义                      //
///////////////////////////////////////////////////////
class mating_pool
{
public:
	int				pool_size;					//交配池中个体总数nnnnnnnnn
	population		*parent_pop,*filial_pop;	//父代个体,子代个体
	double			sumfitness;					//交配池中个体适应度总和
	long int		n_mating,n_mutation;		//交配池中个体交配、变异次数统计
	double			max_fitness;				//最大适应度
	double			average_fitness;			//平均适应度
	int				max_location;				//最大适应度个体位置
	warehouse		gene_base;					//优良基因仓库

	mating_pool();
	void			initial(int pop_size);		//初始化交配池函数
	void			statistic();				//交配池中个体统计函数
	int				selection();				//交配池中个体选择函数
	int				flip(double probability);	//FLIP实验函数
	int				mutation(unsigned int loca);//变异函数
    int				mating(unsigned int *parent1_chain1,unsigned int *parent1_chain2,
	unsigned int	*parent2_chain1,unsigned int *parent2_chain2,int k5);//交配函数
	void			generation(void);			 //代进化函数
	void			next_generation(void);		 //父代、子代一致函数
	void			report_generation(void);	 //一代个体报告函数
	void			initial_gene_base(int size1);//优良基因库初始化函数
	void			retain_good_gene(void);		 //优良基因保存函数
	void			recall_good_gene(int size1); //优良基因输出函数
	~mating_pool();
};

mating_pool::mating_pool(){
	n_mutation=0;n_mating=0;
	sumfitness=0.0;max_fitness=0.0;max_location=0;
}

/********************************************************/
/*                MATING POOL INITIAL                   */
/*                交配池初始化函数                      */
/*********************************************************/
void mating_pool::initial(int pop_size){
	int  i;
	pool_size=pop_size;
	parent_pop=(population *)malloc(sizeof(population)*pool_size);
	if(parent_pop==NULL) {
		cout<<"内存空间分配失败!"<<endl;exit(0);
	}
	filial_pop=(population *)malloc(sizeof(population)*pool_size);
	if(filial_pop==NULL) {
		cout<<"内存空间分配失败!"<<endl;
		exit(0);
	}
	for(i=0;i<pool_size;i++){
		parent_pop[i].initial();
		parent_pop[i].fitness_function();
		filial_pop[i]=parent_pop[i];
	}
	return;
}
/********************************************************/
/*                STATISTIC FUNCTION                   */
/*                交配池统计函数                        */
/*********************************************************/
void mating_pool::statistic(){
	int i,max_l;
	double sum1,max_f;
	sum1=0.0;max_f=0.0;max_l=0;
	for(i=0;i<pool_size;i++){
		sum1=sum1+parent_pop[i].fitness;
		if(parent_pop[i].fitness>max_f) {
			max_f=parent_pop[i].fitness;
			max_l=i;
		} 
	}
	sumfitness=sum1;max_fitness=max_f;max_location=max_l;
	average_fitness=sumfitness/pool_size;
	return;
}
/********************************************************/
/*                SELECTION FUNCTION                   */
/*                  个体选择函数                        */
/*********************************************************/
int mating_pool::selection(){ 
	double rand1,partsum;
	int j;
	partsum=0.0;j=0;
	rand1=(double)rand()/(double)RAND_MAX;
	rand1=rand1*sumfitness;
	while((partsum<rand1)&&(j<pool_size)){ 
		partsum=partsum+parent_pop[j].fitness;j++;
	}
	return(j);
}
///////////////////////////////////////////////////////
//               FLIP FUNCTION                      //
//               FLIP 实验函数                       //
///////////////////////////////////////////////////////

int mating_pool::flip(double probability){   
	double probability_f;     
// srand((unsigned)time(NULL));
	probability_f=(double)rand()/(double)(RAND_MAX);
	if ( probability_f<=probability) return(1);
	else return(0);
}
///////////////////////////////////////////////////////
//               MUTATION FUNCTION                  //
//                     变异函数                      //
///////////////////////////////////////////////////////
int mating_pool::mutation(unsigned int loca){   
	int mutate;
	mutate=flip(P_MUTATION);
	if(mutate==1){   
		n_mutation=n_mutation+1;
		if(loca==1) loca=0;
		else loca=1;
	}
	if(loca==1) return(1);
	else return(0);
}

///////////////////////////////////////////////////////
//                 MATING FUNCTION                  //
//                     杂交函数                      //
///////////////////////////////////////////////////////

int mating_pool::mating(unsigned int *parent1_chain1,unsigned int *parent1_chain2,
						unsigned int *parent2_chain1,unsigned int *parent2_chain2,
						int k5){  
	int j;
	if(flip(P_MATING)==1){  
		n_mating=n_mating+1;
		for(j=0;j<GEN_LENGTH;j++){
			filial_pop[k5].gen_chain1[j]=mutation(parent1_chain1[j]);
			filial_pop[k5].gen_chain2[j]=mutation(parent2_chain2[j]);
			filial_pop[k5+1].gen_chain1[j]=mutation(parent2_chain1[j]);
			filial_pop[k5+1].gen_chain2[j]=mutation(parent1_chain2[j]);
		}
	}else{
		for(j=0;j<GEN_LENGTH;j++){  
			filial_pop[k5].gen_chain1[j]=mutation(parent1_chain1[j]);
			filial_pop[k5].gen_chain2[j]=mutation(parent1_chain2[j]);
			filial_pop[k5+1].gen_chain1[j]=mutation(parent2_chain1[j]);
			filial_pop[k5+1].gen_chain2[j]=mutation(parent2_chain2[j]);
		}
	}
	return(1);
}
/********************************************************/
/*                GENERATION FUNCTION                   */
/*                  子代产生函数                        */
/*********************************************************/
void mating_pool::generation(void){  
	unsigned int mate1,mate2;
	int j;
	j=0;
	while(j<pool_size){  
		mate1=selection();mate2=selection();
		mating(parent_pop[mate1].gen_chain1,parent_pop[mate1].gen_chain2,
			   parent_pop[mate2].gen_chain1,parent_pop[mate2].gen_chain2,j);
		filial_pop[j].fitness_function();
		filial_pop[j+1].fitness_function();
		j=j+2;
	}
	return;
}

/********************************************************/
/*                NEXT GENERATION                       */
/*      下一代子代产生的准备函数:父代、子代一致函数    */
/********************************************************/
void mating_pool::next_generation(){
	int i;
	for(i=0;i<pool_size;i++) parent_pop[i]=filial_pop[i];
	return;
}


void mating_pool::report_generation(void){
	int i;
	cout<<"gen   chain1:  ";
	for(i=GEN_LENGTH-1;i>=0;i--)
		cout<<parent_pop[max_location].gen_chain1[i];
	cout<<endl;
	
	cout<<"gen   chain2:  ";
	for(i=GEN_LENGTH-1;i>=0;i--)
		cout<<parent_pop[max_location].gen_chain2[i];
	cout<<endl;
    
	cout<<"decode chain:  ";
	for(i=GEN_LENGTH-1;i>=0;i--)
		cout<<parent_pop[max_location].decode_chain[i];
	cout<<endl;
	
	cout<<"Parameters Are:"<<endl;
	for(i=N_PARAMETER-1;i>=0;i--)
		cout<<"x["<<i<<"]="<<parent_pop[max_location].x[i]<<endl;
	cout<<"Max Population Location Is:  "<<max_location<<endl;
    cout<<"Max Fitness="<<parent_pop[max_location].fitness<<endl;
	cout<<"Max Fitness="<<max_fitness<<endl;
	cout<<"Average Fitness= "<<average_fitness<<endl;
	return;	
}
/********************************************************/
/*                INITIAL WAREHOUSE                     */
/*                基因仓库初始化函数                    */
/********************************************************/
void  mating_pool::initial_gene_base(int size1){
	gene_base.initial(size1);
	return;
}
/********************************************************/
/*                RETAIN GOOD GENE                      */
/*                优良基因保存函数                      */
/*********************************************************/
void mating_pool::retain_good_gene(void){
	int i;
	gene_base.add_individual(parent_pop[max_location]);
	for(i=0;i<pool_size;i++){
		if(parent_pop[i].fitness>average_fitness)
			gene_base.add_individual(parent_pop[i]);
	}
    return;	
}
/********************************************************/
/*                RECALL GOOD GENE                      */
/*                优良基因输出函数                      */
/*********************************************************/
void  mating_pool::recall_good_gene(int size1){
	int i,j;
	j=0;
	for(i=0;i<pool_size;i++){
		if(parent_pop[i].fitness<gene_base.pop[j].fitness){ 
			parent_pop[i]=gene_base.pop[i];
			j++;
		}
		if(j>=size1) break;
	}
	return;
}

mating_pool::~mating_pool()
{
	
}

#endif // !defined(AFX_POPULATION_H__EBC520C7_10A5_11D4_BAC1_9349EAE2243A__INCLUDED_)

⌨️ 快捷键说明

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