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

📄 ga.cpp

📁 本程序是针对多序列比对问题
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// GA.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

ofstream  outfile("c:\\GA_output.txt");		//输出文件

int popsize;			//种群大小
int chromosize;			//染色体片断长度
int chromo_length;		//染色体的总长度
int L;					//迭代次数
int gen;				//当前代数
int best_gen;			//最佳个体生成代
double best_T;			//最佳个体生成时的温度
int min_sequence_length=65535;//sequence中最短的长度
int max_sequence_length=0;//sequence中最长的长度
double T0,alpha;//初始温度,温度变化系数
int tem;//终止温度

char sequence[19][70]={"ccuagugacaauagcggagaggaaacacccguucccaucccgaacacggaaguuaag","ccuaguggugauagcggaggggaaacacccguucccaucccgaacacggaaguuaag","uuugguggcgauagcgaagaggucacacccguucccauaccgaacacggaaguuaag","uuugguggcgauagcgaagaggucacacccguucucaugccgaacacggaaguuaag","ucugguggcgauagcgaagaggucacacccguucccauaccgaacacggaaguuaag","uguugugaugauggcauugaggucacaccuguucccauaccgaacacagaaguuaag","ugccuggcggccguagcgcgguggucccaccugaccccaugccgaacucagaagugaaa","ugucuggcggccauagcgcaguggucccaccugaucccaugccgaacucagaagugaaa","ugcuuggcgaccauagcguuauggacccaccugaucccuugccgaacucaguagugaaa","guuucgguggucauagcgugagggaaacgcccgguuacauuccgaacccggaagcuaag","uccagugucuaugacuuagagguaacacuccuucccauuccgaacaggcagguuaag","uguucuuugacgaguaguagcauuggaacaccugaucccaucccgaacucagaggugaaa","uggccugguggucauugcgggcucgaaacacccgaucccaucccgaacucggccgugaaa","uccuggugucuauggcgguauggaaccacucugaccccaucccgaacucaguugugaaa","uauucugguguccuaggcguagaggaaccacaccaauccaucccgaacuuggugguuaaa","uauucuggugcuccuaggcguagaggaaccaaaccaauccaucccgaacuuggugguuaaa","aauccccgcccuuagcggcguggaacacccguucccauuccgaacacggaagugaaa","uuaaggcggccauagcggugggguuacucccguacccaucccgaacacggaagauaag","guucacauccgccaggacgcggcgauuacacccgguauccagcccgaacccggaagcgaaa"};
const int sequence_number=19;
int sequence_length[19]={57,57,57,57,57,57,59,59,59,59,57,60,60,59,60,61,57,58,61};

//char sequence[3][10]={"ccuagugac","ccuagu","ucagcucg"};
//const int sequence_number=3;
//int sequence_length[3]={9,6,8};

class RandomNumber  impor;     //产生随机数需要的类

struct individual		//个体定义
{
	unsigned *chromosome;		//染色体
	double fitness;				//个体适应度
};

struct individual *oldpop; //当前代种群
struct individual *newpop; //新一代种群
struct individual *midpop;//中间种群,保存当前温度最优个体
struct individual *temper;	//临时种群
struct individual *optimal_indivi;	//最佳个体

void inputdata()		//遗传算法参数输入
{
	cout<<"请输入种群大小和染色体片断长度.\n";
	cin>>popsize>>chromosize;
	cout<<"请输入迭代代数\n";
	cin>>L;
	cout<<"请输入初始温度,alpha系数,终止温度(exp)\n";
	cin>>T0>>alpha>>tem;
}

void initreport()      //初始参数输出
{
	outfile<<"                   基本遗传算法参数\n";
	outfile<<"--------------------------------------------------------------\n";
	outfile<<"              种群大小(popsize)       ="<<popsize<<endl;
	outfile<<"              染色体片断长度(chromosize)   ="<<chromosize<<endl;
	outfile<<"              迭代代数(L)             ="<<L<<endl;
	outfile<<"              初始温度(T0)            ="<<T0<<endl;
	outfile<<"              alpha系数(alpha)        ="<<alpha<<endl;
	outfile<<"              终止温度(exp)           ="<<tem<<endl;
	outfile<<"---------------------------------------------------------------\n";
}

