算法函数_模拟退火算法求函数最值案例

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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值