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

📄 用遗传算求最值.txt

📁 用遗传算求最值,计算种群的适值,并总的返回适度即最后输出的结果
💻 TXT
字号:
#include <stdio.h>
#include <math.h>

#define M 80 /*//种群大小*/
#define T 200 /* //终止代数*/
#define Pc 0.6 /* //交叉概率*/
#define Pm 0.001 /*//变异概率*/
#define Clength 20 /*//定义编码的码长*/

/*//初始化种群*/
/*//将种群的数值映射到长度为10的二进值代码,然后连接生成染色体长度为20*/
void initialize(char newgenetic[][Clength],char oldgenetic[][Clength],int n)
{
float flag1,flag2;/*//用于控制种群随机数的符号*/
float var_x1,var_x2;/*//两个随机数*/
int i,j; /*//i控制种群的个数,j控制每个数值到二进值代码的位置*/
int remainder,quotient; /*//余数,商*/
float temp;
char var_ch1[Clength/2],var_ch2[Clength/2]; /*//对应的两个随机数的长度为10的而进值代码*/
int gclength=Clength;

srand((unsigned)time(NULL));/*//伪随机种子*/

for(i=0;i<n;i++)
{
flag1=(float)rand()/32738;
flag2=(float)rand()/32738;
/*//生成两个随机变量(-2.048,2.048)*/
if (flag1>=0.5) var_x1=2.048*(float)rand()/32738;
else var_x1=-2.048*(float)rand()/32738;
if (flag2>=0.5) var_x2=2.048*(float)rand()/32738;
else var_x2=-2.048*(float)rand()/32738;
/*//第一个变量的转换*/
temp=(var_x1+2.048)*1000/4; /*//扩大1000倍,使数值在(0,4096)上然后4分频*/
quotient=(int)temp % 2;
var_ch1[gclength/2-1]=quotient+48; /*//转化为真正的0或1字符*/
remainder=(int)temp/2; 
for(j=0;j<gclength/2-1;j++)
{
quotient=remainder%2;
remainder=remainder/2;
var_ch1[gclength/2-2-j]=quotient+48; 
}
/*//第二个变量的转换*/
temp=(var_x2+2.048)*1000/4;/*//扩大1000倍,使数值在(0,4096)上然后4分频*/
quotient=(int)temp % 2;
var_ch2[gclength/2-1]=quotient+48;/* //转化为真正的0或1字符*/
remainder=(int)temp/2; 
for(j=0;j<gclength/2-1;j++)
{
quotient=remainder%2;
remainder=remainder/2;
var_ch2[gclength/2-2-j]=quotient+48; 
}
/*//两个变量连接生成染色体长度为20*/
for(j=0;j<=gclength/2-1;j++)
{ newgenetic[i][j]=var_ch1[j]; 
newgenetic[i][gclength/2+j]=var_ch2[j];
oldgenetic[i][j]=var_ch1[j]; 
oldgenetic[i][gclength/2+j]=var_ch2[j];
}

}
}

/*//解码操作*/
void decode(char n_genetic[][Clength],float pop_1[],float pop_2[], int n)
{
int i,j;
float var_1,var_2;

for (i=0;i<n;i++)
{
var_1=var_2=0;
for(j=0;j<Clength/2;j++)
{ var_1=2*var_1+(n_genetic[i][j]-48); 
var_2=2*var_2+(n_genetic[i][j+Clength/2]-48); 
}
pop_1[i]=var_1*4.096/1023-2.048;
pop_2[i]=var_2*4.096/1023-2.048;
}

}
/*//计算适值*/
float evaluate(char newgenetic[][Clength],char oldgenetic[][Clength],float newfit[],float oldfit[],int n)
{
int i;
float pop1[M],pop2[M]; /*//暂存解码后的两个变量*/
float temp;
float var_1,var_2;
/*//新种群适度的计算*/
decode(newgenetic,pop1,pop2,n);

for(i=0;i<n;i++)
newfit[i]=-1;

for(i=0;i<n;i++)
{
var_1=pop1[i];
var_2=pop2[i];
temp=100*(((var_1)*(var_1)-var_2))*(((var_1)*(var_1)-var_2))+(1-var_1)*(1-var_1);
if ( newfit[i] < temp ) newfit[i]=temp;
}

/*//旧种群适度的计算*/
decode(oldgenetic,pop1,pop2,n);

for(i=0;i<n;i++)
oldfit[i]=-1;

for(i=0;i<n;i++)
{
var_1=pop1[i];
var_2=pop2[i];
temp=100*(((var_1)*(var_1)-var_2))*(((var_1)*(var_1)-var_2))+(1-var_1)*(1-var_1);
if ( oldfit[i] < temp ) oldfit[i]=temp;
}

/*//计算最大的适值*/

for(i=0;i<n;i++)
temp=(newfit[i]>oldfit[i])? newfit[i]:oldfit[i];
return(temp);

}


int flip(float possibility)
{
float ppp;
ppp=(float)rand()/32728;
if(ppp<=possibility) return (1);
else return (0);
}

/*//通过交叉.变异和随机算子进行种群的交叉和变异*/
void genetic(char newgenetic[][Clength],char oldgenetic[][Clength],int n)
{
int i,j,r1,r2,iplace,i_place;

/*//从1到n循环,根据交叉适应度选择,进行交叉,组成oldgenetic*/
for(i=0;i<n;i+=2)
{
/*//r1,r2是随机要交叉的染色体,ipalce是交叉的位置*/
r1=rand()%M;
r2=rand()%M;
iplace=rand()%Clength;
if(j=flip(Pc)) /*//以交叉概率进行交叉*/
for(j=iplace;j<Clength;j++)
{
oldgenetic[r1][j]=newgenetic[r2][j];
oldgenetic[r2][j]=newgenetic[r1][j];
} 
}

/*//从1到n循环,对newgenetic进行变异*/
/*//i_palce是变异的位置*/
i_place=rand()%Clength;
for(i=0;i<n;i++)
if(j=flip(Pm)) /*//以变异概率进行变异*/
if(newgenetic[i][i_place]==‘0‘) newgenetic[i][i_place]=‘1‘;
else newgenetic[i][i_place]=‘0‘;
}

/*newgenetic 和oldgenetic 中再次计算评价函数 因为求最大值,所以取评价函数大的进行遗传*/
void statistic(char new_genetic[M][Clength],char old_genetic[M][Clength],float new_fit[],float old_fit[],int n)
{
float temp;
int i,j;
temp=evaluate(new_genetic,old_genetic,new_fit,old_fit,n);
for(i=0;i<n;i++)
if (new_fit[i]<old_fit[i]) 
for(j=0;j<Clength;j++)
new_genetic[i][j]=old_genetic[i][j];

} 


/*//结果的显示*/
void display(float Rosenbrock)
{

printf("
The maximum of Rosenbrock is : ");
printf("%f
",Rosenbrock);
printf("
Press Enter to continue
");
getchar();

}

/*//程序入口*/
void main()
{
float newfitness[M],oldfitness[M];
char newgenetic_code[M][Clength];/*//种群1二进值代码*/
char oldgenetic_code[M][Clength];/*//种群2二进值代码*/
float bestfitness;
int gen; /*//终止控制变量*/

initialize(newgenetic_code,oldgenetic_code,M);/* //初始化种群,使种群的初始值保持在(-2.048,2.048),将种群的数值映射到长度为10的二进值代码*/
for(gen=0;gen<T;gen++)
{
bestfitness=evaluate(newgenetic_code,oldgenetic_code,newfitness,oldfitness,M); /* //计算种群的适值,并总的返回适度即最后输出的结果*/
genetic(newgenetic_code,oldgenetic_code,M); /*//交叉和变异*/
/* //进行统计,选出最优染色体遗传*/
statistic(newgenetic_code,oldgenetic_code,newfitness,oldfitness,M);
}
bestfitness=evaluate(newgenetic_code,oldgenetic_code,newfitness,oldfitness,M);; 
display(bestfitness);

} 

⌨️ 快捷键说明

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