2024国赛数学建模-模拟火算法(MATLAB 实现)
-
模拟退火算法
1.1 算法原理 模拟退火算法的基本思想是从一给定解开始 ,从邻域 中随机产生另一个解 ,接受 Metropolis准则允许目标函数在 有限范围内变坏 ,它由一控制参数 t决定 ,其作用类似于物 理过程中的温度 T,对于控制参数的每一取值 ,算法持续进 行“产生 —判断 —接受或舍去 ”的迭代过程 ,对应着固体在 某一恒定温度下的趋于热平衡的过程 ,当控制参数逐渐减 小并趋于 0时 ,系统越来越趋于平衡态 ,最后系统状态对应于优化问题的全局最优解 ,该过程也称为冷却过程 ,由于固 体退火必须缓慢降温 ,才能使固体在每一温度下都达到热 平衡 ,最终趋于平衡状态 ,因此控制参数 t经缓慢衰减 ,才 能确保模拟退火算法最终优化问题的整体最优解。
-
2 算法具体步骤
(1)给定模型每一个参数变化范围 ,在这个范围内随 机选择一个初始模型 m0 ,并计算相应的目标函数值 E (m0 )。
(2)对当前模型进行扰动产生一个新模型 m,计算相应 的目标函数值 E (m) ,得到 ΔE = E (m) - E (m0 )。
(3)若 ΔE < 0,则新模型被接受 ;若 ΔE > 0,则新模型 m 按概率 P = exp ( -ΔE/T)进行接受 , T为温度。当模型被接 受时 ,置 m0 =m, E (m0 ) = E (m)。
(4)在温度 T下 ,重复一定次数的扰动和接受过程 ,即 重复步骤 (2)、(3)。
(5)缓慢降低温度 T。
(6)重复步骤 (2)、(5) ,直至收敛条件满足为止。
算法的实质分两次循环 ,随机扰动产生新模型并计算 目标函数值 (或称能量 )的变化 ,决定是否被接受。由于算 法初始温度设计在高温条件 ,这使得 E增大的模型可能被 接受 ,因而能舍去局部极小值 ,通过缓慢地降低温度 ,算法 最终能收敛到全局最优点。
实验用例:用模拟退火算法解决如下 10 个城市的 TSP 问题(Traveling Salesman Problem,旅行商问题),由威廉哈密顿爵士和英国数学家克克曼T.P.Kirkman于19世纪初提出。 问题描述如下: 有若干个城市,任何两个城市之间的距离都是确定的,现要求一旅行商从某城市出发必须经过每一个城市且只在一个城市逗留一次,最后回到出发的城市,问如何事先确定一条最短的线路已保证其旅行的费用最少?),该问题最优解为 f_opt = 2.691。

编程实现
用 MATLAB 实现模拟退火算法时,共编制了 5 个 m 文件,分别如下
-
swap.m
function [ newpath , position ] = swap( oldpath , number )% 对 oldpath 进 行 互 换 操 作% number 为 产 生 的 新 路 径 的 个 数% position 为 对 应 newpath 互 换 的 位 置m = length( oldpath ) ; % 城 市 的 个 数newpath = zeros( number , m ) ;position = sort( randi( m , number , 2 ) , 2 ); % 随 机 产 生 交 换 的 位 置for i = 1 : numbernewpath( i , : ) = oldpath ;% 交 换 路 径 中 选 中 的 城 市newpath( i , position( i , 1 ) ) = oldpath( position( i , 2 ) ) ;newpath( i , position( i , 2 ) ) = oldpath( position( i , 1 ) ) ;end
2.pathfare.m
function [ objval ] = pathfare( fare , path )% 计 算 路 径 path 的 代 价 objval% path 为 1 到 n 的 排 列 ,代 表 城 市 的 访 问 顺 序 ;% fare 为 代 价 矩 阵 , 且 为 方 阵 。[ m , n ] = size( path ) ;objval = zeros( 1 , m ) ;for i = 1 : mfor j = 2 : nobjval( i ) = objval( i ) + fare( path( i , j - 1 ) , path( i , j ) ) ;endobjval( i ) = objval( i ) + fare( path( i , n ) , path( i , 1 ) ) ;end
3、distance.m
function [ fare ] = distance( coord )% 根 据 各 城 市 的 距 离 坐 标 求 相 互 之 间 的 距 离% fare 为 各 城 市 的 距 离 , coord 为 各 城 市 的 坐 标[ ~ , m ] = size( coord ) ; % m 为 城 市 的 个 数fare = zeros( m ) ;for i = 1 : m % 外 层 为 行for j = i : m % 内 层 为 列fare( i , j ) = ...( sum( ( coord( : , i ) - coord( : , j ) ) .^ 2 ) ) ^ 0.5 ;fare( j , i ) = fare( i , j ) ; % 距 离 矩 阵 对 称endend
4、myplot.m
function [ ] = myplot( path , coord , pathfar )% 做 出 路 径 的 图 形% path 为 要 做 图 的 路 径 ,coord 为 各 个 城 市 的 坐 标% pathfar 为 路 径 path 对 应 的 费 用len = length( path ) ;clf ;hold on ;title( [ '近似最短路径如下,费用为' , num2str( pathfar ) ] ) ;plot( coord( 1 , : ) , coord( 2 , : ) , 'ok');pause( 0.4 ) ;for ii = 2 : lenplot( coord( 1 , path( [ ii - 1 , ii ] ) ) , coord( 2 , path( [ ii - 1 , ii ] ) ) , '-b');x = sum( coord( 1 , path( [ ii - 1 , ii ] ) ) ) / 2 ;y = sum( coord( 2 , path( [ ii - 1 , ii ] ) ) ) / 2 ;text( x , y , [ '(' , num2str( ii - 1 ) , ')' ] ) ;pause( 0.4 ) ;endplot( coord( 1 , path( [ 1 , len ] ) ) , coord( 2 , path( [ 1 , len ] ) ) , '-b' ) ;x = sum( coord( 1 , path( [ 1 , len ] ) ) ) / 2 ;y = sum( coord( 2 , path( [ 1 , len ] ) ) ) / 2 ;text( x , y , [ '(' , num2str( len ) , ')' ] ) ;pause( 0.4 ) ;hold off ;
5、mySAA.m
% 模 拟 退 火 算 法 ( Simulated Annealing Algorithm ) MATLAB 程 序clear ;% 程 序 参 数 设 定Coord = ... % 城 市 的 坐 标 Coordinates[ 0.6683 0.6195 0.4 0.2439 0.1707 0.2293 0.5171 0.8732 0.6878 0.8488 ; ...0.2536 0.2634 0.4439 0.1463 0.2293 0.761 0.9414 0.6536 0.5219 0.3609 ] ;t0 = 1 ; % 初 温 t0iLk = 20 ; % 内 循 环 最 大 迭 代 次 数 iLkoLk = 50 ; % 外 循 环 最 大 迭 代 次 数 oLklam = 0.95 ; % λ lambdaistd = 0.001 ; % 若 内 循 环 函 数 值 方 差 小 于 istd 则 停 止ostd = 0.001 ; % 若 外 循 环 函 数 值 方 差 小 于 ostd 则 停 止ilen = 5 ; % 内 循 环 保 存 的 目 标 函 数 值 个 数olen = 5 ; % 外 循 环 保 存 的 目 标 函 数 值 个 数% 程 序 主 体m = length( Coord ) ; % 城 市 的 个 数 mfare = distance( Coord ) ; % 路 径 费 用 farepath = 1 : m ; % 初 始 路 径 pathpathfar = pathfare( fare , path ) ; % 路 径 费 用 path fareores = zeros( 1 , olen ) ; % 外 循 环 保 存 的 目 标 函 数 值e0 = pathfar ; % 能 量 初 值 e0t = t0 ; % 温 度 tfor out = 1 : oLk % 外 循 环 模 拟 退 火 过 程ires = zeros( 1 , ilen ) ; % 内 循 环 保 存 的 目 标 函 数 值for in = 1 : iLk % 内 循 环 模 拟 热 平 衡 过 程[ newpath , ~ ] = swap( path , 1 ) ; % 产 生 新 状 态e1 = pathfare( fare , newpath ) ; % 新 状 态 能 量% Metropolis 抽 样 稳 定 准 则r = min( 1 , exp( - ( e1 - e0 ) / t ) ) ;if rand < rpath = newpath ; % 更 新 最 佳 状 态e0 = e1 ;endires = [ ires( 2 : end ) e0 ] ; % 保 存 新 状 态 能 量% 内 循 环 终 止 准 则 :连 续 ilen 个 状 态 能 量 波 动 小 于 istdif std( ires , 1 ) < istdbreak ;endendores = [ ores( 2 : end ) e0 ] ; % 保 存 新 状 态 能 量% 外 循 环 终 止 准 则 :连 续 olen 个 状 态 能 量 波 动 小 于 ostdif std( ores , 1 ) < ostdbreak ;endt = lam * t ;endpathfar = e0 ;% 输 入 结 果fprintf( '近似最优路径为:\n ' )%disp( char( [ path , path(1) ] + 64 ) ) ;disp(path)fprintf( '近似最优路径费用\tpathfare=' ) ;disp( pathfar ) ;myplot( path , Coord , pathfar ) ;


我试着运行了几次(只是改变了一下初温,也可以更改一下其他参数),发现初始温度 t0=1 时程序的最后结果与最优解差距小的概率比较大。 希望对大家有用!!
相关文章:
2024国赛数学建模-模拟火算法(MATLAB 实现)
模拟退火算法 1.1 算法原理 模拟退火算法的基本思想是从一给定解开始 ,从邻域 中随机产生另一个解 ,接受 Metropolis准则允许目标函数在 有限范围内变坏 ,它由一控制参数 t决定 ,其作用类似于物 理过程中的温度 T,对于控制参数的每一取值 ,算法持续进 行“产生 —判断 —接受…...
YOLOv8 只检测人 只画框不要标签
参考了这个:YOLOv8只检测人(或其他一种或者多种类别)_yolov8只检测指定类别-CSDN博客 1. 只检测人:predict的时候指定参数classes[0] 2. 只画框不要标签:plot的时候传入labelsFalse 3. 标签中去掉置信度:…...
如何将网络安全防范游戏化
组织对威胁的准备和恢复能力跟不上网络犯罪分子的进步。 一些首席执行官仍然认为网络安全需要偶尔干预,而不是持续关注。 但对于许多公司来说,情况并非如此;网络威胁准备需要协调一致的培训工作,因此网络安全团队在攻击发生时已…...
Qt QGraphicsView实现图片放缩、鼠标拖动移动、鼠标点位置放大缩小_图片查看
QtQGraphicsView实现图片放缩、鼠标拖动移动、鼠标点位置放大缩小 头文件: #ifndef TIMGWIDGET_H #define TIMGWIDGET_H#include <QGraphicsItem> #include <QMainWindow> #include <QObject> #include <QWidget>// class TImgWidget : pu…...
Percona Toolkit 神器全攻略(复制类)
Percona Toolkit 神器全攻略(复制类) Percona Toolkit 神器全攻略系列共八篇,前文回顾: 前文回顾Percona Toolkit 神器全攻略Percona Toolkit 神器全攻略(实用类)Percona Toolkit 神器全攻略(配…...
SQLite3 数据类型深入全面讲解
SQLite3,作为一款轻量级的数据库管理系统,在数据存储方面展现出了其独特的魅力。它不仅支持标准的SQL语法,还提供了丰富的数据类型供开发者选择。这些数据类型不仅涵盖了基本的数值和文本类型,还包括了日期时间、二进制数据等复杂…...
Python高效实现Trie(前缀树)及其插入和查找操作
Python高效实现Trie(前缀树)及其插入和查找操作 在Python面试中,考官通常会关注候选人的编程能力、问题解决能力以及对Python语言特性的理解。Trie(前缀树)是一种高效的数据结构,广泛应用于字符串处理、自动补全、拼写检查等场景。本文将详细介绍如何实现一个Trie,并提…...
傅里叶变换家族
禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码...
深度学习——强化学习算法介绍
强化学习算法介绍 强化学习讨论的问题是一个智能体(agent) 怎么在一个复杂不确定的环境(environment)里面去极大化它能获得的奖励。 强化学习和监督学习 强化学习有这个试错探索(trial-and-error exploration),它需要通过探索环境来获取对环境的理解。强化学习 ag…...
轴承知识大全,详细介绍(附3D图纸免费下载)
轴承一般由内圈、外圈、滚动体和保持架组成。对于密封轴承,再加上润滑剂和密封圈(或防尘盖)。这就是轴承的全部组成。 根据轴承使用的工作状况来选用不同类型的轴承,才能更好的发挥轴承的功能,并延长轴承的使用寿命。我…...
【PyTorch】基础环境如何打开
前期安装可以基于这个视频,本文是为了给自己存档如何打开pycharm和jupyter notebookPyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】_哔哩哔哩_bilibili Pycharm 配置 新建项目的时候选择解释器pytorch-gpu即可。 Jupyte…...
QT教程:QTime和QTimer的使用场景
QTime类 QTime 是一个用来表示和操作时间的类,它处理一天中的具体时间(例如小时、分钟、秒、毫秒)。通常用于计算时间间隔、记录时间戳、获取当前时间等。 特点和功能 表示时间:QTime 用来表示一天中的某个具体时间(小…...
MySQL 迁移中 explicit_defaults_for_timestamp 参数影响
前言 最近在做数据迁移的时候,使用的是云平台自带的同步工具,在预检查阶段,当时报错 explicit_defaults_for_timestamp 参数在目标端为 off 建议修改 on,有什么风险呢?在此记录下。 测试对比 MySQL 默认情况下 expl…...
树状数组记录
树状数组(Fenwick Tree)是一种用于维护数组前缀和的数据结构,支持高效的单点更新和区间查询操作。它的查询和更新时间复杂度为 O ( log n ) O(\log n) O(logn),适用于需要频繁更新和查询的场景。 树状数组的基本操作 单点更…...
客户端时间和服务器时间的区别
客户端时间: 服务器向客户端拷贝一份前端内容,客户端通过JS获取时间,这样获取的是客户端时间 服务器时间: 服务器通过java代码获取的时间传输给客户端,这样获取的是服务器时间 当有些时候需要使用客户端时间…...
已入职华为!!关于我成功拿下华为大模型算法岗经验总结
方向:大模型算法工程师 整个面试持续了1小时10分钟,能够看出面试官是典型搞技术的,问的很专业又很细,全程感觉压力好大,面完后感觉丝丝凉意,不过幸好还是成功拿下了Offer 一面: 自我介绍 简历项目深度交流 1.项目的背…...
从安卓开发到AI产品经理——我的AI绘画之旅
大家好,我是一名有着多年安卓开发经验的程序员。在日复一日的编码生活中,我对AI行业产生了浓厚的兴趣。于是,我决定转行成为一名AI产品经理。在这个过程中,我通过学习AI绘画工具初步了解了AI行业,下面我将分享我的学习…...
代码随想录八股训练营第三十四天| C++
前言 一、vector和list的区别? 1.1.存储方式: 1.2.随机访问: 1.3.插入和删除操作: 1.4.内存使用: 1.5.容量和大小: 1.6.迭代器类型: 1.7.用途: 二、vector 底层原理和扩容过…...
《深入理解 Java 中的 this 关键字》
目录 一、this关键字的基本理解 二、this调用属性和方法 (一)一般情况 (二)特殊情况 三、this调用构造器 四、案例分析 (一)Account类 (二)Customer类 (三&…...
python文件自动分类(5)
完成了文件自动分类的操作后,我们一起来复习下: 首先,获取文件夹中所有文件名称,用 os.path.join() 函数拼接出要移动到的目标地址。然后,使用 os.path.exists() 函数判断目标文件夹是否存在,不存在用 os.m…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
