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

📄 yichuan.cpp

📁 人工智能中的遗传算法编程
💻 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 + -