数学建模赛前备赛——模拟退火算法

一.什么是智能优化算法

智能优化算法本质上是一个优化算法,它通过不断优化模型的参数,使得系统表现达到最优,常见的只能优化算法有很多,比如说蚁群算法,遗传算法以及我们今天的主角——模拟退火算法。

二.模拟算法的前身——爬山算法

爬山算法是一种简单的优化算法,它每次会从当前解的临近解空间中选取一个最优解来作为当前解,直到达到一个局部最优解,但是爬山算法有一个致命的缺陷,就是容易陷入局部最优解,无法跳出局部最优解,从而无法找到全局最优解。像下面这个图:
在这里插入图片描述

如果我们从C开始,按照爬山算法,我们最终会陷入局部最优解A,无法找到全局最优解B。其实也是比较好理解,如果把图像看做某个函数的图像,我们找到的只是一个极值点,而不一定是最大值点或者最小值点。

三.模拟退火算法的原理

模拟退火算法是一种基于概率的全局优化算法,它模拟了金属退火的过程,通过在解空间中随机搜索,并利用概率接受较差的解,从而避免陷入局部最优解。模拟退火算法的基本思想是:在高温下,系统中的粒子具有较高的能量,可以自由地移动和交换位置,从而在解空间中搜索到全局最优解。随着温度的降低,粒子的能量逐渐减少,搜索范围逐渐缩小,最终在低温下达到全局最优解。
相比于爬山算法,它引入了温度这一变量设计了一个高温,让粒子的初始状态保持了一个较大活性,可以尝试更多可能性,进而跳出局部最优解,最终找到全局最优解。

四. 算法的实现流程

  • 初始化:初始化温度T(充分大),每个T值的迭代次数L,降温系数alpha(0,1)和终止温度eps(充分小)
  • 随机生成初始解A,计算对应的f(A)
  • 在A附近生成新解,计算增量
  • 判断是否接受新解
  • 降温
  • 判断是否达到终止条件, 如果达到,则结束,否则回到第二步

五.算法的为伪代码实现

我们可以将模拟退火算法写作一个双重迭代算法,分为下面的两个过程:

  • 外循环(退火过程):模拟初始温度很大温度逐渐下降的过程
  • 内循环(搜索过程):模拟某一温度下粒子的跳动过程

首先是外循环:我们首先将固体达到较高的温度(设置一个较高的初始的温度)。然后我们根据降温系数alpha使温度按照一定的比例下降,当达到终止温度eps时,冷却结束,模拟退火结束

T=2000 #初始温度
eps=1e-8  #终止温度
alpha=0.99  #降温系数(越接近1结果越精确)
while T>eps:T*=alpha

然后是内循环:我们首先在当前温度下随机选择一个解,然后计算这个解的适应度值,然后计算新解的适应度值,如果新解的适应度值比当前解的适应度值要高,那么我们就接受新解,否则我们以一定的概率接受新解,这个概率的计算公式为exp(-ΔE/T),其中ΔE为新解的适应度值减去当前解的适应度值,T为当前温度。然后我们更新当前解为新解,继续进行内循环,直到达到终止温度eps,模拟退火结束,大致的流程如下:
在这里插入图片描述

大家有可能不是很理解为什么在左边出现更差的结果我们还会有一定的可能接受这个较差的解,而这就是模拟退火算法的核心思想,它允许算法在搜索过程中接受较差的解,从而避免陷入局部最优解,最终找到全局最优解。

六.算法的优缺点

优点:

  • 模拟退火算法是一种全局优化算法,它可以在解空间中搜索到全局最优解,而不会陷入局部最优解。
  • 不受问题约束条件的限制,可以处理各种类型的优化问题。
  • 解与初始解无关,算法的搜索过程是随机的,因此可以避免陷入局部最优解。
  • 可以灵活地调整参数,如初始温度、降温系数和终止温度等,来平衡搜素时间与搜素质量。

缺点:

  • 模拟退火算法的计算复杂度较高,对于大规模问题,计算时间较长。
  • 算法收敛速度较慢,需要较大的计算资源。
  • 需要合适的初始解与参数调整

七.算法的应用

这里我们以旅行商问题(Travelling Salesman Problem,TSP)为例,来演示模拟退火算法的应用。旅行商问题是一个经典的组合优化问题,要求找到一条最短的路径,使得旅行商能够访问所有的城市并返回到起点。旅行商问题是一个NP-hard问题,没有已知的高效算法可以解决所有实例。因此,模拟退火算法是一种有效的解决旅行商问题的方法,我们来看一下如何基于模拟退火算法解决旅行商问题,代码如下:

import random
import math
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号class SA_TSP:def __init__(self, n, X, Y, n_Tk, r, T_f, T0):self.n = n  # 城市数量self.X = X  # 城市坐标self.Y = Y  # 城市坐标self.n_Tk = n_Tk  # 内循环次数self.r = r  # 降温系数self.T_f = T_f  # 终止温度self.T0 = T0  # 初始温度self.alpha = r  # 温度更新系数# 计算路径长度def fitness(self, X0):s = 0for i in range(self.n):if i != self.n - 1:s += np.sqrt((self.X[X0[i]] - self.X[X0[i + 1]]) ** 2 + (self.Y[X0[i]] - self.Y[X0[i + 1]]) ** 2)else:s += np.sqrt((self.X[X0[i]] - self.X[X0[0]]) ** 2 + (self.Y[X0[i]] - self.Y[X0[0]]) ** 2)return sdef exchange(self, X0, i, j):X1 = X0.copy()X1[i], X1[j] = X1[j], X1[i]return X1def initialX0(self, n):X0 = np.random.permutation(range(n))return X0def SA_TSP(self):X0 = self.initialX0(self.n)# 记录最优路径X_min = [X0]# 记录最优路径长度s_min = [self.fitness(X0)]k = 0while self.T0 > self.T_f:for _ in range(self.n_Tk):i, j = random.sample(range(self.n), 2)X1 = self.exchange(X0, i, j)s1 = self.fitness(X0)s2 = self.fitness(X1)# 更新历史最优解if s2 < min(s_min):s_min.append(s2)X_min.append(X1)else:s_min.append(s_min[-1])X_min.append(X_min[-1])# 判断是否更新解if s2 < s1:X0 = X1else:E = math.exp(-(s2 - s1) / self.T0)R = random.uniform(0, 1)if E > R:X0 = X1k += 1self.T0 *= self.alpha  # 温度更新# 绘制优化过程plt.plot(range(k+1), s_min)plt.xlabel('迭代次数')plt.ylabel('最优路径长度')plt.show()# 绘制最优路径W = X_min[-1]for i in range(self.n):if i != self.n - 1:plt.plot([self.X[W[i]], self.X[W[i + 1]]], [self.Y[W[i]], self.Y[W[i + 1]]], c='plum')else:plt.plot([self.X[W[i]], self.X[W[0]]], [self.Y[W[i]], self.Y[W[0]]], c='plum')plt.scatter(self.X, self.Y, c='red')plt.title("路线图")plt.xlabel("x")plt.ylabel("y")plt.show()return X_min[-1], s_min[-1]# 定义城市坐标
n = 30
city_x = [41, 37, 54, 25, 7, 2, 68, 71, 54, 83, 64, 18, 22, 83, 91, 25, 24, 58, 71, 74, 87,18, 13, 82, 62, 58, 45, 41, 44, 4]
city_y = [94, 84, 67, 62, 64, 99, 58, 44, 62, 69, 60, 54, 60, 46, 38, 38, 42, 69, 71, 78, 76,40, 40, 7, 32, 35, 21, 26, 35, 50]
# 内循环的迭代次数
n_Tk = 300
# 降温变化
r = 0.9
# 终止温度
T_f = 0.001
# 初始温度
T0 = 2000
# 创建对象
city30 = SA_TSP(n, city_x, city_y, n_Tk, r, T_f, T0)
# 方法
Xmin, smin = city30.SA_TSP()
print("最短路径为:", Xmin)
print("最短路径长度为:", smin)

运行结果如下:
在这里插入图片描述
在这里插入图片描述

相比于其他智能优化算法,模拟退火算法适用范围光,全局搜素能力强,不容易陷入局部最优解,这些都是我们可以在论文中去体现的东西,今天的算法介绍就到此为止了,下篇见

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

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

相关文章

开放大世界的碰撞与物理

众所周知&#xff0c;物理开销一直是 CPU 的一个大头&#xff0c;而且还很容易出问题。对于开放世界&#xff0c;该如何进行物理运算&#xff0c;以及采用什么方案计算碰撞。 本文针对这个问题做了一些细微的研究&#xff0c;算是对 Unity 下的解决方案有了一个大致的方向。 1、…

Gartner报告解读:如何帮助企业完善数据分析与治理路线图

Gartner服务于全球100多个国家和地区的14,000余家机构&#xff0c;是一家深受客户信赖、观点客观的研究顾问公司。Garnter洞察、建议和工具可帮助您发现创新机遇&#xff0c;完成关键优先任务&#xff0c;助您成为企业不可或缺的战略专家和价值创造者。该公司是标普 500 指数成…

手把手教在Linux系统服务器下运行HM编码

先在SVN上下载HM文件包&#xff0c;可以看到文件中有linux文件夹&#xff0c;如果在windows下运行直接打开sln后缀的项目。不清楚的看这个&#xff1a; 一、准备工作 1、删除linux文件加下makefile.base中-Werror&#xff0c;文件路径如下&#xff1a; 打开文件&#xff0c;c…

自制深度学习推理框架之表达式层的设计与实现

文章目录 一、表达式Expression二、词法解析2.1 词法定义2.2 词法解析 三、语法解析3.1 语法树的定义3.2 语法树构建3.3 语法树的转换(逆波兰式) 四、表达式层4.1 ExpressionLayer和ExpressionParser类4.2 表达式层的注册4.3 表达式层的输入处理4.4 表达式层的计算过程 五、计算…

插入排序的动画展示与实现

排序学习思路&#xff1a;先实现单趟逻辑&#xff0c;在实现整体逻辑&#xff1b;先解决普遍情况&#xff0c;再解决特殊情况。 什么是插入排序 回忆下自己玩扑克牌的时候是怎么把手上的牌理顺的吧&#xff01;其实那就是插入排序&#xff0c;从左边往右边&#xff0c;把一张张…

Profinet 从站转 EtherNet/IP 从站网关

产品用途 本产品是 PN(Profinet) 和 EtherNet/IP 网关&#xff0c;使用数据映射方式工作。 本产品在 PN 侧作为 PN IO 从站&#xff0c;接 PN 主站设备&#xff0c;比如西门子 PLC 等&#xff1b;在EtherNet/IP 侧做为 EtherNet/IP 从站&#xff0c;接 EtherNet…

C++:继承用法详解~

在学完C的类和对象&#xff0c;并掌握了类的核心语法与基本用法之后&#xff1b;我们就得去学习一下继承的语法&#xff0c;与继承的用法。简单概括一下&#xff0c;继承是C中一种代码复用的手段&#xff0c;它允许我们&#xff0c;对已有的类&#xff0c;增添新的成员函数或变…

opencv实战项目十六:kmeans图像颜色聚类:

文章目录 前言K-means介绍效果 前言 在数字化时代&#xff0c;图像处理技术已成为计算机视觉领域的重要组成部分。其中&#xff0c;图像颜色聚类作为一项关键技术在众多应用场景中发挥着重要作用&#xff0c;如图像分割、物体识别、色彩调整等。K-means算法作为一种经典的聚类…

【云游戏】点量云流赋能大型游戏新体验

点量小刘发现近期国产化大型3A游戏《黑神话&#xff1a;悟空》的发售&#xff0c;可谓是赢得了一波好评。从场景内容来说深厚的文化底蕴支撑和高质量精美的特效及画面制作令人眼前一亮&#xff0c;作为备受瞩目的一款游戏&#xff0c;从技术层面来说&#xff0c;该游戏也离不开…

【DSP+FPGA】基于DSP+FPGA XC7K325T与TMS320C6678的通用信号处理平台

DSP FPGA 协同处理架构板载 1 个TMS320C6678 多核DSP处理节点板载 1 片 XC7K325T FPGA处理节点板载 1 个FMC 接口板载4路SFP光纤接口FPGA 与 DSP 之间采用高速Rapid IO互联 基于FPGA与DSP协同处理架构的通用高性能实时信号处理平台&#xff0c;该平台采用1片TI的KeyStone系列多…

制造企业如何启用BI工具,并构建自助式BI业务模式?

在制造业的数字化转型浪潮中&#xff0c;商业智能BI工具正逐渐成为推动企业增长的“加速引擎”。随着数据量的爆炸性增长&#xff0c;如何高效地分析和利用数据&#xff0c;已成为制造业提升竞争力的关键。本文将基于BI工具在制造业中的优势&#xff0c;深入探讨一种创新的BI分…

[Meachines] [Insane] Bankrobber XSS-MDOG+SQLI+XSRF+Local-RCE+Bankv2转账模拟应用缓冲区溢出

信息收集 IP AddressOpening Ports10.10.10.154TCP:80&#xff0c;443&#xff0c;445&#xff0c;3306 $ nmap -p- 10.10.10.154 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http …

jenkins安装k8s插件发布服务

1、安装k8s插件 登录 Jenkins&#xff0c;系统管理→ 插件管理 → 搜索 kubernetes&#xff0c;选择第二个 Kubernetes&#xff0c;点击 安装&#xff0c;安装完成后重启 Jenkins 。 2、对接k8s集群、申请k8s凭据 因为 Jenkins 服务器在 kubernetes 集群之外&#xff0c;所以…

JVM垃圾回收算法:标记-清除算法 、复制算法、 标记-整理算法、 分代收集算法

文章目录 引言I 标记回收算法(Mark-Sweep)算法不足II 复制算法(Copying)III 标记整理算法(Mark-Compact)IV 分代收集(以上三种算法的集合体)内存划分新生代算法:Minor GC老年代算法V 查看JVM堆分配引言 垃圾回收(Garbage Collection,GC) Java支持内存动态分配、…

机器学习/数据分析案例---糖尿病预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 这是一篇数据分析/机器学习很好的入门案例&#xff0c;对糖尿病的影响进行预测和分析通过随机森林预测&#xff0c;平均准确率和召回率都不错不足&#x…

Pytorch实现多层LSTM模型,并增加emdedding、Dropout、权重共享等优化

简述 本文是 Pytorch封装简单RNN模型&#xff0c;进行中文训练及文本预测 一文的延申&#xff0c;主要做以下改动&#xff1a; 1.将nn.RNN替换为nn.LSTM&#xff0c;并设置多层LSTM&#xff1a; 既然使用pytorch了&#xff0c;自然不需要手动实现多层&#xff0c;注意nn.RNN…

Threejs之OrbitControls轨道控制器

本文目录 前言一、Orbitcontrols&#xff08;轨道控制器&#xff09;1.1 基础使用1.2 代码演示 二、效果展示 前言 Orbitcontrols&#xff08;轨道控制器&#xff09;可以使得相机围绕目标进行轨道运动。 一、Orbitcontrols&#xff08;轨道控制器&#xff09; 1.1 基础使用 C…

【Python 千题 —— 基础篇】身份证隐藏的信息

Python 千题持续更新中 …… 脑图地址 👉:⭐https://twilight-fanyi.gitee.io/mind-map/Python千题.html⭐ 题目描述 题目描述 在一个用户信息管理系统中,你需要处理和验证用户提供的身份证号。编写一个程序来从用户信息字符串中提取和验证身份证号,并提供相应的处理方式…

图论----最小生成树讲解与相关题解

目前已更新系列 当前--图论----最小生成树讲解与相关题解 滑动窗口系列算法总结与题解一 算法系列----并查集总结于相关题解 图论---dfs系列 差分与前缀和总结与对应题解&#xff08;之前笔试真的很爱考&#xff09; 数论---质数判断、质因子分解、质数筛&#xff08;埃氏…

在 Cilium CNI 集群上运行 vCluster 虚拟集群

上周在 KubeCon China 2024 大会上&#xff0c;我和社区伙伴们作为志愿者在 Cilium 项目展台与用户交流。有位用户询问 Cilium 是否能与 vCluster 集成&#xff0c;当时未能给出明确答复&#xff0c;特地回来后进行了测试。 答案是&#xff1a;在最新的 vCluster v0.20 中容器…