智能算法---模拟退火搜索函数最小值
2016-05-08 23:20
357 查看
Simulated Annealing algorithm 是一种通用的随机搜索算法,是一种理论上的全局优化算法。它模拟了物理的
退火过程,由一个给定的初始高温开始,利用具有概率突跳特性的Metropolis策略在解空间中随机进行搜索,
伴随温度的不断下降重复抽样,直到得到全局最优解。When temperature T is high, the transition probability
from old state to new state is close to one, So SA algorithm can globally search in phase space. If the
temperature is low, the transition probability is close to zero, SA can only search in local phase space.
模拟退火算法是局部邻域搜索的推广,局部邻域搜索算法的结果完全依赖初始解和邻域的结构,而且只能
搜索到局部最优解。
//----------------------
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
//----------------------
#define Maxx 4
#define Minx -4
#define Maxy 4
#define Miny -4
#define TimeStepNum 10000
#define StepLength 0.2 //邻域搜索步长
#define InitTemp 10.0 //开始温度
#define FinalTemp 0.1 //结束温度
//---------------------
double function(int x,int y);
void metropolis( double temp);
//---------------------
double x,y,f;
int main()
{
srand((unsigned)time(NULL));
double temp; //温度
int i;
x=8.0*random()/RAND_MAX-4;
y=8.0*random()/RAND_MAX-4;
f=function(x,y);
for(temp=InitTemp;temp>FinalTemp; temp*=0.99)
{
for(i=0;i<StepLength;i++) metropolis(temp);
}
}
//目标函数
double function(int x,int y)
{
return sin(x*y)+x*x+y*y;
}
//metropolis算法
void metropolis( double temp)
{
double xold = x;
double yold = y;
x=x+2,0*StepLength*(1.0*rand()/RAND_MAX-0.5);
y=y+2,0*StepLength*(1.0*rand()/RAND_MAX-0.5);
if(x<Maxx&&x>Minx&&y<Maxy&&y>Miny)
{
double fnew = function(x,y);
if(exp(-(fnew-f)/temp)<rand()/RAND_MAX)
{
f=fnew;
}
else
{
x=xold;
y=yold;
}
}
}
退火过程,由一个给定的初始高温开始,利用具有概率突跳特性的Metropolis策略在解空间中随机进行搜索,
伴随温度的不断下降重复抽样,直到得到全局最优解。When temperature T is high, the transition probability
from old state to new state is close to one, So SA algorithm can globally search in phase space. If the
temperature is low, the transition probability is close to zero, SA can only search in local phase space.
模拟退火算法是局部邻域搜索的推广,局部邻域搜索算法的结果完全依赖初始解和邻域的结构,而且只能
搜索到局部最优解。
//----------------------
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
//----------------------
#define Maxx 4
#define Minx -4
#define Maxy 4
#define Miny -4
#define TimeStepNum 10000
#define StepLength 0.2 //邻域搜索步长
#define InitTemp 10.0 //开始温度
#define FinalTemp 0.1 //结束温度
//---------------------
double function(int x,int y);
void metropolis( double temp);
//---------------------
double x,y,f;
int main()
{
srand((unsigned)time(NULL));
double temp; //温度
int i;
x=8.0*random()/RAND_MAX-4;
y=8.0*random()/RAND_MAX-4;
f=function(x,y);
for(temp=InitTemp;temp>FinalTemp; temp*=0.99)
{
for(i=0;i<StepLength;i++) metropolis(temp);
}
}
//目标函数
double function(int x,int y)
{
return sin(x*y)+x*x+y*y;
}
//metropolis算法
void metropolis( double temp)
{
double xold = x;
double yold = y;
x=x+2,0*StepLength*(1.0*rand()/RAND_MAX-0.5);
y=y+2,0*StepLength*(1.0*rand()/RAND_MAX-0.5);
if(x<Maxx&&x>Minx&&y<Maxy&&y>Miny)
{
double fnew = function(x,y);
if(exp(-(fnew-f)/temp)<rand()/RAND_MAX)
{
f=fnew;
}
else
{
x=xold;
y=yold;
}
}
}
相关文章推荐
- 动态链接库DLL
- 20145321 实验五实验报告
- CUDA学习笔记三
- 搜狗补刀推出搜狗明医
- 搜狗补刀推出搜狗明医
- Toy Program 基础线程入门 via “extends Thread”
- Jmeter之csv、用户自定义变量以及Query Type分析(八)
- CodeForces 670C Cinema
- 对于已经存在的项目,如何在不改变原来目录结构的情况下,使用maven
- Agent proxy
- hdu-2066 一个人的旅行(最短路spfa)
- java第十周学习总结
- 隐马尔可夫模型学习笔记
- Adnroid多媒体---图片
- JS学习10(DOM扩展)
- 详解Android中Drawable方法
- CodeForces 670B Game of Robots
- Android之Volley框架加载网络图片的三种方式
- 20145232 韩文浩 实验五
- <s:property>的用法