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

📄 sa.txt

📁 模拟退火基本模块
💻 TXT
📖 第 1 页 / 共 2 页
字号:
{ 
if(panduan[j]==0) 
child2.chrom[j]=parent1.chrom[j]; 
else 
child2.chrom[j]=parent2.chrom[j]; 
} 
//for(j=0;j<lchrom;j++)//////////////// 
//{ 
// cout<<child1.chrom[j];///////////// 
// } 
//cout<<endl;//////////////// 
// system("pause");//////////////// 
child1.geti=yima(child1.chrom); 
child2.geti=yima(child2.chrom); 
delete [] child2.chrom; 
delete [] child1.chrom; 
delete [] parent2.chrom; 
delete [] parent1.chrom; 
delete [] panduan; 
} 
else 
{ 
for(j=0;j<lchrom;j++) 
{ 
child1.chrom[j]=parent1.chrom[j]; 
child2.chrom[j]=parent2.chrom[j]; 
} 
child1.geti=yima(child1.chrom); 
child2.geti=yima(child2.chrom); 
delete [] child2.chrom; 
delete [] child1.chrom; 
delete [] parent2.chrom; 
delete [] parent1.chrom; 
delete [] panduan; 
} 
} 
void bianyi(individual &child)//变异 
{ 
child.chrom=new unsigned[lchrom]; 
//cout<<"变异"<<endl; 
bianma(child.geti,child.chrom); 
for(int i=0;i<lchrom;i++) 
if(flipm(child.fitness)) 
{ 
if(child.chrom[i]=0) 
child.chrom[i]=1; 
else 
child.chrom[i]=0; 
} 
child.geti=yima(child.chrom); 
delete [] child.chrom; 
} 
void bianma(double bianliang,unsigned *p)//编码 
{ 
unsigned *q; 
unsigned *gray; 
q=new unsigned[lchrom]; 
gray=new unsigned[lchrom]; 
int x=0; 
int i=0,j=0; 
if(bianliang<zuobianjie)/////////////////// 
{ 
cout<<"bianliang:"<<bianliang<<endl;///////// 
system("pause"); 
} 
//cout<<youbianjie-(zuobianjie)<<endl; 
//system("pause"); 
x=(bianliang-(zuobianjie))*((pow(2,lchrom)-1)/(youbianjie-(zuobianjie))); 
//cout<<x<<endl;/////////// 
if(x<0) 
system("pause");/////////// 
for(i=0;i<lchrom;i++) 
{ 
q[i]=0; 
p[i]=0; 
} 
i=0; 
while (x!=0&&(i!=lchrom)) 
{ 
q[i]=(unsigned)(x%2); 
x=x/2; 
i++; 
} 
// for(i=0;i<lchrom;i++)////////////////// 
// cout<<q[i];/////////////// 
// cout<<endl;/////////// 
int w=lchrom-1; 
if(q[w]!=0&&q[w]!=1) 
system("pause"); 
for(j=0;j<lchrom&&w>0;j++) 
{ 
p[j]=q[w]; 
w--; 
} 
//cout<<"yuanma"<<endl; 
//for(j=0;j<lchrom;j++)/////////// 
// cout<<p[j];//////// 
//cout<<endl;//////////////////// 
gray[0]=p[0]; 
for(j=1;j<lchrom;j++) 
{ 
if(p[j-1]==p[j]) 
gray[j]=0; 
else if(p[j-1]!=p[j]) 
gray[j]=1; 
} 
for(j=0;j<lchrom;j++) 
p[j]=gray[j]; 
//cout<<"geleima"<<endl; 
//for(j=0;j<lchrom;j++)/////////// 
// cout<<p[j];//////// 
//cout<<endl;//////////////////// 
//system("pause");/////////// 

delete [] gray; 
delete [] q; 
} 
double yima(unsigned *p) //译码 
{ 

int i=0; 
int x=0; 
unsigned *q; 
q=new unsigned[lchrom]; 
q[0]=p[0]; 
for(int j=1;j<lchrom;j++) 
{ 
if(q[j-1]==p[j]) 
q[j]=0; 
else if(q[j-1]!=p[j]) 
q[j]=1; 
} 
 
for(i=0;i<lchrom;i++) 
x=x+q[i]*pow(2,(lchrom-i-1)); 
if(x<0) 
{ 
cout<<"译码出错1"<<endl; 
system("pause"); 
} 
//cout<<"x:"<<x<<endl; 
double bianliang; 
//cout<<pow(2,22)<<endl; 
//cout<<2000*x<<endl; 
//cout<<(x*(2000/(pow(2,22)-1)))<<endl; 
bianliang=(x*((youbianjie-(zuobianjie))/(pow(2,lchrom)-1)))+zuobianjie; 
if(bianliang<zuobianjie) 
{ 
cout<<"译码出错2"<<endl; 
system("pause"); 
} 
delete [] q; 
return bianliang; 
} 
double ran1(long *idum) 
{ 
int j; 
long k; 
static long idum2=123456789; 
static long iy=0; 
static long iv[NTAB]; 
float temp; 
if (*idum <= 0) 
{ 
if (-(*idum) < 1) *idum=1; 
else *idum = -(*idum); 
idum2=(*idum); 
for (j=NTAB+7;j>=0;j--) 
{ 
k=(*idum)/IQ1; 
*idum=IA1*(*idum-k*IQ1)-k*IR1; 
if (*idum < 0) *idum += IM1; 
if (j < NTAB) iv[j] = *idum; 
} 
iy=iv[0]; 
} 
k=(*idum)/IQ1; 
*idum=IA1*(*idum-k*IQ1)-k*IR1; 
if (*idum < 0) *idum += IM1; 
k=idum2/IQ2; 
idum2=IA2*(idum2-k*IQ2)-k*IR2; 
if (idum2 < 0) idum2 += IM2; 
j=iy/NDIV; 
iy=iv[j]-idum2; 
iv[j] = *idum; 
if (iy < 1) iy += IMM1; 
if ((temp=AM*iy) > RNMX) return RNMX; 
else return temp; 
} 
double suijibianli()//随机遍历 
{ 
double i=ran1(a); 
while(i>zhizhenjuli) 
{ 
i=ran1(a); 
} 
//cout<<i<<endl;////////////// 
return i; 
} 
int fuzhi(float p)//复制 
{ 
int i; 
double sum=0; 
if(sumfitness!=0) 
{ 
for(i=0;(sum<p)&&(i<zhongqunshu);i++) 
sum+=nowpop[i].fitness/sumfitness; 
} 
else 
i=rnd(1,zhongqunshu1); 
return(i-1); 
} 

