📄 求基址的遗传算法.txt
字号:
我也在做遗传算法,只是初学,写了一个求极值的程序,求f(x)=x*sin(10*PI*x)+1.0在[-1,2]上的最大值。程序如下:#include "Math.h"
#include "stdio.h"
#include "stdlib.h"
#define pc 0.25
#define pm 0.01
int c;
int K;
double X;
double p[50];
double x[50];
double fitsum=0.;
double fit[50];
int i,j,k,l,m,n;
int s1,s2,s;
double pp;
double maxfit0=0.,maxfit;
FILE *fp;
int Whole[50][22]=
{
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{0,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,1,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,1,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,0,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,0,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,0,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,0,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,1,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,0,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,0,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,1,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,0,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,1,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,1,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,1,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,1,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,0},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,0,0,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,1,0,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,1,1,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,1,1,1,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,0,0,1,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,0,1,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,1,0,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,0,1,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,0,0,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,1,0,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,0,1,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,0,0,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,0,0,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,1,0,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,0,1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,1,0,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,1,1,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,1,1,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{0,1,0,0,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,1,1,1,1,0,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,1,0,0,1,0,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,0,0,1,1,1,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,1,0,0,0,1,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,0,1,0,0,1,0,0,0,1,1,1},
{1,0,0,0,1,0,1,1,1,0,1,1,0,0,1,0,0,0,0,1,1,1}
};
void main()
{
if((fp=fopen("data.dat","w"))==NULL)
{
printf("Error! The file cannot open.\n");
exit(0);
}
k=0;
do
{
for(i=0;i<50;i++)
{
x[i]=0.;
for(j=0;j<22;j++)
{
x[i]+=(Whole[i][j]*pow(2.,(double)j));
}
x[i]=-1.+x[i]*3./(pow(2.,22.)-1.);
fit[i]=x[i]*sin(10.*3.1415926*x[i])+1.;
fitsum+=fit[i];
}
maxfit=fit[0];
l=0;
for(i=0;i<50;i++)
{
p[i]=fit[i]/fitsum;
if(maxfit {
maxfit=fit[i];
l=i;
}
}
fprintf(fp,"第%d代: maxfit=%f x=%f\n",k,maxfit,x[l]);
if(maxfit>maxfit0)
{
maxfit0=maxfit;
X=x[l];
K=k;
}
m=0;
n=0;
while(m<50)
{
if(p[m]>=pc)
{
if(n==0)
{
s1=m;
n=1;
}
else
{
s2=m;
n=0;
c=rand()%22;
for(i=c;i<22;i++)
{
s=Whole[s1][i];
Whole[s1][i]=Whole[s2][i];
Whole[s2][i]=s;
}
}
}
m++;
}
for(i=0;i<50;i++)
{
for(j=0;j<22;j++)
{
pp=1./(rand()%1001);
if(pp {
Whole[i][j]=(Whole[i][j]+1)%2;
}
}
}
k++;
}while(k<150);
fprintf(fp,"第%d代得到最大值%f,其对应的x为%f!\n",K,maxfit0,X);
fclose(fp);
}
此程序可以求出最大值,但是我仍旧感觉“转盘式选择”和“单点一致交叉”有问题,请多指教!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -