📄 ga.cpp
字号:
// 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 + -