int rnd(int low, int high) /*在整数low和high之间产生一个随机整数*/ 
{ 
int i; 
if(low >= high) 
i = low; 
else 
{ 
i =(int)((ran1(a) * (high - low + 1)) + low); 
if(i > high) i = high; 
} 
return(i); 
} 
int flipc(double p,double q)//判断是否交叉 
{ 
double pc1=0.9,pc2=0.6; 
if((p-q)>0) 
{ 
if(p>=avefitness) 
{ 
pc=pc1-(pc1-pc2)*(p-avefitness)/(maxfitness-avefitness); 
} 
else 
pc=pc1; 
} 
else 
{ 
if(q>=avefitness) 
{ 
pc=pc1-(pc1-pc2)*(q-avefitness)/(maxfitness-avefitness); 
} 
else 
pc=pc1; 
} 
if(ran1(a)<=pc) 
return(1); 
else 
return(0); 
} 
int flipm(double p)//判断是否变异 
{ 
double pm1=0.001,pm2=0.0001; 
if(p>=avefitness) 
{ 
pm=(pm1-(pm1-pm2)*(maxfitness-p)/(maxfitness-avefitness)); 
} 
else 
pm=pm1; 
if(ran1(a)<=pm) 
return(1); 
else 
return(0); 
} 
void glp(int n,int s,int *h,int (*q)[1],float (*xx)[1])//glp 
{ 
int i=0,j=0; 
//求解q 
for(i=0;i<n;i++) 
{ 
for(j=0;j<s;j++) 
{ 
*(*(q+i)+j)=((i+1)*(*(h+j)))%n; 
} 
} 
i=n-1; 
for(j=0;j<s;j++) 
{ 
*(*(q+i)+j)=n; 
} 
//求解x 
for(i=0;i<n;i++) 
{ 
for(j=0;j<s;j++) 
{ 
*(*(xx+i)+j)=(float)(2*(*(*(q+i)+j))-1)/(2*n); 
} 
} 
} 
BOOL Exist(int Val, int Num, int *Array)//判断一个数是否在一个数组的前Num个数中 
{ 
BOOL FLAG = FALSE; 
int i; 
for (i=0; i<Num; i++) 
if (Val == *(Array + i)) 
{ 
FLAG = TRUE; 
break; 
} 
return FLAG; 
}

⌨️ 快捷键说明

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