模拟退火算法

本文来自论文《模拟退火算法综述》–谢云。

1. 问题由来

在自然科学、 管理科学和工程技术等科技领域, 存在着大量的组合优化问题(Combinatorialoptimiza- tion Problem),其中的NP完全问题(Nondeterministie polynomialComplete problem), 其求解时间随问题规 模呈指数级增长, 当规模稍大时就会因时间限制而失去可行 (Feasibility)。 如著名的货郎担问题 (TravelingSalesman Problem,简记为TSP),即在n 个顶点的完全图中找一条最小 Hamliton 回路 , 当图为 对称图时, 要从(n一1!) /2 个可能解中找出最优者, 需进行(n, 1)! /2一1次比较, 若用每秒运算一亿次的计 算机,n=10时只需0. 0018秒,n=20 就需19年,n =30时则猛增为1. 4X1015年。 显然,如此求其精确解是不可行的 。为解决这类问题, 人们提出了许多近似算法, 但这些算法或因过于注意个别问题的特征 而缺乏通用性, 或因所得解强烈地依赖初始解的选取而缺乏实用 性。模拟退火算法(SimulatedAnnealingAlgorithm)就 是对其中的局部搜索算法(Loeal Sea reh Algo rithm) 改进而提出的。

2. 模拟退火算法

模拟退火算法提出于本世纪 80 年代初, 其思想源于固体退火过程: 将固体加温至充分高, 再让其徐徐冷却。 加温时, 固体内部粒子随温升变为无序状, 内能增 大, 而徐徐冷却时粒子渐趋有序, 在每个温度都达到平 衡态, 最后在常温时达到基态 , 内能减为最小。 根据 MterooPlis准则,粒子在温度T时趋于平衡的几率为 e一△E/(kT,其中E为温度T时的内能,△E为其改变 量, k 为Boltzman 常数。

用固体退火模拟组合优化问题, 将内能 E 模拟为 目标函数值f,温度T演化成控制参数t,即得到解组合优化问题的模拟退火算法。由初始解 i i i和控制参数初值 t t t开始,对当前解重复“产生新解->计算目标函数差-> 判断是否接受->接受或舍弃” 的迭代 , 并逐步衰减t 值 , 算法终止时的当前解即为所得近似最优解。 退火过程由冷却进度表(CohngSlcedlue)控制,包括控制 参数的初值 t 及其衰减因子△t 、 每个 t 值时的迭代次数(称为一个MaPokb链的长度)L 和停止条件S。

3. 实现形式

从如下几个方面描述:

数学模型

数学模型:由解空间、目标函数和初始解三部分组成。

  • 解空间:对所有可能解均为可行解的问题定义为可能解的集合,对存在不可行解的问题,或限定解空间为所有可行解的结合,或允许包含不可行解但在目标函数中用罚函数 惩罚以至最终完全排除不可行解。
  • 目标函数:对优化目标的量化描述,是解空间到某个数集的一个映射,通常表为若干优化目标的一个和式,应正确体现问题的整体优化要求且较易计算,当解空间包含不可行解时还应包括罚函数项。
  • 初始解:是算法迭代的起点,实验表明,模拟退火算法是Robust, 即最终解的求得不十分依赖初始解的选取,从而可任意选取一个初始解

新解的产生和接受机制

由4个步骤构成一轮试验

  • 首先,按某种随机机制由当前解产生一个新解,通常通过简单变换(如 对部分元素的置换、互换或反演等)产生,可能产生的新解构成当前解的邻域
  • 其次,计算新解伴随的目标函数差,一般由变换的改变部分直接求得
  • 第三,由接受准则,即新解更优,或恶化但满足Metropolis准则,判断是否接受新解,对有不可行解而限定解空间仅包含可行解时,还需先判断其可行性
  • 最后,满足接受准则时进行当前解和目标函数值的迭代,否则舍弃新解

未完待续

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用Octave实现模拟退火算法,您可以参考以下步骤: 1. 首先,加载并准备数据。根据引用中的代码,您可以将敌方目标的数据加载到Octave环境中。根据您的问题,您可能需要根据自己的需求调整数据。 2. 然后,根据您的需求设置参数。例如,设置初始温度、退火速率、最大迭代次数等。 3. 接下来,编写一个计算代价函数的函数。根据您的问题,您可以根据引用中的代码编写一个函数来计算旅行商问题中两个城市之间的距离。 4. 然后,使用随机生成的初始解来开始模拟退火算法的迭代过程。根据引用中的代码,您可以编写一个循环来生成新的解,并根据某个准则(如Metropolis准则)决定是否接受新的解。 5. 在迭代过程中,逐渐降低温度,直到达到停止条件(如温度小于某个阈值)。 6. 最后,输出最优解(最短路径)以及路径的长度。 请注意,以上步骤只是一个基本的框架,您可能需要根据您的具体问题进行适当的调整和修改。为了更好地理解模拟退火算法的实现细节,您可以参考引用和引用中提供的论文和教程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [matlab最简单的代码-niso-ex1-tsp::compass:自然启发式搜索和优化练习1的代码-旅行商问题](https://download.csdn.net/download/weixin_38750999/18967092)[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: 33.333333333333336%"] - *2* [matlab最简单的代码-Solving-Travelling-Salesman-Problem-using-Stochastic-Local](https://download.csdn.net/download/weixin_38670420/18967101)[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: 33.333333333333336%"] - *3* [模拟退火算法MATLAB](https://blog.csdn.net/xuxinrk/article/details/80231794)[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: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值