📄 yichuan.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <complex>
#define N 50 //设定种群规模,影响算法收敛速度,一般在(10,200)之间选
int leng=65535; //定义二进制长度
double pjiaocha=0.8; //设定交配概率,一般取(0.4,0.99)
double pbianyi=0.1; //设定变异概率,一般取(0.0001,0.1)
int father[N]; //设定父代种群
int generation[N]; //设定子代种群
/*********************产生一定范围内随机数**********************/
int random(int min,int max)
{
int u = (int)floor(((double)rand() / (RAND_MAX)) * (max- min)+ min);
return(u);
}
/*********************求解每个染色体所对应的适应函数值**********************/
double fx(int x)
{
double x1=9.0*(double)x/leng;
double y=x1+5*sin(5*x1)+7*cos(2*x1)+12;
return(y);
}
/*********************用遗传算法进行选择,交叉和变异**********************/
void GA()
{
int p,i,j;
double fs[N]; //定义适应度函数值存放数组
for (i=0;i<N;i++)
{ fs[i]=0;}
fs[0]=fx(father[0]);
for(i=1;i<N;i++)
{
fs[i]=fs[i-1]+fx(father[i]);//累加适应度函数值
}
for(i=1;i<N;i++) //采用轮盘赌法选取父代
{
p=random(0,(int)fs[N-1]);
for(j=0;j<N;j++)
{
if(p<=fs[j])
{ generation[i]=father[j];
break;
}
}
}
int yanma=random(0,leng); //定义掩码用以进行交叉
for(i=0;i<N;i=i+2)
{
if(random(0,N)<pjiaocha*N) //进行相邻两父代之间的交叉
{
p=(generation[i]&yanma)|(generation[i+1]&(~yanma));
generation[i]=(generation[i]&(~yanma))|(generation[i+1]&yanma);
generation[i+1]=p;
}
}
for(i=1;i<N;i++)
{
if(random(0,N)<pbianyi*N) //进行子代的变异
{
p=1;
p=p<<random(0,15);
generation[i]=generation[i]^p;
}
}
for(i=0;i<N;i++)
{
p=father[i];
father[i]=generation[i];
generation[i]=p;
}
}
/*********************主程序**********************/
void main()
{ int i;
double fmax=0,t=0,xmax=0; //最大适应函数值,最优解
int m=0,max=0,nmax=0; //迭代次数,最大适应函数值对应的染色体
srand( (unsigned)time( NULL ) );
for(i=0;i<N;i++)
{
father[i]=random(0,65535); //初始化父代种群
}
while(m<100) //迭代次数设置为100次
{
GA(); //运行遗传算法
fmax=0;
for(i=0;i<N;i++)
{
if(fmax<fx(father[i]))
{ fmax=fx(father[i]); //求解出每次进行交叉变异后所对应的函数最大值及对应的最优解
max=father[i];}
else max=max;
}
if(fmax>t)
{t=fmax;
nmax=max;
m=0;} //得到100次迭代之后的函数最大值及最优解
else
{m++;
nmax=nmax;}
}
xmax=9.0*(double)nmax/leng;
printf("计算结果:\n种群规模:%d\n交叉概率:%f\n变异概率%f:\n最大适应值:%f\n函数最大值:%f\n最优解x:%f\n",N,pjiaocha,pbianyi,t,t-12,xmax);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -