📄 lgj.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
#define POPSIZE 10
void initialize();
void crossover();
void mutation();
void Judge(struct _indi &);
typedef struct _indi
{
double code;//染色体
double degree;//适应度
}Indi;
Indi group[40];//种群规模为40
void main()
{
int i,j,best;
float sum;
initialize();//初始化
for(i=1;i<=10;i++)//固定进化10代
{
crossover();//杂交,交叉
mutation();//变异
for(sum=0.0,best=0,j=0;j<40;++j)
{
sum+=group[j].degree;//求总的适应度sum
if(group[j].degree>group[best].degree)
best=j;//求当前最优个体
}
printf("第%2d代中 最优个体为 %10f(%10f) 平均适应度为 %10f\n",i,group[best].code,group[best].degree,sum/40.0);
}
}
void initialize()
{
int i;
for(i=0;i<40;++i)//随机得到初始种群
{
group[i].code=1.0+(double)rand()/RAND_MAX;
Judge(group[i]);
}
}
void Judge(Indi &x)
{
double tmp=x.code*x.code-2.0;
if(tmp>=0)
x.degree=40.0/(2.0+tmp)-10.0;
else
x.degree=40.0/(2.0-tmp)-10.0;
}
int happened(double p)//发生一个p=0~1间概率的事件
{
return rand()<(int)(p*RAND_MAX);
}
void crossover()
{
int i,j,best,x,y,c;
double sum,strick;
Indi z;
for(sum=0.0,j=0;j<40;++j)
{
sum+=group[j].degree;//求总的适应度sum
}
for(c=40;c;--c)
{
strick=(double)rand()/RAND_MAX*sum;//赌盘中的色子,选择个体x,y
for(x=0;x<40&&strick>=group[x].degree;++x)
strick-=group[x].degree;
strick=(double)rand()/RAND_MAX*sum;
for(y=0;y<40&&strick>=group[y].degree;++y)
strick-=group[y].degree;
if(happened(0.9))//交叉
{
z.code=(group[x].code+group[y].code)/2.0;
Judge(z);
if(group[x].degree<group[y].degree)
{
if(z.degree<=group[x].degree)
return;//如果新个体不如双亲,淘汰之
group[x]=z;
}
else
{
if(z.degree<=group[y].degree)
return;
group[y]=z;
}
}
}
}
void mutation()
{
int i,j;
double strick;
Indi z;
for(i=0;i<40;i++)
{
strick=(double)rand()/RAND_MAX;
if(strick<0.01)
{
z=group[i];
z.code=1.0+(double)rand()/RAND_MAX;
Judge(z);
if(z.degree<=group[i].degree)
return;
group[i]=z;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -