模擬退火算法的基本思想是從一給定解開始,從鄰域中隨機產生另一個解,接受Metropolis準則允許目標函數在有限范圍內變壞,它由一控制參數t決定,其作用類似于物理過程中的溫度T,對于控制參數的每一取值,算法持續進行“產生—判斷—接受或舍去”的迭代過程,對應著固體在某一恒定溫度下的趨于熱平衡的過程,當控制參數逐漸減小并趨于0時,系統越來越趨于平衡態,最后系統狀態對應于優化問題的全局最優解,該過程也稱為冷卻過程,由于固體退火必須緩慢降溫,才能使固體在每一溫度下都達到熱平衡,最終趨于平衡狀態,因此控制參數t經緩慢衰減,才能確保模擬退火算法最終優化問題的整體最優解。
標簽:
Metropolis
控制
參數
模擬退火算法
上傳時間:
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++){
//計算下一個值
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("經過%d次雅可比迭代解出方程組的解:\n",n+1);
for(i=0;i<N;i++){
printf("%f ",y[i]);
}
}
//求兩個向量差的二范數函數
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;
}
標簽:
C語言
編寫
迭代
上傳時間:
2019-10-13
上傳用戶:大萌萌撒