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

📄 geneexpression.cpp

📁 基因表达式
💻 CPP
字号:
 //headfile
#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#include<math.h> 
    
//函数声明
void initpop();//种群初始化
void fitness(int fi,int x);//计算适应度函数
void select(double sumfitness);//轮盘赌函数
void reproduction();//复制函数
void crossover();//交叉函数
void mutation();//变异函数

//常量定义
const p_size=4;//种群数量
const lchrom=6;//染色体字符串长度
const generation=5;//迭代次数

//全局变量
int x[p_size];//存放应复制的染色体
 struct ch{
	int chrom[lchrom];
	double fit;
	double pick;
	double sumpick;
};//种群结构 
double pc;//交叉概率
double pm;//变异概率
int xsite;//交叉点
int gen;//种群的代数


 ch p[p_size];//定义p[]

 void main(){//main 函数
	 srand((unsigned)time(NULL));
	 int i,j,k;
	 int m;
	 int x;
	 double sumfitness;
	 pc=0.6;
	 pm=0.05;

	//种群初始化函数调用
      initpop();

	gen=1;//初始化代数
	while(gen<=generation){
	//二进制转化为十进制并输出
	for(i=0;i<p_size;i++)
	{	x=0;
    //	cout<<"chrom real value:\n";

    	for(j=0;j<lchrom;j++)
		{ m=1;
        	for(k=j;k<lchrom-1;k++)
		    m=m*2;
          x=x+p[i].chrom[j]*m;}//for

    //cout<<x<<endl;
	   fitness(i,x);//求适度值函数调用
	   }//for

	//求适度总值
	sumfitness=0;
//	cout<<"output p.fit:\n";
	for(i=0;i<p_size;i++){
		sumfitness=sumfitness+p[i].fit;
	//	cout<<p[i].fit<<endl;
	}

	cout<<"output sumfitness:";
	cout<<sumfitness<<endl;

   //轮盘赌算法调用
    select(sumfitness);

  //复制函数调用
   reproduction();
	
  //交叉函数调用
   crossover();

  //变异函数调用
  mutation();
  gen++;
	}//while
//输出最后一代的适应值
cout<<"the last p.fit:\n";
for(i=0;i<p_size;i++)
cout<<p[i].fit<<endl;
}//main


void initpop(){//种群初始化并输出
      int i,j;

	
	for(i=0;i<p_size;i++)
		for(j=0;j<lchrom;j++)
			p[i].chrom[j]=rand()%2;
	cout<<"output  the first string:\n";
	for(i=0;i<p_size;i++)
	{	for(j=0;j<lchrom;j++)
			cout<<p[i].chrom[j];
	cout<<endl;}
}//initpop

void fitness(int fi,int x){
	
	p[fi].fit=x*x-2*x+1;
}//fitness




void  select(double sumfitness){
	int i,j;

	double a[p_size];
//	cout<<sumfitness<<endl;
//for(i=0;i<p_size;i++)
//cout<<p[i].fit<<endl;
	for(i=0;i<p_size;i++)
		p[i].pick=p[i].fit/sumfitness;
//	cout<<"output p.pick:\n";
//	for(i=0;i<p_size;i++)
	//	cout<<p[i].pick<<endl;
	for(i=0;i<p_size;i++){
	p[i].sumpick=0;
		for(j=0;j<=i;j++)
			p[i].sumpick=p[i].sumpick+p[j].pick;
	}
//	cout<<"output p.sumpick:\n";
//	for(i=0;i<p_size;i++)
//		cout<<p[i].sumpick<<endl;

      //cout<<"random number:\n";
		for(i=0;i<p_size;i++){
		a[i]=(rand()%10001)*0.0001;
	//	cout<<a[i]<<endl;
		}


		for(i=0;i<p_size;i++)
			for(j=0;j<p_size;j++)
				if(a[i]<=p[j].sumpick)
				{x[i]=j;
				break;}
				cout<<"copy x[]:\n";
	//	for(i=0;i<p_size;i++)
	//		cout<<x[i]<<endl;
				

}//select
void reproduction(){
	int i,j;
	int temp[p_size][lchrom];
	for(i=0;i<p_size;i++)
		for(j=0;j<lchrom;j++)
		temp[i][j]=p[i].chrom[j];
	for(i=0;i<p_size;i++)
		for(j=0;j<lchrom;j++)
			
		p[i].chrom[j]=temp[x[i]][j];

cout<<"reproduct string:\n";
		for(i=0;i<p_size;i++)
		{ for(j=0;j<lchrom;j++)
		
	    cout<<p[i].chrom[j];
	cout<<endl;}

}//reproduction


void crossover(){
	int i,j,k;
	double rnd;
	int temp;
	for(i=0;i<p_size/2;i++)
	{rnd=(rand()%10)*0.1;
	if(rnd<=pc){
		i=rand()%p_size;
		j=rand()%p_size;
		xsite=rand()%lchrom;

		for(k=xsite;k<lchrom;k++)
		{
			temp=p[i].chrom[k];
			p[i].chrom[k]=p[j].chrom[k];
			p[j].chrom[k]=temp;
		}//for
	}//if
	}//for
cout<<"crossover string:\n";
	for(i=0;i<p_size;i++)
	{	for(j=0;j<lchrom;j++)
			cout<<p[i].chrom[j];
	cout<<endl;}
}//crossover

void mutation(){
	int i,j;
	double rnd;
	for(i=0;i<p_size;i++){
		rnd=(rand()%100)*0.01;
		if(rnd<=pm){
			i=rand()%p_size;
			j=rand()%lchrom;
			p[i].chrom[j]=(p[i].chrom[j]+1)%2;
		}//if
	}//for
}//mutation

	




⌨️ 快捷键说明

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