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

📄 anneal.txt

📁 用c编的关于退火算法的程序
💻 TXT
字号:
#include <stdlib.h>
#include <time.h>
#include <fstream.h>
#include <math.h>
#include <stdio.h>

/////////////////////////////////////////////////
//产生(0,1)均匀分布的随机数
double randnum()
{
	double x;
	x = (double) rand()/RAND_MAX;
	return x;
}

//////////////////////////////////////////////////
//目标函数表达式
inline double obfun(double x)
{
	double y;
//	y=pow(x,2)+2*x+3;
//	y=-fabs(sin(3.1415926*(x-3))/3.1415926/(x-3));
	y=2*pow(x,2)-x-1;
	return y;
}

/////////////////////////////////////////////////
//传统的模拟退火算法

double CSA(double x1,double x2)
{
	ofstream outf("data.txt");//输出数据文件,便于matlab画图
	double init_temperature,total_numk,step_size;//定义初始温度,
	//...温度k时循环总次数,步长
	double x,xprevs,ReceivNum;//定义变量当前值,前一个值,内循环的接受数据数
	//初始化SA参数
	init_temperature=0.01;
	total_numk=1000;
	step_size=0.001;
	ReceivNum=50;
	x=(x2-x1)*randnum()+x1;//随机产生变量x
	int k=0;//温度下降次数控制变量	
	double temperature_k=init_temperature;//定义第k次温度
	double best_x;

	//SA算法核心
	do
	{
		xprevs=x;//保留前一个变量值

		//以下三个参数用于估算接受概率
		int rec_num=0;//接受次数计数器
		double temp_i=0;//记录下面for循环的循环次数
		int temp_num=0;//记录fxi<fx的次数

		for(int i=1;i<total_numk&&(rec_num<ReceivNum);i++)
		{
			//产生满足要求的下一个数
			double xi;
			do
			{
				xi=x+(2*randnum()-1)*step_size;
			}
			while(xi<x1||xi>x2);

			
			double fxi=obfun(xi);
			double fx=obfun(x);
			if(fxi<fx)
			{best_x=xi;x=xi;rec_num++;temp_num++;}//函数值小的直接进入下次迭代
			else if(exp((fx-fxi)/temperature_k)>randnum())
			{	x=xi;rec_num++;}//以概率的形式接受使函数值变大的数
		}
		temp_i=i-1;
		outf<<x-xprevs<<"    "<<obfun(x)<<"    "<<temperature_k<<"    "
			<<(rec_num-temp_num)/(temp_i-temp_num)<<endl;
		k++;
		temperature_k=init_temperature/(k+1);//温度下降原则
	}
	while(k<5000||fabs(best_x-0.25)<0.001);
	outf<<flush;outf.close();//关闭文件
	return best_x;
}

int main()
{
	srand( (unsigned)time(NULL) );
	ofstream outf1("result.txt");
	double x1,x2;
	cout<<"请输入数据"<<endl;
	cin>>x1>>x2;
	double y;
	for(int i=0;i<20;i++)
	{
		y=CSA(x1,x2);
			cout<<"("<<y<<"  "<<obfun(y)<<")"<<endl;
			outf1<<y<<"  "<<obfun(y)<<endl;
	}
	outf1<<flush;outf1.close();//关闭文件
	getchar();
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -