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

📄 退火.cpp

📁 模拟退火模型算法
💻 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 + -