#include #include #include #include #define M 50 //种群数量#define LEN 20 //编码长度#define xmin -1 //下限#define xmax 2 //上限#define MMAX (int)pow(2,LEN)//编码长度相应的最大二进制数#define PI 3.1415926#define PC 0.8 //交叉概率#define PM 0.005 //变异概率struct Node{ int num,MyBinary[LEN]; //num是相应二进制编码的整数值。MyBinary存放二进制编码 double Myfitness; //Myfitness是适应度 double Myfitsum; //Myfitsum是适应度占整体适应度的百分比,然后从第一个个体往后累加,主要用于选择操作}Nownode[M],Nextnode[M]; //本代群体和下一代群体int nodeindex[M]; //交叉时随机配对,存放配对的群体下标double fx(double x) //被优化函数{ double y; y=x*sin(3*PI*x)+2; //y=6-pow(x+6,2); //y=sin(0.7*x)/x; return y;}int randn(int temp)//产生0~MMAX之间的随机整数{ return (int)(1.0*rand()/RAND_MAX*temp+0.5);}double double2double(struct Node node)//把相应的二进制数转化为相应区间的double数{ return xmin+node.num*(xmax-xmin)/(pow(2,LEN)-1);}int calfitness() //计算适应度{ int i; double temp,minfitness;//minfitness作用是假设出现负的适应度,就做相应的变化 for(i=0;i Nownode[i].Myfitness) { minfitness=Nownode[i].Myfitness; } } if(minfitness<0)//假设有负的适应度值,就把所以的适应度都加上一个数,使适应度全都为正数 { for(i=0;i =0;j--) { Nownode[i].MyBinary[j]=temp%2;//给MyBinary赋值 temp=temp/2; } } calfitness();//计算适应度 return 0;}int assignment(struct Node *node1,struct Node *node2)//两个个体之间赋值操作,所以这里必须使用指针,{ int j; for(j=0;j MyBinary[j]=node2->MyBinary[j]; } node1->num=node2->num; return 0;}int copypopulation()//选择(复制)操作{ int i,num=0; double temp; while(num =Nownode[i-1].Myfitsum&&temp<=Nownode[i].Myfitsum) { //Nextnode[num++]=Nownode[i]; assignment(&Nextnode[num++],&Nownode[i]);//假设满足条件就赋值给下一代 break; } } } for(i=0;i MyBinary[j])); } node->num=num; return num;}int crossposition(struct Node *node1,struct Node *node2,int p)//交叉操作,交叉点为p,參数必须是指针{ int j,temp; for(j=LEN-1;j>=LEN-1-p;j--) { temp=node1->MyBinary[j]; node1->MyBinary[j]=node2->MyBinary[j];//交换两个个体的编码 node2->MyBinary[j]=temp; } bin2int(node1);//交叉完毕后更新num值 bin2int(node2); return 1;}int crossover(){ int i,temp; double pc_temp; for(i=0;i