原理

简介

爬山算法:

  • 总是将当前位置高度和前后位置高度对比,如果当前位置高度比前后位置都高,那么就认为到达了最优位置,然而他山更比此山高,这个位置很可能只是局部最优(一座小山)
  • 好比你来到了世界上最矮的山-静山之巅,左右四顾已经没有比静山之巅更高的地方
  • 静山位于山东寿光市西南8公里,孙家集街道云马家庄之间,海拔高度0.6米

进一步:

  • 如果你站在静山之巅能够随性远行,离开局部最优,你会发现山东还有泰山,中国还有珠穆朗玛峰
  • 模拟退火算法内部就含有这种随机性,在某一温度下的迭代过程中,分子的能量可能比上次迭代时能量高,但仍有一定概率接收这次迭代的结果,从而跳出局部最优,走向全局最优

模拟退火算法:

  • 来自于金属高温冶炼过程中,分子能量随着温度降低而降低的过程,分子的随机移动范围也随着温度降低而减少,分子的移动具有随机性,最终温度降到一定程度,分子随机移动范围减少到一定程度,分子能量降到一定程度
  • 由于分子移动的随机性,使得分子到达局部最优能量后,仍然能够有一定概率跳出局部最优,最终达到全局最优

分子扰动

已知:

  • 温度越高分子随机移动的范围越大
  • 位于绝对0度-273.15度时,分子停止移动
    y r a n g e = k ⋅ T + b ⟹ 代 入 0 = k ⋅ ( − 273.15 ) + b y r a n g e = k ( 273.15 + T ) y_{range}=k\cdot T+b \stackrel{代入0=k \cdot (-273.15)+b}{\Longrightarrow} y_{range}=k(273.15+T) yrange​=k⋅T+b⟹代入0=k⋅(−273.15)+b​yrange​=k(273.15+T)
  • k k k控制移动范围
  • T T T当前温度

代码

步骤

  1. 初始温度;初始化种群,初始化分子(个数,多维能量);计算初始能量
  2. 两层循环,外层控制温度,内层控制此温度下的迭代次数; 邻域内随机扰动x,产生新解(温度越高,分子运动的范围越大,-273.15是绝对0度,分子不再运动),再计算新能量
  3. 判断新能量<原能量,采纳新能量分子(新解);新能量>原能量使用metropolis principle采纳新能量分子(新解)
  4. 记录每个温度每次内部迭代下的最小能量和最小能量分子
import math
import numpy as np
import matplotlib
import matplotlib.pyplot as pltmatplotlib.rcParams['font.family'] = 'STSong'
matplotlib.rcParams['font.size'] = 10def Energy_F1(x):"""能量函数目标函数值作为E(energy),fitness求目标函数最小值,因此E越小越好:param x: 解:return:"""return np.sum(x ** 2)class SimulatedAnnealing(object):"""模拟退火"""def __init__(self, inner_iter_num, E_end, x_min, x_max, NP, D, T0, T_end, tr, kr):"""初始化:param inner_iter_num: 每个T温度下的迭代次数,内部迭代次数:param E_end: 截止能量,截止适应度:param x_min: 下边界:param x_max: 上边界:param NP(number population): 种群大小:param D(dimension): 解的维度:param T0: temperature0, 初始温度:param T_end: 截止温度:param tr: 温度下降速率:param kr: 分子扰动率,控制分子移动范围,与T0和绝对0度-273.15度有关"""# 截止条件self.inner_iter_num = inner_iter_numself.E_end = E_end# 目标空间self.x_min = x_minself.x_max = x_max# 求解者self.NP = NPself.D = D# 算法参数self.T0 = T0self.T_end = T_endself.tr = trself.kr = krdef cooling(self):"""降温过程:return: E_list,元素{(T,i):E}={(当前温度,当前温度下迭代次数):当前最小能量}"""# 记录idx_min = NoneE_dict = {}# 1. 初始温度,初始化种群,初始化分子(个数,多维能量)T = self.T0# x.shape=(NP,D)x = np.random.uniform(self.x_min, self.x_max, (self.NP, self.D))# 初始能量,所有列按行取Es = [Energy_F1(one) for one in x[..., :]]while T > self.T_end:# inner_iter_num 内部迭代次数for num in range(self.inner_iter_num):# 邻域内随机扰动x,产生新解# 温度越高,分子运动的范围越大,-273.15是绝对0度,分子不再运动k = np.random.rand() * self.kry_range = k * (273.15 + T);x_new = x + np.random.uniform(-y_range, y_range, (self.NP, self.D))# 保证在解空间内for m in range(self.NP):for n in range(self.D):while x_new[m, n] < self.x_min or x_new[m, n] > self.x_max:x_new[m, n] = x[m, n] + np.random.uniform(-0.055, 0.055) * T# 分子移动后新的能量E_news = [Energy_F1(one) for one in x_new[..., :]]for m in range(self.NP):if E_news[m] < Es[m]:x[m, :] = x_new[m, :]else:# metropolis principlep = math.exp(-(E_news[m] - Es[m]) / T)# r属于[0,1)r = np.random.rand()if r < p:x[m, :] = x_new[m, :]# 记录新的能量Es[m] = E_news[m]# 记录每次迭代的最小能量E_min = min(Es)idx_min = Es.index(E_min)E_dict[(T, num)] = E_minprint("温度T=", T, " 内部迭代次数=", num + 1, " 能量=", E_min)# 达到截止能量退出if E_min < self.E_end:return x[idx_min, :], E_dict# 温度T = self.tr * Tpassreturn x[idx_min, :], E_dictdef show(self, x_best, E_dict):"""展示:param x_best: 最优解:param E_dict: 最低能量数组:return:"""print("最优分子:", str(x_best))print("最优解:", str(list(E_dict.values())[-1]))plt.title("迭代过程")plt.xlabel("迭代次数")plt.ylabel("能量E")x = range(1, len(E_dict) + 1)y = list(E_dict.values())plt.plot(x, y, label="SA")plt.legend()plt.show()if __name__ == '__main__':sa = SimulatedAnnealing(10, 1e-4, -30, 30, 50, 20, 1000, 10, 0.9, 0.001)x_best, E_dict = sa.cooling()sa.show(x_best, E_dict)

启发式算法/模拟退火相关推荐

  1. 【运筹优化】元启发式算法详解:模拟退火算法(Simulated Annealing,SA)+ 案例讲解代码实战

    文章目录 一.介绍 二.基础知识 2.1 局部搜索(或蒙特卡罗)算法 2.2 Metropolis 算法 2.3 模拟退火算法 三.原理 3.1 Statistical Equilibrium 统计平 ...

  2. 启发式算法Python实现(一) 模拟退火

    文章目录 语言感知描述 伪代码 python实现 不懂为什么网上各种把很简单的模拟退火讲的那么复杂,感觉好像英文版的讲的总比中文的简单.之后的启发式算法全以英文维基百科 + Python实例代码为基础 ...

  3. 三种典型启发式算法(禁忌搜索,模拟退火,遗传算法)

    启发式算法 启发式算法:用来求解非常好的可行解,但不一定是最优解:该类算法可处理非常大的问题,可用来解决NP hard问题,是一种成熟的迭代算法,每次迭代结果可能导致比先前最佳解更好的新解,当算法经过 ...

  4. 局部邻域搜索-爬山法,模拟退火,禁忌,迭代局部搜索,变邻域局部搜索的简单阐释

    原文来源: 局部搜索算法 - JiePro - 博客园 https://www.cnblogs.com/JiePro/p/Metaheuristics_0.html 局部搜索算法 目录: 1.数学定义 ...

  5. 机器学习(MACHINE LEARNING)MATLAB模拟退火算法【SA】

    文章目录 1 什么是智能优化算法 2 常用的智能优化算法 3 智能优化算法的特点 4 模拟退火算法 4.1 简介 4.1 工具箱(SA) 1 什么是智能优化算法 智能优化算法又称现代启发式算法,是一种 ...

  6. 利用模拟退火提高Kmeans的聚类精度

    http://www.cnblogs.com/LBSer/p/4605904.html Kmeans算法是一种非监督聚类算法,由于原理简单而在业界被广泛使用,一般在实践中遇到聚类问题往往会优先使用Km ...

  7. 启发式算法简谈(一)

    引言: 解决实际的问题,要建模型,再求解.求解要选择算法,只有我们对各种算法的优缺点都很熟悉后才能根据实际问题选出有效的算法.但是对各种算法都了如指掌是不现实的,但多知道一些,会使你的选择集更大,找出 ...

  8. 启发式算法在最优化问题求解中的应用与实践

    最优化问题广泛的存在于社会生产活动当中,我们一直努力寻求更高效.更准确的解决方式来应对这类问题.通常,最优化问题可以表述为一种数学规划的形式,对于变量在可行域中的不同组合进行搜索,以得到目标函数的最优 ...

  9. Python数模笔记-模拟退火算法(3)整数规划问题

    1.整数规划问题 整数规划问题在工业.经济.国防.医疗等各行各业应用十分广泛,是指规划中的变量(全部或部分)限制为整数,属于离散优化问题(Discrete Optimization). 线性规划问题的 ...

最新文章

  1. (DBA之路【五】)关于锁的故事
  2. php 调用 perl,在PHP中使用与Perl兼容的正则表达式
  3. Spring循环依赖的三种方式,你都清楚吗?
  4. spring-boot (9)---STS 新建一个spring-boot rest 项目
  5. 为什么把钱花在别人身上更幸福?
  6. AJAX,JSON,GSON
  7. 聊聊 | 他在Google Play安全奖励计划贡献榜单上排名第一
  8. python机器学习:朴素贝叶斯分类算法
  9. js事件流 事件捕获 及时间冒泡详解
  10. 大数据时代下的办公自动化系统
  11. 科技部等6部门发文,推动AI场景创新;『精益副业』教程序员优雅做副业;『可扩展系统』设计全教程;人物动作数据集;前沿论文 | ShowMeAI资讯日报
  12. (十八)视频换-脸、无训练高速换-脸、一张图片即可完成、批量处理
  13. 寒江独钓 第二章(3)Hook分发函数和回调函数
  14. windows驱动快速入门
  15. sudo与su的区别
  16. .NET Data Provider
  17. Java基础之四大核心函数式接口简单使用
  18. Java实现拼图小游戏(7)—— 计步功能及菜单业务的实现
  19. 20161128 已知小明同学其中考试成绩,数学97.5分,语文94.5分,英语95.5分,求小明同学的三科总成绩(结果保留一位小数)。...
  20. 9天拿下CVPR竞赛冠军!家里的狗狗都改了作息时间...

热门文章

  1. 织梦php开发tags功能开发,织梦dedecms二次开发中几个标签的应用
  2. libreoffice 开发文档_工具库-基于LibreOffice实现文档操作
  3. fail2ban 防止暴力破
  4. delphi中的ActionList使用方法
  5. HDU - 5542 The Battle of Chibi(树状数组+DP)
  6. mysql-front怎么备份_MySQL-Front数据库的备份与还原步骤
  7. 一次网络反诈骗真人秀
  8. 常用的iPhone app快捷url链接
  9. 北京大学开设电子游戏选修课,“爆”到没地方坐
  10. 理解Apollo传感器标定文档