📄 模拟退火.cpp
字号:
#include <iostream.h>
#include <math.h>
#include <sys/timeb.h>
#include <sys/types.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#define TMAX 200
#define TMIN 0.000001
#define M 500
#define N 5
#define PI 3.1415926
void InitialRand()
{
struct _timeb tstruct;
_ftime(&tstruct);
srand(tstruct.time);
}
double randnum()
{
double g;
g=((rand()%10000)/10000.0)*(1.0-0.0)+0.0 ;
return g;
}
double randnum1()
{
double a;
a=((rand()%10000)/10000.0)*(2.12+2.12)-2.12 ;
return a;
}
double fx_value(double x[N])
{
int i;
double sum=0,value;
for(i=0;i<N;i++)
{
sum=sum+x[i]*x[i]-2*cos(2*PI*x[i]);
}
value=2*N+sum;
return value;
}
void main()
{
int i,j;
double xi[N],xj[N],t=TMAX,xbest[N],fbest;
double fi,fj;
InitialRand();
cout<<"初始值"<<endl;
for(i=0;i<N;i++)
{
xi[i]=randnum1();
xbest[i]=xi[i];
cout<<xi[i]<<endl;
}
cout<<endl;
while(t>=TMIN)
{
for(j=0;j<M;j++)
{
fi=fx_value(xi);
fbest=fi;
for(i=0;i<N;i++)
{
xj[i]=xi[i]+2.0*(randnum()-0.5);//在较大的范围内搜索
if(xj[i]>2.12||xj[i]<-2.12)
{
xj[i]=xi[i]; //当产生的邻域值超过可行解
} //范围时令其不变
}
fj=fx_value(xj);
if((fj-fi)<=0.0)
{
for(i=0;i<N;i++)
{
xi[i]=xj[i];
xbest[i]=xj[i];
}
fbest=fj;
}
if(exp((fi-fj)/t)>randnum())
{
for(i=0;i<N;i++)
{
xi[i]=xj[i];
}
}
}
t=0.98*t; //温度的下降设定
}
//输出在大范围内找到的最优值区域
cout<<"经过第一次搜索得到的最好的值"<<endl;
cout<<" "<<fbest<<endl;
cout<<"最好的值所对应的X的值"<<endl;
for(i=0;i<N;i++)
{
cout<<" "<<xbest[i]<<endl;
}
cout<<endl<<endl;
//
//以第一次搜索得到的最好值为初值进行小范围内在搜索
//
t=TMAX;
for(i=0;i<N;i++)
{
xi[i]=xbest[i];
}
while(t>=TMIN)
{
for(j=0;j<M;j++)
{
fi=fx_value(xi);
fbest=fi;
for(i=0;i<N;i++)
{
xj[i]=xi[i]+0.2*(randnum()-0.5);//在小范围内波动
if(xj[i]>2.12||xj[i]<-2.12)
{
xj[i]=xi[i];
}
}
fj=fx_value(xj);
if((fj-fi)<=0.0)
{
for(i=0;i<N;i++)
{
xi[i]=xj[i];
xbest[i]=xj[i];
}
fbest=fj;
}
}
t=0.98*t;
}
cout<<"经过第二次搜索得到的最好的值"<<endl;
cout<<" "<<fbest<<endl;
cout<<"最好的值所对应的X的值"<<endl;
for(i=0;i<N;i++)
{
cout<<" "<<xbest[i]<<endl;
}
cout<<endl<<endl;
//
//以第二次搜索得到的最好值为初值进行更小范围内在搜索
//
t=TMAX;
for(i=0;i<N;i++)
{
xi[i]=xbest[i];
}
while(t>=TMIN)
{
for(j=0;j<M;j++)
{
fi=fx_value(xi);
fbest=fi;
for(i=0;i<N;i++)
{
xj[i]=xi[i]+0.02*(randnum()-0.5);
if(xj[i]>2.12||xj[i]<-2.12)
{
xj[i]=xi[i];
}
}
fj=fx_value(xj);
if((fj-fi)<=0.0)
{
for(i=0;i<N;i++)
{
xi[i]=xj[i];
xbest[i]=xj[i];
}
fbest=fj;
}
}
t=0.98*t;
}
cout<<"经过模拟退火算法得到的最优值"<<endl;
cout<<" "<<fbest<<endl;
cout<<"最优值所对应的X的值"<<endl;
for(i=0;i<N;i++)
{
cout<<" "<<xbest[i]<<endl;
}
cout<<endl<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -