clear all;
clc;
%function [BestX,BestY]=SimulateAnnealing(l)
%%%%%选取起始点并初始化变量%%%%%%%
%使用模拟退火法求函数f(x,y) = 5sin(xy) + x2 + y2的最小值
%%%根据题目的要求,设定冷却进度表
%初始温度t0=100
%衰减步长dt=0.95
%迭代次数(马可夫链)L=1000
%停止条件:上一个最优解与最新的一个最优解的之差小于某个容差。
%设定目标函数,生成一个M函数文件,用于此函数的调用
%function m=ObjectFunction(x,y)
%m=5.0*sin(x*y) + x*x + y*y;
%f=5*sin(x*y)+x.^2+y.^2;
%%%%%搜索的最大区间x,y(-4,4)
XMAX=4;
YMAX=4;
%%%%%%%%%%第一步%%%%%%%%给定冷却参数表%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
MarkovLength=1000; %// 马可夫链长度
DecayScale=0.95; %// 衰减参数
StepFactor =0.02; %// 步长因子
Temperature=100; %// 初始温度
Tolerance =1e-8; %// 容差
AcceptPoints = 0.0; %// Metropolis过程中总接受点
%%%%%%%%第二步%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%随机选择一个初始模型(PreBextX,PreBextY)(BextX,BextY)
PreX=-XMAX*rand;
PreY=-YMAX*rand;
PreBestX=PreX;
PreBestY=PreY;
%%%%计算初始目标函数值
PreObj=ObjectFunction(PreBestX,PreBestY);
%%%%%%%%%%%%进行一下微小的扰动,生成一个模型%%%%%%%%%%%%
PreX = -XMAX * rand ;
PreY = -YMAX * rand;
BestX = PreX;
BestY = PreY;
%%%%%计算扰动模型的目标函数值
BestObj=ObjectFunction(BestX,BestY);
%%%%%计算增量值的绝对值,并进入迭代退火,引入判断条件%%
mm=abs(BestObj-PreObj);
%// 每迭代一次退火一次(降温), 直到满足迭代条件为止
sum=0;
while mm>Tolerance
%%%没有满足条件,降一次温度,即退火一次,
Temperature=DecayScale*Temperature;
AcceptPoints = 0.0; %记录迭代的次数,有多少个点被接受
%%%每一个温度值T都要迭代马可夫链的长度(即MARKOV链长度)次
%%%重复一定次数的扰动和接受过程
for i=1:MarkovLength
%%%%%%(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
%%%%%满足条件的新值NextX,NextY.
%%%%%%%%(2)判断条件是否全局最优解 A>B 如满足这个条件,说明值NextX,NextY是新解.
if (ObjectFunction(BestX,BestY) > ObjectFunction(NextX,NextY))
%%%%%%保留上一个最优解
PreBestX =BestX;
PreBestY = BestY;
%%%%%%%此为新的最优解
BestX=NextX;
BestY=NextY;
end
%%%%%%%%(3) Metropolis过程 即满足条件时 1000次迭代中,这次迭代值被接受
%%%%%%%% (NextX,NextY)这组值被接受 并作为下次迭代的初值
if( ObjectFunction(PreX,PreY) - ObjectFunction(NextX,NextY) > 0 )
%%%%%%%%% 满足条件,接受
PreX=NextX;
PreY=NextY;
AcceptPoints=AcceptPoints+1;
else
%%%%%%%%%%%% 如果不满足条件,按概率p=exp(-dE/T)进行接受
changer = -1 * ( ObjectFunction(NextX,NextY) - ObjectFunction(PreX,PreY) ) / Temperature ;
rnd=rand;
p1=exp(changer);
double (p1);
if p1 > rand
PreX=NextX;
PreY=NextY;
%BestX=NextX;
%BestY=NextY;
AcceptPoints=AcceptPoints+1;
end
end
%%%%%%%%% 不接受, 保存原解 ,在某一个温度下,所进行的1000次for循环结束。
end
%%%%%%%%% 判断某个温度下,所求解的一组(NextX,NextY)是否满足条件,如果满足 while循环结束
mm=abs( ObjectFunction( BestX,BestY)-ObjectFunction (PreBestX, PreBestY));
sum=sum+1;
end
BestX
BestY
ma=ObjectFunction(BestX,BestY)
Temperature
sum
地震资料数字处理_地震子波提取方法_基于模拟退火的高阶累积量子波提取方法_matlab
版权申诉
5星 · 超过95%的资源 162 浏览量
2022-04-08
22:16:24
上传
评论 1
收藏 4KB RAR 举报
阿里matlab建模师
- 粉丝: 3303
- 资源: 2784
- 1
- 2
前往页