📄 退火.cpp
字号:
#include "iostream.h"
#include "stdlib.h"
#include "math.h"
#include "time.h"
//解出函数y=x1^2+x2^2的最小值。
double myabs(double x)
{
if(x<0)
x=-x;
return x;
}
double _random(void)
{
int a;
double r;
a=rand()%32767;
r=(a+0.00)/32767.00;
return r;
}
double _avg(double a,double b)
{
double _random(void);
return a+_random()*(b-a);
}
double func(double x1,double x2)
{
double y;
return y=x1*x1+x2*x2;
}
void main()
{
double x[2];
double Tx[2];
double Bestx[2];
double low[2]={-2,-2};
double up[2]={2,2};
x[0]=-1;
x[1]=-2;
double y;
srand( (unsigned)time( NULL ) );
y=func(x[0],x[1]);
int i,j;
for(i=0;i<2;i++)
{
Bestx[i]=x[i];
}
double T=1;
double min=y;
for(i=0;i<100;i++)//降温次数10次
{
for(j=0;j<200;j++)//每个温度下的执行次数
{
double temp;
for(int s=0;s<2;s++)
{
Tx[s]=_avg(low[s],up[s])*T;
}
temp=func(Tx[0],Tx[1]);
if(temp<y)
{
y=temp;
int k;
for(k=0;k<2;k++)
x[k]=Tx[k];
if(y<=min)
{
min=y;
for(k=0;k<2;k++)
Bestx[k]=x[k];
}
}
else
{
double d=-myabs(temp-y);
if(_avg(0,2)<exp(d/T))
y=temp;
int m;
for(m=0;m<2;m++)
x[m]=Tx[m];
}
}
cout<<"T="<<T<<" y="<<y;
cout<<" x1="<<x[0]<<" x2="<<x[1]<<endl;
T=T*0.9;
}
cout<<"The best is:y="<<min<<" x1="<<Bestx[0]<<" x2="<<Bestx[1]<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -