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

📄 lgj.cpp

📁 遗传算法简称GA(Genetic Algorithm)
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>

#define POPSIZE 10
void initialize();
void crossover();
void mutation();
void Judge(struct _indi &); 
typedef struct _indi
{
	double code;//染色体
	double degree;//适应度
}Indi;
Indi group[40];//种群规模为40
void main()
{
	int i,j,best;
	float sum;
	initialize();//初始化
	for(i=1;i<=10;i++)//固定进化10代
	{
		crossover();//杂交,交叉
		mutation();//变异
		for(sum=0.0,best=0,j=0;j<40;++j)
		{
			sum+=group[j].degree;//求总的适应度sum
			if(group[j].degree>group[best].degree)
				best=j;//求当前最优个体
		}
		printf("第%2d代中 最优个体为 %10f(%10f) 平均适应度为 %10f\n",i,group[best].code,group[best].degree,sum/40.0);
		
	}
}
void initialize()
{
	int i;
	for(i=0;i<40;++i)//随机得到初始种群
	{
		group[i].code=1.0+(double)rand()/RAND_MAX;
		Judge(group[i]);
	}
}
void Judge(Indi &x)
{
	double tmp=x.code*x.code-2.0;
	if(tmp>=0)
		x.degree=40.0/(2.0+tmp)-10.0;
	else
		x.degree=40.0/(2.0-tmp)-10.0;
}

int happened(double p)//发生一个p=0~1间概率的事件
{
	return rand()<(int)(p*RAND_MAX);
}
void crossover()
{
		int i,j,best,x,y,c;
    	double sum,strick;
		Indi z;
		for(sum=0.0,j=0;j<40;++j)
		{
			sum+=group[j].degree;//求总的适应度sum
		}
		for(c=40;c;--c)
		{
			strick=(double)rand()/RAND_MAX*sum;//赌盘中的色子,选择个体x,y
			for(x=0;x<40&&strick>=group[x].degree;++x)
				strick-=group[x].degree;
			strick=(double)rand()/RAND_MAX*sum;
			for(y=0;y<40&&strick>=group[y].degree;++y)
				strick-=group[y].degree;
			if(happened(0.9))//交叉
			{
				z.code=(group[x].code+group[y].code)/2.0;
				Judge(z);
				if(group[x].degree<group[y].degree)
				{
					if(z.degree<=group[x].degree)
							return;//如果新个体不如双亲,淘汰之
					group[x]=z;
				}
				else
				{
					if(z.degree<=group[y].degree)
						return;
					group[y]=z;
				}
			}
		}
}
void mutation()
{
	int i,j;
    double strick;
	Indi z;
	
	for(i=0;i<40;i++)
	{
		strick=(double)rand()/RAND_MAX;
		if(strick<0.01)
		{
			z=group[i];
			z.code=1.0+(double)rand()/RAND_MAX;
			Judge(z);
			if(z.degree<=group[i].degree)
				return;
			group[i]=z;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -