智能算法系列之模拟退火算法

在这里插入图片描述

  本博客封面由ChatGPT + DALL·E 2共同创作而成。

文章目录

    • 前言
    • 1. 算法思想
    • 2. 细节梳理
      • 2.1 超参数的选择
      • 2.2 一些trick
    • 3. 算法实现
      • 3.1 问题场景
      • 3.2 从算法角度分析
      • 3.3 python实现
    • 代码仓库:IALib[GitHub]

前言

  本篇是智能算法(Python复现)专栏的第二篇文章,主要介绍模拟退火算法(Simulate Anneal Algorithm, SAA)的思想,python实现及相关应用场景模拟。

  模拟退火算法,顾名思义,就是对固体退火这一热力学过程的模拟,它是一种适合解决大规模组合优化问题的随机搜索算法。与一般的局部搜索算法不同的是,SAA以一定的概率选择邻域中目标值相对较小的状态,从理论上来说,它是一种全局最优算法。

1. 算法思想

  固体退火过程是指将固体加热到熔化,再徐徐冷却使之凝固成规整晶体的热力学过程,主要由加温过程、等温过程以及冷却过程3个阶段组成。
  (1) 加温过程:对固体加热时,随着温度的升高,粒子的热运动不断加强,逐渐偏离平衡位置,粒子排列也呈现出随机状态,此时,宏观上物体表现为液态,这就是熔化现象。熔化过程消除了系统内原先可能存在的非均匀状态,同时系统的能量也随着温度升高而增大;
  (2) 等温过程:退火过程要求温度缓慢降低,使得系统在每个温度下都达到平衡状态。这一过程可以根据自由能减少定律给出解释:对于与环境发生热量交换而温度保持不变的封闭系统,系统状态的自发变化总是朝着自由能减少的方向进行,当自由能达到最小值时,系统达到平衡态;
  (3) 冷却过程:温度的降低使得粒子热运动慢慢减弱,粒子排列渐趋有序,系统能量不断减小,最终得到低能的晶体结构。当液体凝固成固体的晶态时,退火过程完成。

  SAA是用来在一个大的搜寻空间内找寻最优解的基于概率的算法,采用类似于固体退火的过程,先将固体加温至充分高(相当于算法的随机搜索),然后徐徐冷却(相当于算法的局部搜索),在每一个温度(相当于算法的每一次状态转移)达到平衡态,最终达到物理基态(相当于算法找到最优解)。
  具体可以表述为:粒子在温度 T T T 时趋于平衡的概率为 e x p ( − Δ E k T ) exp(- \frac {\Delta E} {kT}) exp(kTΔE),其中 E E E 为温度 T T T 时的内能, Δ E ΔE ΔE 为其改变量, k k k 为玻耳兹曼常数。用固体退火模拟组合优化问题,将内能 E E E 模拟为目标函数值 f f f,温度 T T T演化成控制参数 t t t,即得到解组合优化问题的SAA
  由初始解 x x x 和控制参数初值 t t t 开始,对当前解重复 "产生新解 --> 计算目标函数差 --> 接受或舍弃" 的迭代,并逐步衰减 t t t 值,算法终止时的当前解即为所得近似最优解,这是基于蒙特卡洛迭代求解法的一种启发式随机搜索过程。退火过程由冷却进度表控制,包括控制参数的初值 t t t 及其衰减因子 Δ t Δt Δt、每个 t t t 值时的迭代次数 L L L 和停止条件 S S S等。

在这里插入图片描述

2. 细节梳理

2.1 超参数的选择

  初始温度T建议选择较大的值,终止温度T_end建议选择较小的值,这里选择初始温度T=100, T_end=0.001,过大或过小会影响算法收敛的速度;每个温度下的迭代次数和冷却系数可以根据问题场景适当控制,过大也会影响收敛的速度;玻尔兹曼常数k这里设置为1

2.2 一些trick

  其实,也可以不必完全按照上述流程图来实现SAA,比如,每个温度下的迭代次数,从原理上来看,这部分是影响了迭代次数,如果将冷却系数设置为稍大一些,比如0.99,那么这部分在实现的时候可以省略掉,算法仍然能够得到最优解。当然啦,博主只是在该问题上得出的一个结论,是否具有普适性还需要验证。本篇为了算法的完整性,仍然按照流程图来实现SAA算法。

3. 算法实现

3.1 问题场景

  最值问题,求解 f ( x ) = x s i n ( 5 x ) − x c o s ( 2 x ) f(x) = xsin(5x) - xcos(2x) f(x)=xsin(5x)xcos(2x)在定义域[0, 5]上的最小值。我们先手动计算一下:

f ′ ( x ) = 2 x s i n ( 2 x ) + s i n ( 5 x ) − c o s ( 2 x ) + 5 x c o s ( 5 x ) f^\prime (x) = 2 x sin(2 x) + sin(5 x) - cos(2 x) + 5 x cos(5 x) f(x)=2xsin(2x)+sin(5x)cos(2x)+5xcos(5x)  令 f ′ ( x ) = 0 f^\prime (x) = 0 f(x)=0之后,理论上可以求得驻点,但又不太好计算。。。

3.2 从算法角度分析

  根据上述问题场景及算法原理,需要考虑两种情况:
  (1)当前解是局部最优解,即 f ( x ′ ) < f ( x ) f(x^ \prime) < f(x) f(x)<f(x),保留当前局部最优解,继续产生新解;
  (2)当前解非局部最优解,即 f ( x ′ ) ≥ f ( x ) f(x^ \prime) \geq f(x) f(x)f(x),计算出当前温度下该解收敛的概率,如果概率大于一定阈值(随机的),则该解可以作为局部最优解,保留该解并继续产生新解,否则就丢弃该解,继续产生新解。

3.3 python实现

# -*- coding:utf-8 -*-
# Author:   xiayouran
# Email:    youran.xia@foxmail.com
# Datetime: 2023/1/16 11:12
# Filename: sa.py
import numpy as np
from matplotlib import pyplot as pltdef f(x):return x*np.sin(5*x) - x*np.cos(2*x)seed = 10086
np.random.seed(seed)T = 100     # 初始温度
T_end = 1e-3    # 终止温度
coldrate = 0.9    # 冷却系数
max_count = 15  # 每个温度值下的迭代次数
x_range = [0, 5]    # 定义域if __name__ == '__main__':plt.figure()plt.ion()x_ = np.linspace(*x_range, num=200)plt.plot(x_, f(x_))x = np.random.uniform(*x_range)  # 初始解while T > T_end:for _ in range(max_count):y = f(x)x_new = np.clip(x + np.random.randn(), a_min=x_range[0], a_max=x_range[1])# something about plottingif 'sca' in globals() or 'sca' in locals():sca.remove()sca = plt.scatter(x, y, s=100, lw=0, c='red', alpha=0.5)plt.pause(0.01)y_new = f(x_new)if y_new < y:  # 局部最优解x = x_newelse:p = np.exp(-(y_new - y) / T)  # 粒子在温度T时趋于平衡的概率为exp[-ΔE/(kT)]r = np.random.uniform(0, 1)if p > r:  # 以一定概率来接受最优解x = x_newT *= coldrateplt.scatter(x, f(x), s=100, lw=0, c='green', alpha=0.7)plt.ioff()plt.show()print('最小值对应的坐标点: ({}, {})'.format(x, f(x)))

  得到的最优解如下:

最小值对应的坐标点: (3.435632058805234, -6.276735466829619)

  模拟过程如下:

在这里插入图片描述

代码仓库:IALib[GitHub]

  本篇代码已同步至【智能算法(Python复现)】专栏专属仓库:IALib
  运行IALib库中的SAA算法:

git clone git@github.com:xiayouran/IALib.git
cd examples
python main.py -algo saa

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/24379.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python做仿真模拟:一种高效、灵活、易用的工具

Python做仿真模拟&#xff1a;一种高效、灵活、易用的工具 介绍 随着计算机技术的不断进步&#xff0c;仿真模拟已成为许多学科研究中不可缺少的工具之一。在许多领域&#xff0c;例如物理、生物、经济等&#xff0c;都需要使用仿真模拟的技术来预测、测试和优化各种系统的行…

ChatGPT常用的指令(prompts)系列六

系列文章目录 内容翻译自&#xff1a;https://github.com/f/awesome-chatgpt-prompts&#xff0c;并加入自己的实践内容 1、 ChatGPT常用的提示语&#xff08;prompts&#xff09;系列一 2、 ChatGPT常用的提示语&#xff08;prompts&#xff09;系列二 3、 ChatGPT常用的提示语…

企业级ChatGPT开发入门实战直播21课第2课 运行日志及代码解析

企业级ChatGPT开发入门实战直播21课第2课 运行日志及代码解析 Gavin老师在企业级ChatGPT开发入门实战直播21课第2课中,讲解的ChatGPT应用案例开发架构图: ChatGPT案例运行日志 2023-06-11 16:06:57 DEBUG Calling on_part_begin with no data 2023-06-11

chatgpt赋能python:Python多行注释

Python 多行注释 在 Python 中&#xff0c;我们经常需要写注释来解释代码或者用于调试。Python 的注释分为单行注释和多行注释&#xff0c;本文主要介绍 Python 中如何多行注释。 单行注释 在 Python 中&#xff0c;单行注释以符号 # 开头&#xff0c;可以写在代码的任何位置…

chatgpt赋能python:Python批量加注释:一种简便的代码注释方法

Python批量加注释&#xff1a;一种简便的代码注释方法 介绍 在软件开发过程中&#xff0c;注释是非常重要的。它可以使得代码更易于理解和维护。但是&#xff0c;在大型项目中&#xff0c;加入注释是一个繁琐的过程&#xff0c;它需要耗费大量的时间和精力。Python提供了一种…

云计算在中国的市场格局是怎样的?

2016年余额不足1%了&#xff01;终于等到今天可以来回答这个问题了&#xff01;&#xff01;&#xff01; 我就以一个普通公有云从业者的视角&#xff0c;用一个字谈一谈我眼中的2016年中国云计算市场格局。 —————— 一言以概之&#xff0c;乱&#xff0c;依然很乱。 但…

Linux在Docker中安装Gitlab

1、安装Gitlab前先把git安装上 yum install -y git 2、安装成功后查看git版本信息 git version 3、设置git的账户信息 git config --global user.name "名称" git config --global user.email "邮箱" 4、创建ssh密钥&#xff0c;密钥默认保存在当前位置下 …

遥望那最悠远的守护

三寸草堂守望&#xff0c;几树落梅花&#xff0c;花落亭前下&#xff0c;怀念了谁的心声&#xff0c;斑驳了谁的年华? 悠远的守望&#xff0c;酸痛了谁心里的青丝。远方的亲人还在劳累中征途遗忘了仅剩的年华。 他们疏忽着命运的磨练&#xff0c;时至今日我得以用手中的墨笔…

halcon 21.05深度学习下载和安装

halcon21版本下载连接地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/142qWteiIgHm6QuZVOkX_pw?pwd2tw5 提取码&#xff1a;2tw5 下载后目录如下&#xff1a; 下载完毕后执行som.exe文件后&#xff0c;在浏览器中进行下载即可。 执行exe文件进入浏览器后&#x…

微信小程序【遥望小空投】

项目介绍 1、技术选型 前端&#xff1a;采用最新版的uniapp后端: 采用gin 2、产品示意图 3、有关技术交流欢迎私信

B02 - 010、安装依赖

初学耗时&#xff1a;0.5h 注&#xff1a;CSDN手机端暂不支持章节内链跳转&#xff0c;但外链可用&#xff0c;更好体验还请上电脑端。 一、安装依赖 记忆词&#xff1a; 安装依赖 B02 - 999、部署大数据环境及部分编译 ギ 舒适区ゾ || ♂ 累觉无爱 ♀ 一、安装依赖 yum…

关于计算机的未来科技作文,关于未来的科技的作文(精选3篇)

关于未来的科技的作文(精选3篇) 在日常学习、工作抑或是生活中&#xff0c;大家对作文都再熟悉不过了吧&#xff0c;借助作文人们可以实现文化交流的目的。相信很多朋友都对写作文感到非常苦恼吧&#xff0c;以下是小编整理的关于未来的科技的作文(精选3篇)&#xff0c;欢迎阅读…

腾讯的三生三世

腾讯滨海大厦/图源&#xff1a;腾讯官网 1998年&#xff0c;一位羞涩文静的男青年&#xff0c;厌倦了打工的日子&#xff0c;决定尝试一条不同的路。 他邀请了几位中学和大学同学&#xff0c;一起成立了一家小小的公司&#xff0c;借了一间舞厅当办公室&#xff0c;开始了新的事…

泰山科技学院计算机,泰山科技学院是几本

泰山科技学院是几本2019-09-24 10:02:34文/叶丹 泰山科技学院是三本。山东科技大学泰山科技学院是2004年经教育部批准的全日制普通本科大学。省级实验教学示范中心1个&#xff0c;省级教学团队2个&#xff0c;省级特色专业建设点3个。 泰山科技学院专业 本科专业&#xff1a; 计…

chatgpt赋能Python-python_office自动化

Python助力Office自动化&#xff0c;提升工作效率 当下&#xff0c;办公自动化已经逐渐成为了提高办公效率的必备技能。Python以其简单易学、高效便捷的特点被广泛应用到了办公自动化中。尤其是Python在Office自动化上的应用&#xff0c;更是让众多从事编程领域的工作者惊叹不…

[机缘参悟-99] :关于局部最优与全局最优解的人生感悟

在没有获取全局信息之前&#xff0c;要获得全局最优解几乎是不可能的&#xff0c;最多是概率大一点而已&#xff0c;大多数时候&#xff0c;由于时空资源的限制&#xff0c;获得往往是局部最优解&#xff0c;局部最优解&#xff0c;放在全局&#xff0c;往往并非全局最优&#…

基于文档的智能问答系统

基于文档的问答系统&#xff08;Document-Based Question Answering System&#xff09;是一种自然语言处理技术&#xff0c;用于回答用户提出的问题。它的原理是通过分析文档中的内容&#xff0c;提取出与用户问题相关的信息&#xff0c;并将其转换成可回答问题的格式。 Chat…

仿ChatGPT3.5的问答系统

Header.vue <template> <div class"head"><div click"headerShow" class"left"><span></span><span></span><span></span></div><div class"cont">问答系统</…

甘特图(Gantt Chart)绘制方法

给大家介绍下甘特图(Gantt Chart) 及其绘制方法,主要内容如下: 甘特图(Gantt Chart) 的简单介绍 甘特图(Gantt Chart) 绘制方法(R+Python) 甘特图(Gantt Chart) 介绍 甘特图(Gantt chart) 又称为横道图、条状图(Bar chart)。其通过条状图来显示项目、进度和其他时间相关的系…

使用 C# Graphics 绘图来绘制一个足球

背景 2022卡塔尔世界杯是足球爱好者的狂欢&#xff0c;这与我毫无关系&#xff0c;作为一个缺乏运动的人&#xff0c;还是不要去看人家玩命的运动了。虽然不看球&#xff0c;不过这波热度的持续冲击&#xff0c;还是让我在朋友圈刷到了结局 ———— 球王梅西如愿以偿捧得金杯&…