当前位置 : 主页 > 编程语言 > c++ >

混合蛙跳算法

来源:互联网 收集:自由互联 发布时间:2021-06-23
C/C++: #define G 100 /*混合迭代次数*/ #define P 200 /*个体总数*/ #define M 20 /*族群数*/ #define I 10 /*因此,一个族群中的个体数是10*/ #define V 20 /*个体维数*/ #define N 20 /*族群内更新次数*/ #define MA

C/C++:

#define G 100  /*混合迭代次数*/ #define P 200 /*个体总数*/ #define M 20 /*族群数*/ #define I 10 /*因此,一个族群中的个体数是10*/ #define V 20 /*个体维数*/ #define N 20 /*族群内更新次数*/ #define MAX 2.048 #define MIN -2.048 #define D 2.0 /*蛙跳的最大值*/ #define R rand()%100/100.0 typedef struct { double d[V]; double fitness; }Individal; Individal pw[M];/*族群中个体最差位置*/ Individal pb[M];/*族群中个体最好位置*/ Individal px;/*全体中最好位置*/ Individal individual[P];/*全部个体*/ Individal pop[M][I];/*排序后的群组*/ Individal temp[M]; Individal tem;

适应度函数:

 

double fitness(int a)
{ int i; double sum=0; for(i=0;i<V-1;i++) { sum+=100*(individual[a].d[i]*individual[a].d[i]-individual[a].d[i+1])*(individual[a].d[i]*individual[a].d[i]-individual[a].d[i+1])+(individual[a].d[i]-1)*(individual[a].d[i]-1); } return sum; }

种群初始化函数:

 

void init() { int i,j; for(i=0;i<P;i++) { for(j=0;j<V;j++) { individual[i].d[j]=R*(MAX-MIN)+MIN; } individual[i].fitness=fitness(i); } }

按照适应度降序对全部个体进行排序和族群划分函数:

void sort() { int i,j,k; for(i=1;i<P;i++) { for(j=0;j<P-i;j++) { if(individual[j].fitness<individual[j+1].fitness) { tem=individual[j]; individual[j]=individual[j+1]; individual[j+1]=tem; } } } k=0; /*按照规则分组*/ for(i=0;i<I;i++) { for(j=0;j<M;j++) { pop[j][i]=individual[k]; k++; } } px=individual[P-1]; for(i=0;i<M;i++) { pw[i]=pop[i][0]; pb[i]=pop[i][I-1]; } }

子种群个体重新排序函数:

 

void sortPop(int b) { int i,j; for(i=1;i<I;i++) { for(j=0;j<I-i;j++) { if(pop[b][j].fitness<pop[b][j+1].fitness) { tem=pop[b][j]; pop[b][j]=pop[b][j+1]; pop[b][j+1]=tem; } } } }

种群内个体更新函数

 

void update()
{
	int i,j,k,l,n; double a; double b; for(n=0;n<N;n++) { for(i=0;i<M;i++) { a=0.0; b=0.0; for(j=0;j<V;j++) { temp[i].d[j]=R*(pb[i].d[j]-pw[i].d[j]); if(abs(temp[i].d[j])>D) { if(temp[i].d[j]>0) { temp[i].d[j]=D; } else { temp[i].d[j]=-D; } } temp[i].d[j]+=pw[i].d[j]; a+=temp[i].d[j]*temp[i].d[j]; } temp[i].fitness=a; if(a<pw[i].fitness) { pop[i][0]=temp[i]; sortPop(i); pw[i]=pop[i][0]; pb[i]=pop[i][I-1]; } else { for(k=0;k<V;k++) { temp[i].d[k]=R*(px.d[k]-pw[i].d[k]); if(abs(temp[i].d[k])>D) { if(temp[i].d[k]>0) { temp[i].d[k]=D; } else { temp[i].d[k]=-D; } } temp[i].d[k]+=pw[i].d[k]; a+=temp[i].d[k]*temp[i].d[k]; } temp[i].fitness=a; if(a<pw[i].fitness) { pop[i][0]=temp[i]; sortPop(i); pw[i]=pop[i][0]; pb[i]=pop[i][I-1]; } else { for(l=0;l<V;l++) { pop[i][0].d[l]=R*(MAX-MIN)+MIN; b+=pop[i][0].d[l]*pop[i][0].d[l]; } pop[i][0].fitness=b; sortPop(i); pw[i]=pop[i][0]; pb[i]=pop[i][I-1]; } } } } }

更新种群函数:

 

void renew() { int i,j,k; i=0; for(j=0;j<M;j++) { for(k=0;k<I;k++) { individual[i]=pop[j][k]; i++; } } }

结果输出函数:

 

void result() { printf("%.8f\n",px.fitness); int i; for(i=0;i<V;i++) { printf("x(%d)=%.8f\n",i,px.d[i]); } }

主函数:

 

void main() { int i; init(); for(i=0;i<G;i++) { sort(); update(); renew(); } result(); printf("Completed!"); }
网友评论