📄 geneexpression.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 + -