📄 heredity.c
字号:
#define R 7 // x的位数
#define M 35 //群体大小
#define T 20//遗传运算终止进化代数
#include <math.h>
float P[M+1][R+2];
////////////////////////////// //函数/////////////////////////////
float f(float x)
{
return x*sin(10*3.14*x)+1.0;
}
//////////////////////// //10的a次方//////////////////////////
int power(int a)
{ int i,power=1;
for(i=1;i<=a;i++) power=power*10;
return power;
}
////////////////////////////初始化群体算法 ////////////////////////////
init () ////// O(m*r)
{
int i,j;
printf("\n\n第0代:\n");
for(i=1;i<=M;i++)
{
P[i][1]=rand()%3;// P[i][1]在0,1,2之间产生
P[i][0]=P[i][1];
for(j=2;j<=R;j++)
{
P[i][j]=rand()%10; //P[i][j]在0~9之间产生
P[i][0]=P[i][0]+P[i][j]/power(j-1);
}
P[i][0]=P[i][0]-1; //设置P[i][0]为表现型
}
}
///////////////////////遗传算法,包含选择,交叉,变异/////////// //////
YiChuan(t)
{ float MAX=-1; //群体种的最大值 ,初定为最小值
float MIN=3; //群体种的最小值 ,初定为最大值
float sum =0; //函数和
int k=1,a,i,j,r1,r2;
int m ;//基因座
for(i=1;i<=M;i++) ////// O(m*r)
{
sum+=f(P[i][0]); //函数求和
if(MAX< f(P[i][0]))
{
MAX=f(P[i][0]);
r1=i;
}
/////////////////选择算法 ///////////////////////////////////////////////
if(MIN>f(P[i][0]))
{
MIN=f(P[i][0]);
r2=i;
}
for(j=0;j<=R;j++)
P[r2][j]=P[r1][j];
}
printf("群体中最大值为:%f\n", MAX );
printf("群体的平均值为:%f\n",sum/M);
printf("\n\n第%d代:\n",t+1);
//////////////////////////////////交叉互换 ///////////////////////////
for(i=1;i<=M/2;i++) ////// O(m)
{
m=rand()%R;//随机产生基因座
if(m) //m=0时不交换
{
a=P[i][m]; //中间值a
P[i][m]=P[i+M/2][m];
P[i+M/2][m]=a; //将第i个与第i+M/2个配对,交叉互换一个基因
}
}
/////////////////////////变异 ////////////////////////////////////////
for(i=1;i<=M;i++) ////// O(m)
{
m=rand()*10%R;//随机产生基因座
if(m&m!=1) P[i][m]=rand()%10;
//在相应的基因座上再取随机数 ,m=0,1时不变异
}
for(i=1;i<=M;i++) ////// O(m*r)
{
P[i][0]=P[i][1];
for(j=2;j<=R;j++)
{
P[i][0]=P[i][0]+P[i][j]/power(j-1);
}
P[i][0]=P[i][0]-1; //设置P[i][0]为表现型
}
}
main()
{ float MAX=-1; //群体种的最大值
float sum =0; //函数和
int t=0,i;
init(); //初始化群体
while(t<T) //T代遗传 ////// O(t)
{
YiChuan(t);
t++;
}
for(i=1;i<=M;i++) ////// O(m)
{
sum+=f(P[i][0]); //函数求和
if(MAX< f(P[i][0]))
{
MAX=f(P[i][0]);
}
}
printf("群体中最大值为:%f\n", MAX );
printf("群体的平均值为:%f\n",sum/M);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -