模擬退火算法的基本思想是從一給定解開(kāi)始,從鄰域中隨機(jī)產(chǎn)生另一個(gè)解,接受Metropolis準(zhǔn)則允許目標(biāo)函數(shù)在有限范圍內(nèi)變壞,它由一控制參數(shù)t決定,其作用類似于物理過(guò)程中的溫度T,對(duì)于控制參數(shù)的每一取值,算法持續(xù)進(jìn)行“產(chǎn)生—判斷—接受或舍去”的迭代過(guò)程,對(duì)應(yīng)著固體在某一恒定溫度下的趨于熱平衡的過(guò)程,當(dāng)控制參數(shù)逐漸減小并趨于0時(shí),系統(tǒng)越來(lái)越趨于平衡態(tài),最后系統(tǒng)狀態(tài)對(duì)應(yīng)于優(yōu)化問(wèn)題的全局最優(yōu)解,該過(guò)程也稱為冷卻過(guò)程,由于固體退火必須緩慢降溫,才能使固體在每一溫度下都達(dá)到熱平衡,最終趨于平衡狀態(tài),因此控制參數(shù)t經(jīng)緩慢衰減,才能確保模擬退火算法最終優(yōu)化問(wèn)題的整體最優(yōu)解。
標(biāo)簽:
Metropolis
控制
參數(shù)
模擬退火算法
上傳時(shí)間:
2013-12-25
上傳用戶:cmc_68289287
# include<stdio.h>
# include<math.h>
# define N 3
main(){
float NF2(float *x,float *y);
float A[N][N]={{10,-1,-2},{-1,10,-2},{-1,-1,5}};
float b[N]={7.2,8.3,4.2},sum=0;
float x[N]= {0,0,0},y[N]={0},x0[N]={};
int i,j,n=0;
for(i=0;i<N;i++)
{
x[i]=x0[i];
}
for(n=0;;n++){
//計(jì)算下一個(gè)值
for(i=0;i<N;i++){
sum=0;
for(j=0;j<N;j++){
if(j!=i){
sum=sum+A[i][j]*x[j];
}
}
y[i]=(1/A[i][i])*(b[i]-sum);
//sum=0;
}
//判斷誤差大小
if(NF2(x,y)>0.01){
for(i=0;i<N;i++){
x[i]=y[i];
}
}
else
break;
}
printf("經(jīng)過(guò)%d次雅可比迭代解出方程組的解:\n",n+1);
for(i=0;i<N;i++){
printf("%f ",y[i]);
}
}
//求兩個(gè)向量差的二范數(shù)函數(shù)
float NF2(float *x,float *y){
int i;
float z,sum1=0;
for(i=0;i<N;i++){
sum1=sum1+pow(y[i]-x[i],2);
}
z=sqrt(sum1);
return z;
}
標(biāo)簽:
C語(yǔ)言
編寫(xiě)
迭代
上傳時(shí)間:
2019-10-13
上傳用戶:大萌萌撒