⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 求基址的遗传算法.txt

📁 求最优值的一个算法
💻 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 + -