matlab 程序实现 模拟退火算法程序 函数求极值(引用后修改)
2015-04-19 21:53
417 查看
代码:http://blog.sina.com.cn/s/blog_6377a31001019foe.html
%matlab 程序实现 模拟退火算法程序 函数求极值(引用后修改,感谢 ARMYLAU)
%使用模拟退火法求函数f(x,y) = 3*cos(xy) + x + y2的最小值
%解:根据题意,我们设计冷却表进度表为:
%即初始温度为30
%衰减参数为0.95
%马可夫链长度为10000
%Metropolis的步长为0.02
%结束条件为根据上一个最优解与最新的一个最优解的之差小于某个容差。
%使用METROPOLIS接受准则进行模拟, 程序如下
%* 日期:2012-11-29
%* 作者:steven
%* EMAIL:hxs2004@126.com
%* 结束条件为两次最优解之差小于某小量
function [BestX,BestY]=SimulateAnnealing1
clear;
clc;
%// 要求最优值的目标函数,搜索的最大区间
XMAX= 4;
YMAX = 4;
%冷却表参数
MarkovLength = 10000; %// 马可夫链长度
DecayScale = 0.95; %// 衰减参数
StepFactor = 0.02; %// 步长因子
Temperature=30; %// 初始温度
Tolerance = 1e-8; %// 容差
AcceptPoints = 0.0; %// Metropolis过程中总接受点
rnd =rand;
% 随机选点 初值设定
PreX = -XMAX * rand ;
PreY = -YMAX * rand;
PreBestX = PreX;
PreBestY = PreY;
PreX = -XMAX * rand ;
PreY = -YMAX * rand;
BestX = PreX;
BestY = PreY;
% 每迭代一次退火一次(降温), 直到满足迭代条件为止
mm=abs( ObjectFunction( BestX,BestY)-ObjectFunction (PreBestX,PreBestY));
while mm > Tolerance
Temperature=DecayScale*Temperature;
AcceptPoints = 0.0;
% 在当前温度T下迭代loop(即MARKOV链长度)次
for i=0:MarkovLength:1
% 1) 在此点附近随机选下一点
p=0;
while p==0
NextX = PreX + StepFactor*XMAX*(rand-0.5);
NextY = PreY+ StepFactor*YMAX*(rand-0.5);
if p==(~(NextX >= -XMAX && NextX <= XMAX && NextY>= -YMAX && NextY <= YMAX))
p=1;
end
end
% 2) 是否全局最优解
if (ObjectFunction(BestX,BestY) >ObjectFunction(NextX,NextY))
% 保留上一个最优解
PreBestX =BestX;
PreBestY = BestY;
% 此为新的最优解
BestX=NextX;
BestY=NextY;
end
% 3) Metropolis过程
if( ObjectFunction(PreX,PreY) - ObjectFunction(NextX,NextY) >0 )
%// 接受, 此处lastPoint即下一个迭代的点以新接受的点开始
PreX=NextX;
PreY=NextY;
AcceptPoints=AcceptPoints+1;
else
changer = -1 * ( ObjectFunction(NextX,NextY) -ObjectFunction(PreX,PreY) ) / Temperature ;
rnd=rand;
p1=exp(changer);
double (p1);
if p1 >rand %// 不接受, 保存原解
PreX=NextX;
PreY=NextY;
AcceptPoints=AcceptPoints+1;
end
end
end
mm=abs( ObjectFunction( BestX,BestY)-ObjectFunction (PreBestX,PreBestY));
end
disp('最小值在点:');
BestX
BestY
disp( '最小值为:{0}');
ObjectFunction(BestX, BestY)
end
****************************************************
子函数,目标函数值计算
function value=ObjectFunction(x,y)
value=3*cos(x*y)+x+y*y;
end
%matlab 程序实现 模拟退火算法程序 函数求极值(引用后修改,感谢 ARMYLAU)
%使用模拟退火法求函数f(x,y) = 3*cos(xy) + x + y2的最小值
%解:根据题意,我们设计冷却表进度表为:
%即初始温度为30
%衰减参数为0.95
%马可夫链长度为10000
%Metropolis的步长为0.02
%结束条件为根据上一个最优解与最新的一个最优解的之差小于某个容差。
%使用METROPOLIS接受准则进行模拟, 程序如下
%* 日期:2012-11-29
%* 作者:steven
%* EMAIL:hxs2004@126.com
%* 结束条件为两次最优解之差小于某小量
function [BestX,BestY]=SimulateAnnealing1
clear;
clc;
%// 要求最优值的目标函数,搜索的最大区间
XMAX= 4;
YMAX = 4;
%冷却表参数
MarkovLength = 10000; %// 马可夫链长度
DecayScale = 0.95; %// 衰减参数
StepFactor = 0.02; %// 步长因子
Temperature=30; %// 初始温度
Tolerance = 1e-8; %// 容差
AcceptPoints = 0.0; %// Metropolis过程中总接受点
rnd =rand;
% 随机选点 初值设定
PreX = -XMAX * rand ;
PreY = -YMAX * rand;
PreBestX = PreX;
PreBestY = PreY;
PreX = -XMAX * rand ;
PreY = -YMAX * rand;
BestX = PreX;
BestY = PreY;
% 每迭代一次退火一次(降温), 直到满足迭代条件为止
mm=abs( ObjectFunction( BestX,BestY)-ObjectFunction (PreBestX,PreBestY));
while mm > Tolerance
Temperature=DecayScale*Temperature;
AcceptPoints = 0.0;
% 在当前温度T下迭代loop(即MARKOV链长度)次
for i=0:MarkovLength:1
% 1) 在此点附近随机选下一点
p=0;
while p==0
NextX = PreX + StepFactor*XMAX*(rand-0.5);
NextY = PreY+ StepFactor*YMAX*(rand-0.5);
if p==(~(NextX >= -XMAX && NextX <= XMAX && NextY>= -YMAX && NextY <= YMAX))
p=1;
end
end
% 2) 是否全局最优解
if (ObjectFunction(BestX,BestY) >ObjectFunction(NextX,NextY))
% 保留上一个最优解
PreBestX =BestX;
PreBestY = BestY;
% 此为新的最优解
BestX=NextX;
BestY=NextY;
end
% 3) Metropolis过程
if( ObjectFunction(PreX,PreY) - ObjectFunction(NextX,NextY) >0 )
%// 接受, 此处lastPoint即下一个迭代的点以新接受的点开始
PreX=NextX;
PreY=NextY;
AcceptPoints=AcceptPoints+1;
else
changer = -1 * ( ObjectFunction(NextX,NextY) -ObjectFunction(PreX,PreY) ) / Temperature ;
rnd=rand;
p1=exp(changer);
double (p1);
if p1 >rand %// 不接受, 保存原解
PreX=NextX;
PreY=NextY;
AcceptPoints=AcceptPoints+1;
end
end
end
mm=abs( ObjectFunction( BestX,BestY)-ObjectFunction (PreBestX,PreBestY));
end
disp('最小值在点:');
BestX
BestY
disp( '最小值为:{0}');
ObjectFunction(BestX, BestY)
end
****************************************************
子函数,目标函数值计算
function value=ObjectFunction(x,y)
value=3*cos(x*y)+x+y*y;
end
相关文章推荐
- Matlab的函数中如何实现按引用传递参数
- 一个简单求和函数的matlab实现(带程序耗时功能)
- 在MATLAB中采用M文件实现对Simulink中的S函数程序实现自动调参数
- 使用OpenCV中的filter2D函数精确实现matlab中的imfilter函数(已测)
- 设计一个函数,既能计算圆的周长也能计算圆的面积(分别用指针和引用实现)
- 机器学习中的逻辑回归和线性回归的matlab程序实现
- C++调用matlab函数实现微信自动跳一跳
- MATLAB中应用pwelch()函数实现功率谱估计——官方说明中文文档
- MATLAB实现规范化(normlize)数据的函数实现
- 修改程序函数
- linux下c程序调用reboot函数实现直接重启
- matlab实现S函数的五种方式
- 内部函数引用外部函数的同名变量或者全局变量,并且对这个变量有修改的报错原因
- matlab linspace函数C++实现
- C++引用实现函数传递数据
- 数字图像处理MATLAB程序实现
- 指针的引用做函数参数实现封装
- JS自定义功能函数实现动态添加网址参数修改网址参数值
- 微信小程序 引用其他js文件实现代码