?? population.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 8 //基因串長度
#define N_PARAMETER 1 //代表參數的個數
#define CODE_LENGTH 8 //每個參數基因編碼長度
#define P_MUTATION 0.001 //變異率
#define P_MATING 0.5 //雜交率
///////////////////////////////////////////////////////
// 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 */
/* 基因譯碼函數 */
/*********************************************************/
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;//交配池中個體總數
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 + -