📄 simulated.cpp
字号:
#include<iostream.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
double ObjectFunction(double x,double y)
{
double z=0.0;
z=5.0*sin(x*y)+x*x+y*y;
return z;
}
const double XMAX=4;
const double YMAX=4;
// 冷却表参数
int Length=10000; // loop次数
double DecayScale=0.95; // 衰减参数
double StepFactor=0.02; // 步长因子
double Temperature=100; // 初始温度
double Tolerance=1e-8; // 容差
void main()
{
double PreX,NextX; // prior and next value of x
double PreY,NextY; // prior and next value of y
double PreBestX, PreBestY; // 上一个最优解
double BestX,BestY; // 最终解
PreX=NextX=PreY=NextY=PreBestX=0.0;
PreBestY=PreBestX=PreBestY=BestX=BestY=0.0;
// 随机选点
srand(time(NULL));
PreX=-XMAX+2*XMAX*rand()/(double)RAND_MAX;
PreY=-YMAX+2*YMAX*rand()/(double)RAND_MAX;
PreBestX=BestX=PreX;
PreBestY=BestY=PreY;
// 每迭代一次退火一次(降温), 直到满足迭代条件为止
do
{
Temperature *=DecayScale;
// 在当前温度T下迭代loop次
for (int i=0;i<Length;i++)
{ // 1) 在此点附近随机选下一点
do
{
NextX=PreX+2*StepFactor*XMAX*(rand()/(double)RAND_MAX-0.5);
NextY=PreY+2*StepFactor*YMAX*(rand()/(double)RAND_MAX-0.5);
}while (!(NextX>=-XMAX&&NextX<=XMAX&&NextY>=-YMAX&&NextY<=YMAX));
// 2) 是否全局最优解
if(ObjectFunction(BestX,BestY)>ObjectFunction(NextX,NextY))
{
// 保留上一个最优解
PreBestX =BestX;
PreBestY =BestY;
// 此为新的最优解
BestX=NextX;
BestY=NextY;
}
// 3) Metropolis过程
if(ObjectFunction(PreX,PreY)-ObjectFunction(NextX,NextY)>0)
{ // 接受, 此处lastPoint即下一个迭代的点以新接受的点开始
PreX=NextX;
PreY=NextY;
}
else
{
double change=-1*(ObjectFunction(NextX,NextY)-ObjectFunction(PreX,PreY))/Temperature;
if(exp(change)>rand()/(double)RAND_MAX)
{
PreX=NextX;
PreY=NextY;
}
}
}
}while(fabs(ObjectFunction(BestX,BestY)-ObjectFunction(PreBestX, PreBestY))>Tolerance);
printf("最小值在点:%.10f,%.10f",BestX,BestY);
putchar('\n');
printf("最小值为:%.10f",ObjectFunction(BestX,BestY));
putchar('\n');
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -