模拟退火算法详解以及使用optimtool工具

简介

模拟退火算法(Simulated  Annealing, SA)是一种通用的随机搜索算法,是对局部搜索算法的扩展。与一般局部搜索算法不同,SA以一定的概率选择邻域中目标值相对较小的状态,是一种理论上的全局最优算法。
模拟退火算法是源于对热力学中退火过程的模拟,在某一给定初温下,通过缓慢下降温度参数,使算法能够在多项式时间内给出一个近似最优解。

 

模拟退火过程

1)设定初始高温,相当于物理退火的加温过程。初始温度要足够高,在实际应用中,要根据以往的经验,通过反复实验来确定T0的值。

2)热平衡达到,相当于物理退火的等温过程。是指在一个给定温度下,SA用特殊的抽样策略进行随机搜索,最终达到平衡状态的过程。这是SA算法的内循环过程。

3)降温函数,相当于物理退火的冷却过程。用来控制温度的下降方式,这是SA算法的外循环过程。常用的降温函数有Tk+1=Tk-DT,Tk+1=Tk*r,其中r∈(0.95,0.99)。

 

至于邻域解的操作,不进只是这样的swap的操作,也可以有reverse操作,即

            

然后设置好参数:

 

下面使用matlaba 自带的模拟退火工具箱进行简单的举例:

Matlab版本是R2016,可以使用此工具箱,但是到了R2018就不再使用此工具箱,有新的语法表示,详解请看官网。

例1: 求解一元函数 y=sin(5*pi*x)/x  , 自变量x范围[1,2];

首先,我们用groud-truth方法直观的将其plot画出来,然后将其极值标注出来,以此来对比模拟退火算法的准确性。

%% II. 一元函数优化
x = 1:0.01:2;
y = sin(5*pi*x) ./ x;
figure
plot(x,y,'linewidth',1.5)
ylim([-1.5, 1.5])
xlabel('x')
ylabel('y')
title('y = sin(5*pi*x) / x')
hold on
%%
% 1. 标记出最大值点
[maxVal,maxIndex] = max(y);
plot(x(maxIndex), maxVal, 'r*','linewidth',2)
text(x(maxIndex), maxVal, {['    X: ' num2str(x(maxIndex))];['    Y: ' num2str(maxVal)]})
hold on
 
%%
% 2. 标记出最小值点
[minVal,minIndex] = min(y);
plot(x(minIndex), minVal, 'ks','linewidth',2)
text(x(minIndex), minVal, {['    X: ' num2str(x(minIndex))];['    Y: ' num2str(minVal)]})

可以看出此自变量范围内极大值点[1.3,0.76923],极小值点[1.1,-0.90909];

下面使用matlab 自带的模拟退火工具箱:

在matlab中新建一个函数cost.m ,如下所示:

function costVal = cost( x )
 
%一元函数优化:
 
costVal = sin(5*pi*x) / x;  %求最小值
 
% costVal = -1 * sin(5*pi*x) / x; %用模拟退火求最大值,可以加个负号或者弄个倒数
  
end

首先,命令行敲击>>optimatool,调出工具箱。

接着

最后,点击start按钮,等待迭代,可以看到可视化的结果。如下所示:

极小值点为(1.096,-0.910577)与最初ground-truth的极小值点(1.1,-0.90909)在误差范围内。

  • 9
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Matlab的模拟退火算法是通过使用simulannealbnd函数来实现的。该函数是Matlab全局优化工具箱中的一个函数,用于求解多维非线性约束优化问题。模拟退火算法是一种随机搜索算法,通过模拟退火的过程来逐步接受较差的解,以期望找到全局最优解。 在使用simulannealbnd函数时,你需要定义一个目标函数,即要进行优化的函数。对于一元函数 y = sin(10*pi*x) / x,在定义目标函数时,你需要将x作为输入参数,并返回计算得到的y值。 simulannealbnd函数还需要提供一个初始解向量x0,并设定搜索的范围(例如x在[1,2]之间),以及其他参数如搜索温度等。函数会根据设定的参数和目标函数进行迭代搜索,最终返回找到的最优解。 更多关于simulannealbnd函数的详细用法和参数设置,你可以参考Matlab官方文档中关于simulannealbnd函数的说明。这里提供了更多关于simulannealbnd函数的详细信息和示例代码,可以帮助你更好地理解和使用该函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [matlab模拟退火算法(SA)详解(一)算法入门](https://blog.csdn.net/viafcccy/article/details/94881458)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [2022建模国赛代码(三天坚持不易) 包括K-meas算法、bp预测、回归预测,(python和matlab做的).zip](https://download.csdn.net/download/qq_35831906/88245767)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值