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

📄 ga1.1

📁 用c++和MPI写的并行遗传算法
💻 1
字号:
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>

void main()
{
	int i,j,k,a,b,c;//计数器
	int n0;//初始pool size
	float recom, mutate;//初始化杂交率,变异率
	int reco[40];//杂交缓存
	int seq[][40];
	int select[][40];
	float fit[];//每个序列的适配值
	float sigmafit,;//适配值之和
	float selecton;//轮盘赌上的小球,选择子
	int sat;//满足全部条件的解的个数
	//设置初始pool个体数目//
	cout<<"Input the size of initial pool: ";
	cin>>n0;
	cout<<"Input the recombination rate: ";
	cin>>recom;
	cout<<"Input the mutation rate: ";
	cin>>mutate;

	//设置所有初始解//
	srand((unsigned)time(NULL));
	for(i=0; i<n0; i++)
	{
		for(j=0;j<40;j++)
		{
			seq[i][j]=rand()%2;
		}
	}
	/******************************************开始计算*************************************************/
loop:
	//step1.计算所有解的适配值//
	for(i=0;i<n0;i++)
	{
		k=(1-(1-seq[i][0])*(1-seq[i][1])*(1-seq[i][2]))+(1-seq[i][0]*seq[i][1]*(1-seq[i][2]))+(1-(1-seq[i][0])*seq[i][1]*(1-seq[i][2]))+(1-seq[i][0]*(1-seq[i][1])*(1-seq[i][2]))+(1-(1-seq[i][0])*(1-seq[i][1])*seq[i][2])+(1-(1-seq[i][0])*seq[i][1]*seq[i][2])+(1-seq[i][0]*(1-seq[i][1])*seq[i][2])
			for(j=3;j<40;j++)
			{
				k++=1-seq[i][j-2]*seq[i][j-1]*(1-seq[i][j]);
			}
			fit[i]=k;
	}
	//
	//计算归一化适配值,并令每个适配值叠加前一项
	
	sigmafit=0;
	for(i=0;i<n0;i++)
	{
		sigmafit+=fit[i];
	}

	fit[0]=fit[0]/sigmafit;

	for(i=1;i<n0;i++)
	{
		fit[i]=fit[i]/sigmafit+fit[i-1];
	}

	//根据适配值的大小进行选择,被选择的概率和适配值大小成正比
	for(k=0;k<n0;k++)
	{
		selecton=rand()/32767;
		for(i=0;i<n0;k++)
		{
			if(selecton<=fit[i])
			{
				for(j=0;j<40;j++)
				{
					select[k][j]=seq[i][j];
				}
			}
		}
		
	}
	//将选择产物进行判断,若满足全部条件的解超过1000条,则停止计算,否则杂交变异
	sat=0;
    for(i=0;i<n0;i++)
	{
		k=(1-(1-seq[i][0])*(1-seq[i][1])*(1-seq[i][2]))+(1-seq[i][0]*seq[i][1]*(1-seq[i][2]))+(1-(1-seq[i][0])*seq[i][1]*(1-seq[i][2]))+(1-seq[i][0]*(1-seq[i][1])*(1-seq[i][2]))+(1-(1-seq[i][0])*(1-seq[i][1])*seq[i][2])+(1-(1-seq[i][0])*seq[i][1]*seq[i][2])+(1-seq[i][0]*(1-seq[i][1])*seq[i][2])
			for(j=3;j<40;j++)
			{
				k++=1-seq[i][j-2]*seq[i][j-1]*(1-seq[i][j]);
			}
			fit[i]=k;
			if(fit[i]=46)
			{
				sat++;
			}
	}
	if(sat<1000)//判断是否有足够的满足所有条件的解:没有,进行杂交变异
	{
		for(k=0;k<recom*n0;k++)
		{
			a=rand()/32767*n0;
			b=rand()/32767*n0;
			c=rand()/32767*40;
			for(j=c;j<40;j++)
			{
				reco[j]=select[b][j];
				select[b][j]=select[a][j];
				select[a][j]=reco[j];
			}
		}//杂交完成
		
		for(k=0;k<mutate*n0;k++)
		{
			a=rand()/32767*n0;
			b=rand()/40;
			select[a][b]=1-select[a][b];
		}//变异完成

		goto loop;
	}
}

   











		

⌨️ 快捷键说明

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