void initmalloc()         //为全局数据变量分配空间
{
	if((oldpop=new struct individual[popsize])==NULL)
		cout<<"can't allocate more memory.\n";

	if((newpop=new struct individual[popsize])==NULL)
		cout<<"can't allocate more memory.\n";
	
	if((midpop=new struct individual)==NULL)
		cout<<"can't allocate more memory.\n";

	if((optimal_indivi=new struct individual)==NULL)
		cout<<"can't allocate more memory.\n";

	if((temper= new struct individual)==NULL)
		cout<<"can't allocate more memory.\n";

	if((temper->chromosome=new unsigned[chromo_length])==NULL)
		cout<<"can't allocate more memory.\n";

	if((midpop->chromosome=new unsigned[chromo_length])==NULL)
		cout<<"can't allocate more memory.\n";

	for(int j=0;j<popsize;j++)
	{
		if((oldpop[j].chromosome=new unsigned[chromo_length])==NULL)
			cout<<"can't allocate more memory.\n";
		if((newpop[j].chromosome=new unsigned[chromo_length])==NULL)
			cout<<"can't allocate more memory.\n";		
	}

	if((optimal_indivi->chromosome=new unsigned[chromo_length])==NULL)
		cout<<"can't allocate more memory.\n";
}

RandomNumber::RandomNumber (unsigned long s)     //类函数定义
{
    if (s == 0)
        randSeed = time(0); 
    else
        randSeed = s;       
}

unsigned short RandomNumber::Random (unsigned long n)     //类函数定义
{
    randSeed = multiplier * randSeed + adder;
    return (unsigned short)((randSeed >> 16)  % n);
}

float randomperc()           //随机产生一个0到1之间的小数
{
	unsigned a;
	float count;
	a=impor.Random(10000);
	count=(float)a/10000;
	return count;
}

int rnd(int low,int high)         //随机产生一个low到high之间的整数
{
	int i;
	i=(int)(randomperc()*(high-low+1)+low);
	if(i>high)
		i=high;
	return i;
}

void fitness(struct individual *critter)     //计算适应度函数
{
	int *array;
	int temp;
	int h=0;
	double sum=0.0;
	
	char *alignment[sequence_number];		//定义alignment序列
	
	if((array=new int[chromosize])==NULL)
		cout<<"can't allocate more memory.\n";

	for(int w=0;w<sequence_number;w++)
	{
		if((alignment[w]=new char[chromosize+min_sequence_length])==NULL)
			cout<<"can't allocate more memory.\n";
	}

	for(int i=0;i<sequence_number;i++)
	{
		for(int j=0;j<chromosize-(sequence_length[i]-min_sequence_length);j++)
			array[j]=critter->chromosome[j+h];	//将染色体片断的值放入临时数组array中
		h+=chromosize-(sequence_length[i]-min_sequence_length);

		for(int m=chromosize-(sequence_length[i]-min_sequence_length);m>1;m--)		//冒泡排序 使得array数组中的值从小到大排列
			for(int n=0;n<m-1;n++)
				if(array[n]>array[n+1])
				{
					temp=array[n+1];
					array[n+1]=array[n];
					array[n]=temp;
				}
		
		for(int l=0;l<sequence_length[i];l++)		//将sequence中的值放入alignment中
			alignment[i][l]=sequence[i][l];

		for(int k=chromosize-1-(sequence_length[i]-min_sequence_length);k>=0;k--)		//将GAP即'_'插入alignment中
		{
			if(array[k]>(sequence_length[i]+(chromosize-1-(sequence_length[i]-min_sequence_length)-k)))
					alignment[i][sequence_length[i]+(chromosize-1-(sequence_length[i]-min_sequence_length)-k)]='-';
			else
			{
				for(int m=chromosize+min_sequence_length-1;m>array[k];m--)				
					alignment[i][m]=alignment[i][m-1];
				alignment[i][array[k]]='-';
			}
		}
	}
	
	for(int x=0;x<sequence_number;x++)		//计算所生成的alignment比较结果,即适应度
		for(int y=1;y<sequence_number;y++)
			if(x<y)
			{
				for(int p=0;p<chromosize+min_sequence_length;p++)
				{
					if(alignment[x][p]==alignment[y][p])
						continue;
					if((alignment[x][p]=='-')||(alignment[y][p]=='-'))
						sum+=1.00;
					else if((alignment[x][p]=='a')&&(alignment[y][p]=='g'))
							sum+=0.45;
					else if((alignment[x][p]=='g')&&(alignment[y][p]=='a'))
							sum+=0.45;
					else if((alignment[x][p]=='u')&&(alignment[y][p]=='c'))
							sum+=0.45;
					else if((alignment[x][p]=='c')&&(alignment[y][p]=='u'))
							sum+=0.45;
					else	sum+=0.77;
				}
			}
	
	critter->fitness=sum;
	
	delete[] array;

	for(int n=0;n<sequence_number;n++)
		delete[] alignment[n];
}

