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

📄 simulated.cpp

📁 氟化钙加工业结构固化剂固化剂共和国海军 固化剂固化剂固化剂共结构法国鬼画符借古讽今国防军地方官基督教
💻 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 + -