利用遗传算法求解最值程序码,仅供参考 点击:799 | 回复:1



若此笔名未被注册

    
  • 精华:10帖
  • 求助:1帖
  • 帖子:294帖 | 3225回
  • 年度积分:0
  • 历史总积分:6058
  • 注册:2003年3月30日
发表于:2007-01-24 21:36:00
楼主
#include 
#include 

#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{
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{
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{
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{
var_1=var_2=0;
for(j=0;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;inewfit[i]=-1;

for(i=0;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;ioldfit[i]=-1;

for(i=0;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;itemp=(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{
/*//r1,r2是随机要交叉的染色体,ipalce是交叉的位置*/
r1=rand()%M;
r2=rand()%M;
iplace=rand()%Cleng



若此笔名未被注册

  • 精华:10帖
  • 求助:1帖
  • 帖子:294帖 | 3225回
  • 年度积分:0
  • 历史总积分:6058
  • 注册:2003年3月30日
发表于:2007-01-25 20:48:00
1楼
怎么没有发表点意见的????

热门招聘
相关主题

官方公众号

智造工程师