void  initpop()       //随即初始化种群
{
	int j,k,h;
		
	/*oldpop[popsize-1].chromosome[0]=0;
	oldpop[popsize-1].chromosome[1]=0;
	oldpop[popsize-1].chromosome[2]=0;
	oldpop[popsize-1].chromosome[3]=11;
	oldpop[popsize-1].chromosome[4]=14;
	oldpop[popsize-1].chromosome[5]=28;
	oldpop[popsize-1].chromosome[6]=0;
	oldpop[popsize-1].chromosome[7]=0;
	oldpop[popsize-1].chromosome[8]=0;
	oldpop[popsize-1].chromosome[9]=11;
	oldpop[popsize-1].chromosome[10]=14;
	oldpop[popsize-1].chromosome[11]=28;
	oldpop[popsize-1].chromosome[12]=0;
	oldpop[popsize-1].chromosome[13]=0;
	oldpop[popsize-1].chromosome[14]=0;
	oldpop[popsize-1].chromosome[15]=11;
	oldpop[popsize-1].chromosome[16]=14;
	oldpop[popsize-1].chromosome[17]=28;
	oldpop[popsize-1].chromosome[18]=0;
	oldpop[popsize-1].chromosome[19]=0;
	oldpop[popsize-1].chromosome[20]=0;
	oldpop[popsize-1].chromosome[21]=11;
	oldpop[popsize-1].chromosome[22]=14;
	oldpop[popsize-1].chromosome[23]=28;
	oldpop[popsize-1].chromosome[24]=0;
	oldpop[popsize-1].chromosome[25]=0;
	oldpop[popsize-1].chromosome[26]=0;
	oldpop[popsize-1].chromosome[27]=11;
	oldpop[popsize-1].chromosome[28]=14;
	oldpop[popsize-1].chromosome[29]=28;
	oldpop[popsize-1].chromosome[30]=0;
	oldpop[popsize-1].chromosome[31]=0;
	oldpop[popsize-1].chromosome[32]=0;
	oldpop[popsize-1].chromosome[33]=11;
	oldpop[popsize-1].chromosome[34]=14;
	oldpop[popsize-1].chromosome[35]=28;
	oldpop[popsize-1].chromosome[36]=0;
	oldpop[popsize-1].chromosome[37]=13;
	oldpop[popsize-1].chromosome[38]=16;
	oldpop[popsize-1].chromosome[39]=30;
	oldpop[popsize-1].chromosome[40]=0;
	oldpop[popsize-1].chromosome[41]=13;
	oldpop[popsize-1].chromosome[42]=16;
	oldpop[popsize-1].chromosome[43]=30;
	oldpop[popsize-1].chromosome[44]=0;
	oldpop[popsize-1].chromosome[45]=13;
	oldpop[popsize-1].chromosome[46]=16;
	oldpop[popsize-1].chromosome[47]=30;
	oldpop[popsize-1].chromosome[48]=0;
	oldpop[popsize-1].chromosome[49]=13;

⌨️ 快捷键说明

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