?? anneal.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 + -