📄 ga1.1
字号:
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
void main()
{
int i,j,k,a,b,c;//计数器
int n0;//初始pool size
float recom, mutate;//初始化杂交率,变异率
int reco[40];//杂交缓存
int seq[][40];
int select[][40];
float fit[];//每个序列的适配值
float sigmafit,;//适配值之和
float selecton;//轮盘赌上的小球,选择子
int sat;//满足全部条件的解的个数
//设置初始pool个体数目//
cout<<"Input the size of initial pool: ";
cin>>n0;
cout<<"Input the recombination rate: ";
cin>>recom;
cout<<"Input the mutation rate: ";
cin>>mutate;
//设置所有初始解//
srand((unsigned)time(NULL));
for(i=0; i<n0; i++)
{
for(j=0;j<40;j++)
{
seq[i][j]=rand()%2;
}
}
/******************************************开始计算*************************************************/
loop:
//step1.计算所有解的适配值//
for(i=0;i<n0;i++)
{
k=(1-(1-seq[i][0])*(1-seq[i][1])*(1-seq[i][2]))+(1-seq[i][0]*seq[i][1]*(1-seq[i][2]))+(1-(1-seq[i][0])*seq[i][1]*(1-seq[i][2]))+(1-seq[i][0]*(1-seq[i][1])*(1-seq[i][2]))+(1-(1-seq[i][0])*(1-seq[i][1])*seq[i][2])+(1-(1-seq[i][0])*seq[i][1]*seq[i][2])+(1-seq[i][0]*(1-seq[i][1])*seq[i][2])
for(j=3;j<40;j++)
{
k++=1-seq[i][j-2]*seq[i][j-1]*(1-seq[i][j]);
}
fit[i]=k;
}
//
//计算归一化适配值,并令每个适配值叠加前一项
sigmafit=0;
for(i=0;i<n0;i++)
{
sigmafit+=fit[i];
}
fit[0]=fit[0]/sigmafit;
for(i=1;i<n0;i++)
{
fit[i]=fit[i]/sigmafit+fit[i-1];
}
//根据适配值的大小进行选择,被选择的概率和适配值大小成正比
for(k=0;k<n0;k++)
{
selecton=rand()/32767;
for(i=0;i<n0;k++)
{
if(selecton<=fit[i])
{
for(j=0;j<40;j++)
{
select[k][j]=seq[i][j];
}
}
}
}
//将选择产物进行判断,若满足全部条件的解超过1000条,则停止计算,否则杂交变异
sat=0;
for(i=0;i<n0;i++)
{
k=(1-(1-seq[i][0])*(1-seq[i][1])*(1-seq[i][2]))+(1-seq[i][0]*seq[i][1]*(1-seq[i][2]))+(1-(1-seq[i][0])*seq[i][1]*(1-seq[i][2]))+(1-seq[i][0]*(1-seq[i][1])*(1-seq[i][2]))+(1-(1-seq[i][0])*(1-seq[i][1])*seq[i][2])+(1-(1-seq[i][0])*seq[i][1]*seq[i][2])+(1-seq[i][0]*(1-seq[i][1])*seq[i][2])
for(j=3;j<40;j++)
{
k++=1-seq[i][j-2]*seq[i][j-1]*(1-seq[i][j]);
}
fit[i]=k;
if(fit[i]=46)
{
sat++;
}
}
if(sat<1000)//判断是否有足够的满足所有条件的解:没有,进行杂交变异
{
for(k=0;k<recom*n0;k++)
{
a=rand()/32767*n0;
b=rand()/32767*n0;
c=rand()/32767*40;
for(j=c;j<40;j++)
{
reco[j]=select[b][j];
select[b][j]=select[a][j];
select[a][j]=reco[j];
}
}//杂交完成
for(k=0;k<mutate*n0;k++)
{
a=rand()/32767*n0;
b=rand()/40;
select[a][b]=1-select[a][b];
}//变异完成
goto loop;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -