首页 > 编程语言 > 详细

混合蛙跳算法

时间:2019-09-03 09:38:29      阅读:64      评论:0      收藏:0      [点我收藏+]

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!");
}

混合蛙跳算法

原文:https://www.cnblogs.com/jingzhang/p/11451025.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!