当前位置: 首页 > news >正文

2024国赛数学建模-模拟火算法(MATLAB 实现)

  1. 模拟退火算法

1.1 算法原理 模拟退火算法的基本思想是从一给定解开始 ,从邻域 中随机产生另一个解 ,接受 Metropolis准则允许目标函数在 有限范围内变坏 ,它由一控制参数 t决定 ,其作用类似于物 理过程中的温度 T,对于控制参数的每一取值 ,算法持续进 行“产生 —判断 —接受或舍去 ”的迭代过程 ,对应着固体在 某一恒定温度下的趋于热平衡的过程 ,当控制参数逐渐减 小并趋于 0时 ,系统越来越趋于平衡态 ,最后系统状态对应于优化问题的全局最优解 ,该过程也称为冷却过程 ,由于固 体退火必须缓慢降温 ,才能使固体在每一温度下都达到热 平衡 ,最终趋于平衡状态 ,因此控制参数 t经缓慢衰减 ,才 能确保模拟退火算法最终优化问题的整体最优解。

  1. 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 文件,分别如下

  1. 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 : number newpath( 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 : m for j = 2 : n  objval( i ) = objval( i ) + fare( path( i , j - 1 ) , path( i , j ) ) ; end objval( 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 : len plot( 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 ) ; % 城 市 的 个 数 m fare = 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 < r path = newpath ; % 更 新 最 佳 状 态 e0 = e1 ; end ires = [ ires( 2 : end ) e0 ] ; % 保 存 新 状 态 能 量 % 内 循 环 终 止 准 则 :连 续 ilen 个 状 态 能 量 波 动 小 于 istd if std( ires , 1 ) < istd break ; end end ores = [ ores( 2 : end ) e0 ] ; % 保 存 新 状 态 能 量% 外 循 环 终 止 准 则 :连 续 olen 个 状 态 能 量 波 动 小 于 ostd if std( ores , 1 ) < ostd break ; end t = 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 只检测人 只画框不要标签

参考了这个&#xff1a;YOLOv8只检测人&#xff08;或其他一种或者多种类别&#xff09;_yolov8只检测指定类别-CSDN博客 1. 只检测人&#xff1a;predict的时候指定参数classes[0] 2. 只画框不要标签&#xff1a;plot的时候传入labelsFalse 3. 标签中去掉置信度&#xff1a…...

如何将网络安全防范游戏化

组织对威胁的准备和恢复能力跟不上网络犯罪分子的进步。 一些首席执行官仍然认为网络安全需要偶尔干预&#xff0c;而不是持续关注。 但对于许多公司来说&#xff0c;情况并非如此&#xff1b;网络威胁准备需要协调一致的培训工作&#xff0c;因此网络安全团队在攻击发生时已…...

Qt QGraphicsView实现图片放缩、鼠标拖动移动、鼠标点位置放大缩小_图片查看

QtQGraphicsView实现图片放缩、鼠标拖动移动、鼠标点位置放大缩小 头文件&#xff1a; #ifndef TIMGWIDGET_H #define TIMGWIDGET_H#include <QGraphicsItem> #include <QMainWindow> #include <QObject> #include <QWidget>// class TImgWidget : pu…...

Percona Toolkit 神器全攻略(复制类)

Percona Toolkit 神器全攻略&#xff08;复制类&#xff09; Percona Toolkit 神器全攻略系列共八篇&#xff0c;前文回顾&#xff1a; 前文回顾Percona Toolkit 神器全攻略Percona Toolkit 神器全攻略&#xff08;实用类&#xff09;Percona Toolkit 神器全攻略&#xff08;配…...

SQLite3 数据类型深入全面讲解

SQLite3&#xff0c;作为一款轻量级的数据库管理系统&#xff0c;在数据存储方面展现出了其独特的魅力。它不仅支持标准的SQL语法&#xff0c;还提供了丰富的数据类型供开发者选择。这些数据类型不仅涵盖了基本的数值和文本类型&#xff0c;还包括了日期时间、二进制数据等复杂…...

Python高效实现Trie(前缀树)及其插入和查找操作

Python高效实现Trie(前缀树)及其插入和查找操作 在Python面试中,考官通常会关注候选人的编程能力、问题解决能力以及对Python语言特性的理解。Trie(前缀树)是一种高效的数据结构,广泛应用于字符串处理、自动补全、拼写检查等场景。本文将详细介绍如何实现一个Trie,并提…...

傅里叶变换家族

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码...

深度学习——强化学习算法介绍

强化学习算法介绍 强化学习讨论的问题是一个智能体(agent) 怎么在一个复杂不确定的环境(environment)里面去极大化它能获得的奖励。 强化学习和监督学习 强化学习有这个试错探索(trial-and-error exploration)&#xff0c;它需要通过探索环境来获取对环境的理解。强化学习 ag…...

轴承知识大全,详细介绍(附3D图纸免费下载)

轴承一般由内圈、外圈、滚动体和保持架组成。对于密封轴承&#xff0c;再加上润滑剂和密封圈&#xff08;或防尘盖&#xff09;。这就是轴承的全部组成。 根据轴承使用的工作状况来选用不同类型的轴承&#xff0c;才能更好的发挥轴承的功能&#xff0c;并延长轴承的使用寿命。我…...

【PyTorch】基础环境如何打开

前期安装可以基于这个视频&#xff0c;本文是为了给自己存档如何打开pycharm和jupyter notebookPyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】_哔哩哔哩_bilibili Pycharm 配置 新建项目的时候选择解释器pytorch-gpu即可。 Jupyte…...

QT教程:QTime和QTimer的使用场景

QTime类 QTime 是一个用来表示和操作时间的类&#xff0c;它处理一天中的具体时间&#xff08;例如小时、分钟、秒、毫秒&#xff09;。通常用于计算时间间隔、记录时间戳、获取当前时间等。 特点和功能 表示时间&#xff1a;QTime 用来表示一天中的某个具体时间&#xff08;小…...

MySQL 迁移中 explicit_defaults_for_timestamp 参数影响

前言 最近在做数据迁移的时候&#xff0c;使用的是云平台自带的同步工具&#xff0c;在预检查阶段&#xff0c;当时报错 explicit_defaults_for_timestamp 参数在目标端为 off 建议修改 on&#xff0c;有什么风险呢&#xff1f;在此记录下。 测试对比 MySQL 默认情况下 expl…...

树状数组记录

树状数组&#xff08;Fenwick Tree&#xff09;是一种用于维护数组前缀和的数据结构&#xff0c;支持高效的单点更新和区间查询操作。它的查询和更新时间复杂度为 O ( log ⁡ n ) O(\log n) O(logn)&#xff0c;适用于需要频繁更新和查询的场景。 树状数组的基本操作 单点更…...

客户端时间和服务器时间的区别

客户端时间&#xff1a; 服务器向客户端拷贝一份前端内容&#xff0c;客户端通过JS获取时间&#xff0c;这样获取的是客户端时间 服务器时间&#xff1a; 服务器通过java代码获取的时间传输给客户端&#xff0c;这样获取的是服务器时间 当有些时候需要使用客户端时间&#xf…...

已入职华为!!关于我成功拿下华为大模型算法岗经验总结

方向:大模型算法工程师 整个面试持续了1小时10分钟&#xff0c;能够看出面试官是典型搞技术的&#xff0c;问的很专业又很细&#xff0c;全程感觉压力好大&#xff0c;面完后感觉丝丝凉意&#xff0c;不过幸好还是成功拿下了Offer 一面: 自我介绍 简历项目深度交流 1.项目的背…...

从安卓开发到AI产品经理——我的AI绘画之旅

大家好&#xff0c;我是一名有着多年安卓开发经验的程序员。在日复一日的编码生活中&#xff0c;我对AI行业产生了浓厚的兴趣。于是&#xff0c;我决定转行成为一名AI产品经理。在这个过程中&#xff0c;我通过学习AI绘画工具初步了解了AI行业&#xff0c;下面我将分享我的学习…...

代码随想录八股训练营第三十四天| C++

前言 一、vector和list的区别&#xff1f; 1.1.存储方式&#xff1a; 1.2.随机访问&#xff1a; 1.3.插入和删除操作&#xff1a; 1.4.内存使用&#xff1a; 1.5.容量和大小&#xff1a; 1.6.迭代器类型&#xff1a; 1.7.用途&#xff1a; 二、vector 底层原理和扩容过…...

《深入理解 Java 中的 this 关键字》

目录 一、this关键字的基本理解 二、this调用属性和方法 &#xff08;一&#xff09;一般情况 &#xff08;二&#xff09;特殊情况 三、this调用构造器 四、案例分析 &#xff08;一&#xff09;Account类 &#xff08;二&#xff09;Customer类 &#xff08;三&…...

python文件自动分类(5)

完成了文件自动分类的操作后&#xff0c;我们一起来复习下&#xff1a; 首先&#xff0c;获取文件夹中所有文件名称&#xff0c;用 os.path.join() 函数拼接出要移动到的目标地址。然后&#xff0c;使用 os.path.exists() 函数判断目标文件夹是否存在&#xff0c;不存在用 os.m…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...