当前位置:文档之家› 遗传算法求解函数最大值(两参数)

遗传算法求解函数最大值(两参数)

#include
#include
#include
#include
using namespace std;
int jjl[2000]={0}; //定义全局变量临时数组
int jjl2[2000]={0};
int jjl3[2000]={0};
int jjl4[2000]={0};
float x[2000]={0.0};
float y[2000]={0.0};
float fit[2000]={0.0};
float afit[2000]={0.0};
float tpfit[2000]={0.0};


class father{ //定义父类
public:
void select(int M);
private:
int i,j,k;

};
class son:public father{ //定义子类
public:
int jiaocha(int a[2000][10],int d[2000][10],float &pm,int M);
int bianyi(int a[2000][10],int d[2000][10],float &pm,int M);
private:
int i,j,k;
};


int cifang(int a,int b){ //a的b次方
int i,sum=1;
if(b==0) return 1;
for(i=1;i<=b;i++){
sum=sum*a;
}
return sum;
}
int rand01() //用于随机取0或1的函数
{int r;
float q;
q=rand()/(RAND_MAX+0.0);
if(q<0.5) r=0;
else r=1;
return r;
}
void printt(int a[2000][10],int d[2000][10],int M){ //显示数组
int i,j;
for(i=0;ifor(j=0;j<10;j++){
cout<}
cout<}
cout<for(i=0;ifor(j=0;j<10;j++){
cout<}
cout<}
}
void chushiM(int a[2000][10],int d[2000][10],int M){ //种群初始化
int i,j;
srand((unsigned)time(0));
for(i=0;ifor(j=0;j<10;j++){
a[i][j]=rand01();
}
}
for(i=0;ifor(j=0;j<10;j++){
d[i][j]=rand01();
}
}
printt(a,d,M);
}
void chushihua(){ //临时数组初始化
int i;
for(i=0;i<2000;i++){
jjl[i]=0;
jjl2[i]=0;
jjl3[i]=0;
jjl4[i]=0;
x[i]=0.0;
y[i]=0.0;
fit[i]=0.0;
afit[i]=0.0;
tpfit[i]=0.0;
}
}
void zhuanhuan(int a[2000][10],int d[2000][10],int M){ //二进制转十进制
int i,j;
float aa=0.0,bb=2.0; //定义坐标范围[aa,bb]
for(i=0;ifor(j=0;j<10;j++){
x[i]=x[i]+a[i][j]*cifang(2,9-j);
y[i]=y[i]+d[i][j]*cifang(2,9-j);
}
x[i]=aa+(bb-aa)*x[i]/(cifang(2,10)-1+0.0);
y[i]=aa+(bb-aa)*y[i]/(cifang(2,10)-1+0.0);
}
//for(i=0;i}
void fitfx(int M){ //计算适应度
int i,j;
for(i=0;i//fit[i]=x[i]*y[i];
//fit[i]=1.0/(100*(x[i]*x[i]-y[i])*(x[i]*x[i]-y[i])+(1-x[i])*(1-x[i]));
fit[i]=1-(x[i]-1)*(x[i]-1)-(y[i]-1)*(y[i]-1); //适应度
//fit[i]=x[i]*sin(10*3.1416*x[i])+2.0;
//fit[i]=sin(x[i])/x[i];
//fit[i]=(x[i]+2.0);
//fit[i]=(2.0)*cifang(x[i],3)-cifang(x[i],2)-(1/2.0)*x[i]+1;
}
for(i=0;ifor(j=0;jif(afit[i]if(i==0){
afit[i]=fit[j];
jjl[i]=j;
jjl3[i]=j;
}
else if(afit[i-1]>fit[j]){
afit[i]=fit[j];
jjl[i]=j;
jjl3[i]=j;
}
}
}
}
//cout<<"fit:"<//cout<<"afit:"<//cout<<"jjl"<

0;i//cout<<"jjl3"<}
void sumfitp(int M){ //计算转轮法需要的个体累计概率
int i;
float sum=0.0;
for(i=0;isum=sum+fit[i];
}
tpfit[0]=fit[0]/sum;
for(i=1;itpfit[i]=tpfit[i-1]+fit[i]/sum;
}
//cout<<"tpfit:"<}
void father::select(int M){ //转轮选择
int temp;
float r;
sumfitp(M);
srand((unsigned)time(NULL));
for(i=0;ir=rand()/(RAND_MAX+0.0);
for(j=0;jif(tpfit[j]>=r) {jjl2[i]=j;jjl4[i]=j;j=M;}
}
}
for(i=0;ifor(j=i;jif(jjl2[i]>jjl2[j]){
temp=jjl2[j];
jjl2[j]=jjl2[i];
jjl2[i]=temp;
}
}
}
for(i=0;ifor(j=i;jif(jjl4[i]>jjl4[j]){
temp=jjl4[j];
jjl4[j]=jjl4[i];
jjl4[i]=temp;
}
}
}
//cout<<"jjl2:"<//cout<<"jjl4:"<}

int next(int a[2000][10],int d[2000][10],int M){ //将父代的二值数组移植到子代
int i,j,l=0,k=M;
int b[2000][10],c[2000][10];
for(i=0;iwhile(l>0&&(jjl2[l-1]==jjl2[l])){
k--;
l++;
}
for(j=0;j<10;j++){
b[i][j]=a[jjl2[l]][j];
a[i][j]=0;
}
l++;
}
l=0;k=M;
for(i=0;iwhile(l>0&&(jjl4[l-1]==jjl4[l])){
k--;
l++;
}
for(j=0;j<10;j++){
c[i][j]=d[jjl4[l]][j];
d[i][j]=0;
}
l++;
}
for(i=0;ifor(j=0;j<10;j++)
a[i][j]=0;
//cout<<"k="<for(i=0;ifor(j=0;j<10;j++)
a[i][j]=b[i][j];
//printt(a);
for(i=0;ifor(j=0;j<10;j++)
d[i][j]=0;
//cout<<"k="<for(i=0;ifor(j=0;j<10;j++)
d[i][j]=c[i][j];
return k;
}
float avg(int M){ //计算适应度平均值
int i,sum=0;
for(i=0;isum=sum+afit[i];
}
return sum/(M+0.0);
}
int son::jiaocha(int a[2000][10],int d[2000][10],float &pc,int M){ //交叉运算
//int i,j,k,l=0;
int l=0;
float r;
srand((unsigned)time(NULL));
for(j=1;jif(afit[j]>avg(M)) pc=0.8-0.2*(afit[j]-avg(M))/(afit[0]-avg(M)+0.0);
else pc=0.8; //自适应遗传算法概率设置
r=rand()/(RAND_MAX+0.0); //cout<<"r="<if(r<=pc){
k=10*rand()/(RAND_MAX+0.0); //cout<<"k="<for(i=0;ia[M+l][i]=a[jjl[0]][i];
a[M+l+1][i]=a[jjl[j]][i];
}
for(i=k;i<10;i++){
a[M+l][i]=a[jjl[j]][i];
a[M+l+1][i]=a[jjl[0]][i];
}
//l=l+2;
//if(M+l>=600) return M+l;
//cout<}
//r=rand()/(RAND_MAX+0.0); //cout<<"r="<if(r<=pc){
k=10*rand()/(RAND_MAX+0.0); //cout<<"k="<for(i=0;id[M+l][i]=d[jjl3[0]][i];
d[M+l+1][i]=d[jjl3[j]][i];
}
for(i=k;i<10;i++){
d[M+l][i]=d[jjl3[j]][i];
d[M+l+1][i]=d[jjl3[

0]][i];
}
l=l+2;
if(M+l>=1000) return M+l;
//cout<}
}
return M+l;
}
int son::bianyi(int a[2000][10],int d[2000][10],float &pm,int M){ //变异运算
//int i,k;
float r;
//srand((unsigned)time(1));
r=rand()/(RAND_MAX+0.0); //cout<<"r="<if(r<=pm){
k=10*rand()/(RAND_MAX+0.0); //cout<<"k="<for(i=0;i<10;i++){
if(i==k) a[M][k]=!a[jjl[0]][k];
else a[M][i]=a[jjl[0]][i];
}
}
r=rand()/(RAND_MAX+0.0); //cout<<"r="<if(r<=pm){
k=10*rand()/(RAND_MAX+0.0); //cout<<"k="<for(i=0;i<10;i++){
if(i==k) d[M][k]=!d[jjl3[0]][k];
else d[M][i]=d[jjl3[0]][i];
}
}
return M+1;
}
int main(){
father p1,*p;
son p2;
int M=80,T=200,gen=0; //定义初始种群容量和代数
float pc=0.8,pm=0.05; //定义交换概率和变异概率
int a[2000][10]={0}; //定义存二进制编码的二维数组
int d[2000][10]={0};
chushiM(a,d,M); //将二进制二维数组初始化
while(genchushihua(); //全部临时数组初始化
zhuanhuan(a,d,M); //将二进制数转换为十进制
fitfx(M); //计算适应度并排序
p=&p1; //
p->select(M); //选择法
M=next(a,d,M); //将选出来的个体移植到下一代
chushihua(); //初始化
zhuanhuan(a,d,M); //转换
fitfx(M); //计算适应度并排序
M=p2.jiaocha(a,d,pc,M); //计算子代交叉结果
M=p2.bianyi(a,d,pm,M); //计算子代变异结果
gen++; //代数自加
}
zhuanhuan(a,d,M);
fitfx(M);
cout<<"when x="<return 0;
//printt(a,M);

}

相关主题
文本预览
相关文档 最新文档