![48a9683373703d7d942f775fb72e36b1.png](https://img-blog.csdnimg.cn/img_convert/48a9683373703d7d942f775fb72e36b1.png)
模拟退火算法是一种选择算法,这里介绍了该算法求解一元函数得案例。多元函数案例自己相应得修改,这里采用的是Matlab编写....算法原理在程序注释里已经有了,就不再多描述......
注意:函数M文件夹和主程序要分开写
%fun_sigv函数M文件夹
function y = fun_sigv(x)
%Rastrigr 函数
y = x.*sin(10*x*pi) + 2;
%主程序
clc
clear
%模拟退火算法开发
%步骤
%输入:温度T、退火控制参数k、初始点x0
%输出:最优的自变量值、最大/最小值
%(1)给定初始值温度T,退火控制参数k,初始点x0(该点为随机选择点),并计算f(x0)
%(2)随机产生扰动r=(2*rand-1)*delt;新点x1=x0+r,同时计算f(r)、f(r)-f0
%(3)Metropolis准则,若f(r)-f0>0,接受该点(更新x0),且接受概率为p=exp(-(f(r)-f0)/T);
%若p>r(r为0-1上的随机数),接受该点(更新x0),否则放弃该点
%(4)执行降温操作:T=T*k;返回(2)继续
%(5)执行上述步骤,结束
%开发时间2020.11.6
opt_minmax=1; %目标优化类型,取1为求解函数的最大值,取-1为求解函数的最小值
sub=-1; %变量x的取值上限
up=2; %变量x的取值下限
delt=(up-sub)/5 ; %建立区间的步长,也就是从-1取到2采取每隔(up-sub)/5选取x的范围
yita=0.99; %退火控制参数
trace=[]; %建立轨迹
k_total=3000; %迭代3000次
tx=[sub:0.01:up]; %函数变量区间
y=fun_sigv(tx); %函数赋给y
T=max(y)-min(y); %模拟温度初始化
plot(tx,y) %做出函数y = x.*sin(10*x*pi) + 2的图
xlabel('x') %添加标签
ylabel('y')
title('一元函数优化结果') %添加标题
hold on %保持图形状态
x0=sub+(up-sub)*rand; %给变量赋初值,随机产生
f0=fun_sigv(x0); %其中(x0,f0)是随机产生的初始点
k=0;
plot(x0,f0,'ro','linewidth',2) %在函数图像上标出初始点位置
while k<k_total %做迭代判断
x1=x0+(2*rand-1)*delt ; %产生新点x1,(2*rand-1)*delt属于扰动
x1=min(x1,up);
x1=max(x1,sub); %防止新产生的点越界
f1=fun_sigv(x1); %计算新点的函数值
if opt_minmax*f1>opt_minmax*f0 %迭代点优于当前点,接受迭代结果并设置为当前点,这一步相当于对函数值的差值进行判断
x0=x1; %更新x0
f0=f1;
elseif rand<exp(opt_minmax*(f1-f0)/T) %迭代点劣于当前点,以Boltzmann概率接受迭代结果并设置为当前点
x0=x1; %更新x0
f0=f1;
end
T=yita*T; %以缓慢速度衰减温度T----降温操作
k=k+1;
trace=[trace;f0]; %跟踪模拟退火的迭代优化过程
[x0,f0];
end
plot(x0,f0,'r*','linewidth',2) %在原始图当中添加最优值点
figure
plot(trace(:),'r-*') %这里装的是每一次迭代过程当中的最优值,直到其收敛
hold on
xlabel('迭代次数')
ylabel('目标函数优化过程')
title('一元函数优化过程')
fprintf('最优解结果为%f,%f',x0);
fprintf('最大函数值为%f',f0);
输出结果:
最优解结果为1.850622,最大函数值为3.850269>>
图形:
![126355c8cd541f2cda2def1aaa785584.png](https://img-blog.csdnimg.cn/img_convert/126355c8cd541f2cda2def1aaa785584.png)