简介

\quad\quad 模拟退火算法是80年代初发展起来的一种基于Monte Carlo迭代求解策略的随机性寻优算法。其思想最早由Metropolis等人于1953年提出,由Krikpatrick等人于1983年引入组合优化领域,目前已在工程中得到了广泛的应用。其克服了贪心(Greedy)算法等局部寻优算法容易陷入局部最优解的缺陷与对初值的依赖性,其优势在于可以以一定的概率选择当前解邻域中较差的解,可以跳出局部最优,从而实现全局寻优的目的。

\quad\quad 在热力学上,退火(annealing)现象指物体逐渐降温物理过程。温度越低, 物体的能量状态越低,其分子结构组成越有规律,从而使得物体在完全结晶状态时,系统的能量状态达到最低。但如果在某一刻骤然降温(热力学中称为淬炼(quenching)),会导致非能量最低的非完全晶体状态。

与贪心算法的比较

\quad\quad 如下图所示,以目标函数取最小值为例。若初始解定为A点,根据贪心算法,我们可以一步步的减小目标函数值,从而到达B点。此时算法会结束。但使用模拟退火算法,其重要的一个特点就是可以以一定的概率跳出局部最优点,如B点,接受一个在BC之间的解,进而通过逐次的跳变,可以取得D点,实现全局最优。

物理退火过程

\quad\quad 模拟退火算法的思想来源于对固体退火降温过程的模拟。即将固体加温至充分高的,再给其逐渐降温冷却的过程。具体为:
(1)升温。将固体温度升高,从而使固体中粒子的运动状态处于完全无序的状态。
(2)等温。固定在当前的温度,不再升温。对于与周围环境交换热量而温度不变的封闭系统,系统会自发地总是朝着自由能减小的方向进行,从而系统达到在当前温度下平衡的新状态。
(3)逐渐冷却。对新的平衡状态进行冷却处理,使得系统中粒子的热运动减弱并逐渐趋于有序,系统的总能量逐渐降低,从而得到低能量的晶体结构。

算法流程

\quad\quad 在组合优化的实际应用领域,可以将固体内能模拟为最小化的目标函数值 f f f, 将温度 T T T 模拟为控制参数。可以假设初始将温度升高为一个定值,在该温度下随机产生一个初始解,在当前温度下,算法持续进行“产生新解------计算目标函数差------判断是否接受新解------接受或舍弃” 的迭代过程,从而达到在该温度下的热平衡状态。然后继续减小控制参数 T T T 的取值,重复上述在一定温度下达到热平衡状态的过程。当控制参数逐渐减小并趋于零时,系统整体趋于平衡状态,从而达到整体最优解。 算法流程如下图

Metropolis准则

