- 积分
- 0
- 注册时间
- 2009-9-21
- 仿真币
-
- 最后登录
- 1970-1-1
|
这是《遗传算法原理及应用》(周明 孙树栋)中的程序,我进行了一些改动,希望大家有用
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define PopSize 400 //种群数量
#define CHROMLENGTH 20 //染色体长度
#define Pc 0.9 //交叉概率
#define Pm 0.01 //变异概率
struct individual //种群个体结构
{
int chrom[CHROMLENGTH]; //染色体编码
double x1,x2; //解码后的变量
double value; //目标函数值
double fitness; //个体适应度
};
struct individual population[PopSize]; //种群
struct individual SoFaBest; //用于保留最优个体
int best_Index,worst_Index;
void GenerateInitialPopulation(); //生成初始种群函数
void Decode(); //解码函数
void VALUE();
void fitness();
void findBestAndWorst();
void GenerateNextPopulation();
void SelectionOperator(); //选择操作
void CrossoverOperator(); //交叉操作
void MutationOperator(); //变异操作
void SaveTheBest(); //最优个体保存策略操作
void main()
{
int i,j,flag,generation;
GenerateInitialPopulation(); //生成初始种群
Decode();
VALUE();
fitness();
findBestAndWorst();
SoFaBest=population[best_Index];
flag=1;
generation=0;
while(flag)
{
GenerateNextPopulation();
generation=generation+1;
Decode();
VALUE();
fitness();
findBestAndWorst();
if(SoFaBest.fitness<population[best_Index].fitness)
{
SoFaBest=population[best_Index];//如果当前最优个体比目前为止出现在最优个体还好,就替换
}
if(SoFaBest.value>3905.9) {flag=0;}
printf("第%5d 代,最优个体%f\n",generation,SoFaBest.value);
}
}
void GenerateInitialPopulation()
/*******************************************************************************
该函数用于生成初始种群
*******************************************************************************/
{
int i,j;
double p;
srand(time(NULL));
for(i=0;i<opSize;i++)
{
for(j=0;j<CHROMLENGTH;j++)
{
p=(500+rand()%10000)/10000.0;//生成随机数,???好像有问题???
if(p<0.5){
population.chrom[j]=1;
}
else population.chrom[j]=0;
}
}
}
void Decode()
/*******************************************************************************
用于解码
*******************************************************************************/
{
int i,j;
for(i=0;i<;PopSize;i++)
{
population.x1=0.0;
population.x2=0.0;
for(j=0;j<CHROMLENGTH/2;j++)
{
if(population.chrom[j]==1)
population.x1=population.x1+pow(2,j);
}
for(j=CHROMLENGTH/2;j<CHROMLENGTH;j++)
{
if(population.chrom[j]==1)
population.x2=population.x2+pow(2,j-10);
}
population.x1=4.096*population.x1/1023-2.048;
population.x2=4.096*population.x2/1023-2.048;
}
}
void VALUE()
/*********************************************************************************
用于计算目标函数的值
*********************************************************************************/
{
int i;
for(i=0;i<;PopSize;i++)
{
population.value=100*(population.x1*population.x1-population.x2)*(population.x1*population.x1-population.x2)+(1-population.x1)*(1-population.x1);
}
}
void fitness()
{
int i;
for(i=0;i<;PopSize;i++)
{
population.fitness=population.value;
}
}
void findBestAndWorst()
/****************************************************************************************
找出最优个体和最差个体的编号,放如a中
*****************************************************************************************/
{
double best,worst;
int i;
best=worst=population[0].fitness;
best_Index=worst_Index=0;
for(i=0;i<;PopSize;i++)
{
if(population.fitness>best)
{
best=population.fitness;
best_Index=i;
}
if(population.fitness<worst)
{
worst=population.fitness;
worst_Index=i;
}
}
}
void GenerateNextPopulation()
/****************************************************************************************
用于生成下一代种群的函数
*****************************************************************************************/
{
SaveTheBest(); //将目前最优个体放入目前种群中
SelectionOperator(); //对当前种群进行选择操作
CrossoverOperator(); //对当前种群进行单点交叉操作
MutationOperator(); //对当前种群进行变异操作
}
void SelectionOperator()
/****************************************************************************************
选择函数
*****************************************************************************************/
{
int i,index;
double p,sum=0.0;
double cfitness[PopSize];
struct individual newpopulation[PopSize];
for(i=0;i<;PopSize;i++)
{
sum=sum+population.fitness;
}
for (i=0;i<;PopSize;i++)
{
cfitness=population.fitness/sum;
}
for(i=1;i<;PopSize;i++)
{
cfitness=cfitness[i-1]+cfitness;
}
for(i=0;i<;PopSize;i++)
{
p=rand()%1000/1000.0;
index=0;
while (p>cfitness[index])
{
index++;
}
newpopulation=population[index];
}
for(i=0;i<;PopSize;i++)
{
population=newpopulation;
}
}
void CrossoverOperator()
/****************************************************************************************
交叉函数
*****************************************************************************************/
{
int i,j;
int index[PopSize];
int point,temp;
double p;
int ch;
for (i=0;i<;PopSize;i++)
{
index=i;
}
for (i=0;i<;PopSize;i++)
{
point=(int)(rand()%(PopSize-i));
temp=index;
index=index[point+i];
index[point+i]=temp;
}
for(i=0;i<;PopSize-1;i+=2)
{
p=rand()%1000/1000.0;
if(p<;Pc)
{
point=(int)(rand()%(CHROMLENGTH-1))+1;
for(j=point;j<CHROMLENGTH;j++)
{
ch=population[index].chrom[j];
population[index].chrom[j]=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=ch;
}
}
}
}
void MutationOperator()
/****************************************************************************************
变异函数
*****************************************************************************************/
{
int i,j;
double p;
for(i=0;i<;PopSize;i++)
{
for(j=0;j<CHROMLENGTH;j++)
{
p=rand()%10000/10000.0;
if(p<;Pm)
{
population.chrom[j]=(population.chrom[j]==0)?1:0;
}
}
}
}
void SaveTheBest()
/****************************************************************************************
最优选择策略函数
*****************************************************************************************/
{
population[worst_Index]=SoFaBest;
} |
|