Metropolis准则是一种有效的重点抽样法。其思想为:系统从一个当前能量状态变化到新的能量状态。若新的能量状态小于当前能量状态,则以概率1接受新的能量状态(取得局部最优);若新的能量状态大于当前能量状态(全局搜索最优点),则以一定的概率接受或舍弃新的能力状态。
数学性表示 设 E T n e w E_{Tnew} ETnew​ 表示当前温度 T T T 下新的状态能量, E T c u r E_{Tcur} ETcur​ 表示当前温度 T T T 下当前状态能量,则接受新状态的概率 p p p 可表示为:
p = { 1 , i f E T n e w < E T c u r e x p ( − E T n e w − E T c u r T ) , i f E T n e w ≥ E T c u r ( 1 ) p=\begin{cases} 1,~~~~~\quad\quad\qquad\qquad~ if E_{Tnew}<E_{Tcur}\\ exp(-\frac{E_{Tnew}-E_{Tcur}}{T}), if E_{Tnew}\geq E_{Tcur} \end{cases}(1) p={1,      ifETnew​<ETcur​exp(−TETnew​−ETcur​​),ifETnew​≥ETcur​​(1)从方程(1)可得,当新的能量状态大于当前状态能量时,温度越高,新状态的接受概率越高;当前状态的能量与新状态的能量差越高,新状态的接受概率越高。
注: 温度 T T T 为Metropolis准则的一个重要控制参数,这个参数的大小控制了随机过程向局部或全局最优解移动的快慢。为避免所谓热力学中淬炼(quenching)的操作,控制参数 T T T 的值必须缓慢衰减。

重要参数分析

1. 状态产生函数
设计的状态产生函数应该尽可能的保证所产生的候选解遍布全部解空间。一般的状态产生函数由两部分产生,即产生候选解的方式和产生候选解的概率分布。候选解的产生方式由问题的性质决定,通常在当前状态的邻域结构内以一定的概率产生。
2. 初始控制参数温度 T T T
常用的确定初温参数的方法:
(1)随机生成一组可行解,以该解所对应的目标函数值的方差作为初温;
(2)可利用经验或试验确定。
3. 退温函数
常用的退温函数有:
(1) T n + 1 = k T n T_{n+1}=kT_{n} Tn+1​=kTn​, n n n 为当前循环次数, 0 < k < 1 0<k<1 0<k<1 为一个非常接近1的常数。
(2) T n + 1 = T n − Δ T T_{n+1}=T_{n}-\Delta T Tn+1​=Tn​−ΔT, 其中 Δ T \Delta T ΔT 为自定义温度下降值。
4. 内循环的循环次数(Markov链长度的选取)
(1)每一个温度下迭代相同次数,次数与问题有关。
(2)随着温度的下降,增加迭代次数。
5. 算法终止准则
(1)设置终止温度
(2)设置最大迭代次数
(3)算法搜索到的最优值连续若干步保持不变

Matlab代码演示

示例】旅行商问题(TSP问题)。假设有一个旅行商人要拜访全国31个省会城市,他需要选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择要求是:所选路径的路程为所有路径之中的最小值。
全国31个省会城市的坐标为 [1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;4196 1004;4312 790;4386 570;3007 1970;2562 1756;2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2367;3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;2370 2975]。

代码详情

%%################################ 1. 主要函数:模拟退火算法实现 ###################################################
function [obj,order,city] = SA(TIn,TdIn,LIn,city,order,k)
%% Input parameters
%SA Simulated Annealing
%TIn: Current Temperature
%TdIn:Final Temperature
%LIn: Number of initial iterations of the inner loop
%city: Current City-coordinate
%order: Current city-order
%k:Temperature Attenuation Coefficient
%% Output parameters
%obj: Objective function value(total distance between 31 cities)
%order: New city-order
%city: New City-coordinate
%% Data preparation
iter = 1;%Number of outer loop iterations
T = TIn;
Td = TdIn;
distcur = dist(city);
obj(iter) = distcur;
L = LIn;
%% Main code
% ##################Outer loop############################################
while T>Td%% Setting cycle times for inner cycleif T<100L = 100;elseif T<10L = 200;end%% inner cyclefor i = 1:L[tmp_city,order] = new_solution(city,order);distnew = dist(tmp_city);delta = distnew - distcur;if delta < 0city = tmp_city;elsep = exp(-delta/T);if p>randcity = tmp_city;endenddistcur = dist(city);end%% Update the information of the outer loopiter = iter + 1;%Oteration number updatingobj(iter) = distcur;%Objective function value updatingT = k*T;%Decay temperature
end
end
%%################################ 2. 新解产生函数 ##############################################################
function [tmp_Codnt,order] = new_solution(Codnt,Order)
%% input parameter
%Codnt:a struct defines current city coordinate
%Order:the order of the current solution
%% output parameter
%tmp_Codnt:a struct defines new city coordinate
%order:the new city order
%%
n = size(Codnt,2);
tmp_Codnt = Codnt;
order = Order;
%%
%###################随机产生两个城市编号#######################
p1 = unidrnd(n);
p2 = unidrnd(n);
while p1==p2p1 = unidrnd(n);p2 = unidrnd(n);
end
%%
%###################对换两个城市位置形成新解#######################
tmp = tmp_Codnt(p1);
tmp_Codnt(p1) = tmp_Codnt(p2);
tmp_Codnt(p2) = tmp;
tmp = order(p1);
order(p1)=order(p2);
order(p2)=tmp;
end
%%######################## 3. 目标函数计算函数 ###############################################################
function distvalue = dist(Codnt)
%% input parameter
%Codnt: a struct defines city coordinate
%% output parameter
% distvalue:Euclidean distance based on current solution
%%
n = size(Codnt,2);
distvalue = 0;
for i=1:n-1distvalue = distvalue + sqrt((Codnt(i).x-Codnt(i+1).x)^2+(Codnt(i).y-Codnt(i+1).y)^2);
end
distvalue = distvalue + sqrt((Codnt(n).x-Codnt(1).x)^2+(Codnt(n).y-Codnt(1).y)^2);
end
%%############################ 4. 图形绘制函数 ################################################################
function Fgplot(city,order)
%% iuput parameters
%city: city coordinate
%order: city order of the current solution
n = size(city,2);
for i=1:n-1plot([city(i).x,city(i+1).x],[city(i).y,city(i+1).y],'bo-');hold on;text(city(i).x+30,city(i).y+10,num2str(order(i)));
end
plot([city(n).x,city(1).x],[city(n).y,city(1).y],'bo-');
text(city(n).x+10,city(n).y+10,num2str(order(n)));
xlabel('城市位置横坐标');
ylabel('城市位置纵坐标');
end
%%##################################### main.m (参数输入) #######################################################
clear all;
close all;
clc;
T = 300;%Initial Temperature
Td = 0.005;%Terminal Temperature
L = 50;%Number of initial iterations of the inner loop
k = 0.995;%Temperature attenuation coefficient
CityCoordinate = [1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;3238 1229;4196 1004;4312 790;4386 570;3007 1970;2562 1756;2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2367;3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;2370 2975];
nCity = size(CityCoordinate,1);
city = struct([]);
for i = 1:nCitycity(i).x = CityCoordinate(i,1);city(i).y = CityCoordinate(i,2);
end
tic
figure(1)
order = 1:nCity;
Fgplot(city,order);
title('初始解路径')
[obj,order,City] = SA(T,Td,L,city,order,k);
figure(2)
m = length(obj);
plot(obj)
xlabel('迭代次数');
ylabel('城市间总距离');
title('总距离演变曲线')
figure(3)
Fgplot(City,order);
title('最优解路径')
disp('1.新的路径顺序为:')
disp(order)
disp('2.初始目标距离为:')
disp(obj(1))
disp('3.最优目标距离值为:')
disp(obj(m))
toc

图形展示


参考文献

[1] http://cighao.com/2015/12/03/introduction-of-SA/
[2] https://www.cnblogs.com/ranjiewen/p/6084052.html
[3] 公众号----交通与优化之模拟退火
[4] S. Kirkpatrick, C. D. Gelatt, Jr., M. P. Vecchi, 1983. Optimization by Simulated Annealing. Science, 220, No.4598.
[5] 包子阳,余继周. 智能优化算法及其MATLAB实例[M]. 电子工业出版社,2016.
[6] python 优化包scikit-opt

优化算法----模拟退火算法(Simulated Annealing,SA)相关推荐

  1. 用模拟退火算法(simulated annealing / SA)求函数最小值

    #用模拟退火算法(simulated annealing / SA)求函数最小值 已知函数 f(x) = (x-1)^2 + 3,是求其在[ -2,2 ]的最小值时刻的解 下面为运用模拟退火算法求解上 ...

  2. Python使用模拟退火(Simulated Annealing)算法构建优化器获取机器学习模型最优超参数组合(hyperparameter)实战+代码

    Python使用模拟退火(Simulated Annealing)算法构建优化器获取机器学习模型最优超参数组合(hyperparameter)实战+代码 目录

  3. 模拟退火(simulated annealing)算法详解

    模拟退火(simulated annealing)算法详解 模拟退火算法来源于固体退火原理,得益于材料统计力学的研究成果,并且该算法也是一种基于概率的算法.该算法主要用于求解最优解问题,如巡航问题.函 ...

  4. 【机器学习算法】模拟退火(Simulated Annealing)

    前言 *模拟退火算法是机器学习算法中的一种简单的算法. 在进行随机梯度下降时,采用模拟退火更新学习率是选择之一. 目录 前言 概述 爬山算法(Hill Climbing)的缺陷 Metropolis算 ...

  5. 优化算法——模拟退火算法

    模拟退火算法原理 爬山法是一种贪婪的方法,对于一个优化问题,其大致图像(图像地址)如下图所示: 其目标是要找到函数的最大值,若初始化时,初始点的位置在CCC处,则会寻找到附近的局部最大值AAA点处,由 ...

  6. 计算机模拟退火算法,模拟退火算法

    模拟退火算法来源于固体退火原理,是一种基于概率的算法,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时 ...

  7. R语言基于模拟退火(Simulated Annealing)进行特征筛选(feature selection)

    R语言基于模拟退火(Simulated Annealing)进行特征筛选(feature selection) 特征选择的目的 1.简化模型,使模型更易于理解:去除不相关的特征会降低学习任务的难度.并 ...

  8. 模拟退火(Simulated Annealing, SA)算法简介与MATLAB实现

    目录 模拟退火算法概述 算法步骤 算法特点 模拟退火算法MATLAB实现 [例1]一元/多元函数优化 [例2]TSP问题 模拟退火算法概述 模拟退火算法(Simulated Annealing,简称S ...

  9. 模拟退火(Simulated Annealing)算法 PO J1379 2420

    在很多信息学竞赛选手看来,很多时候几何题目就是代码量大的代名词,即使对于一些经典问题,庞大的代码量也使很多人望而却步.模拟退火算法思维及编写简单.灵活,可以在一类最远.最近或第k近距离问题中发挥威力. ...

最新文章

  1. 半波对称振子方向图_移动天线的概念 | 天线方向性
  2. java使用ajax异步刷新_Jquery的Ajax实现异步刷新
  3. 【大会】除了FFmepg和WebRTC,还有哪些新工具?
  4. 给定数字的全部组合实现方式
  5. React开发(266):ant design customRequest
  6. [js] js操作节点的方法有哪些?
  7. Angular Extends
  8. 堪比“震网”:罗克韦尔PLC严重漏洞可导致攻击者在系统中植入恶意代码
  9. theano 编程细节
  10. 中国期货交易技术的逆袭之路
  11. python的字符串类型本质上是一种字符序列_20170402Python变量类型 知识点梳理
  12. 计算机基础知识贾辉,《计算机基础知识》读后感
  13. python 身份证验证系统_用Python写一个身份证号码校验系统
  14. 工厂软件支持及测试是什么,工厂测试指南.pdf
  15. ABAPDEMO批量更改BOM组件_SAP刘梦_新浪博客
  16. 动态规划算法——2020美团校招合并金币算法
  17. 记一次串口调试工具发指令无反应问题
  18. Linux系统备份系统还原
  19. 五子棋游戏-1(绘制棋盘)
  20. AD20——批量快速放置元件管脚

热门文章

  1. AutoML全面解析@Qing
  2. 端口复用 RDP协议的利用
  3. php源码+仿桌面,PHP仿飞翔下载站源码(电脑端+手机端)
  4. NameNode管理元数据的机制
  5. 7年7个主管,我是如何在支付宝从P5升P7的?
  6. SQLServer数据库的附加和分离
  7. 微信小程序h5页面分享设置
  8. 索引 ---- 最左前缀的解释
  9. 火山小视频怎么消重 如何修改视频md5值
  10. sublime 搭建html,教你快速使用sublime Text3编写HTML