模拟退火算法(SA算法)求解实例---旅行商问题 (TSP)
目录
- 一、采用SA求解 TSP
- 二、 旅行商问题
- 2.1 实际例子:求解 6 个城市的 TSP
- 2.2 ==**求解该问题的代码**==
- 2.3 代码运行过程截屏
- 2.4 代码运行结果截屏(后续和其他算法进行对比)
- 三、 ==如何修改代码?==
- 3.1 减少城市坐标,如下:
- 3.2 增加城市坐标,如下:
- 四、 模拟退火算法 (Simulated Annealing, SA) 原理
- 4.1 模拟退火算法定义
- 4.2 SA算法的基本思想
- 4.3 SA算法的工作原理
- 4.4 SA算法的参数
- 4.5 SA算法的优缺点
- 4.5.1 优点
- 4.5.2 缺点
- 4.6 SA算法的应用场景
- 4.7 SA算法求解TSP步骤
一、采用SA求解 TSP
求解代码在文中,后续会出其他算法求解TSP问题,你们参加数学建模竞赛只需要会改代码即可。
用来对比此专栏的
遗传算法(GA算法)求解实例—旅行商问题 (TSP)
粒子群算法(PSO算法)求解实例—旅行商问题 (TSP)
注意每次运行SA算法得到的结果可能不太一样。
我知道大家对原理性的东西不感兴趣,我把原理性的东西放在后面,大家如果需要写数模论文可以拿去,但是记得需要改一改,要不然查重过不去。
二、 旅行商问题
2.1 实际例子:求解 6 个城市的 TSP
假设有 6 个城市,其坐标如下:
| 城市 | X 坐标 | Y 坐标 |
|---|---|---|
| 0 | 10 | 20 |
| 1 | 30 | 40 |
| 2 | 20 | 10 |
| 3 | 40 | 30 |
| 4 | 10 | 10 |
| 5 | 50 | 20 |
目标是找到一个经过所有城市且总距离最短的路径。
2.2 求解该问题的代码
import numpy as np
import random
import math# 定义城市坐标
cities = np.array([[10, 20],[30, 40],[20, 10],[40, 30],[10, 10],[50, 20]
])# 计算两城市之间的欧几里得距离
def calculate_distance(city1, city2):return np.sqrt(np.sum((city1 - city2) ** 2))# 计算总旅行距离
def total_distance(path):distance = 0for i in range(len(path) - 1):distance += calculate_distance(cities[path[i]], cities[path[i + 1]])distance += calculate_distance(cities[path[-1]], cities[path[0]]) # 回到起点return distance# 模拟退火算法主函数
def simulated_annealing(cities, initial_temp=1000, cooling_rate=0.995, max_iter=1000):num_cities = len(cities)# 初始化解和温度current_path = list(np.random.permutation(num_cities))current_distance = total_distance(current_path)best_path = current_path.copy()best_distance = current_distancetemperature = initial_tempfor iteration in range(max_iter):# 生成新解:随机交换路径中的两个城市new_path = current_path.copy()i, j = np.random.choice(num_cities, 2, replace=False)new_path[i], new_path[j] = new_path[j], new_path[i]# 计算新解的距离new_distance = total_distance(new_path)# 接受新解的条件if new_distance < current_distance or random.random() < math.exp((current_distance - new_distance) / temperature):current_path = new_pathcurrent_distance = new_distance# 更新最佳解if current_distance < best_distance:best_path = current_pathbest_distance = current_distance# 降温temperature *= cooling_rate# 输出当前迭代的信息print(f"Iteration {iteration}: Best distance = {best_distance:.2f}, Temperature = {temperature:.2f}")# 如果温度低到一定程度,停止搜索if temperature < 1e-8:breakreturn best_path, best_distance# 运行模拟退火算法
best_path, best_distance = simulated_annealing(cities)
print("Best path:", best_path)
print("Best distance:", best_distance)
2.3 代码运行过程截屏

2.4 代码运行结果截屏(后续和其他算法进行对比)

三、 如何修改代码?
这一部分是重中之重,大家参加数学建模肯定是想跑出自己的结果,所以大家只需要把自己遇到的数学问题,抽象成TSP问题,然后修改代码的城市坐标,然后运行即可。
# 定义城市坐标
cities = np.array([[10, 20],[30, 40],[20, 10],[40, 30],[10, 10],[50, 20]
])
3.1 减少城市坐标,如下:
# 定义城市坐标
cities = np.array([[10, 20],[30, 40],[20, 10],[40, 30]
])
3.2 增加城市坐标,如下:
# 定义城市坐标
cities = np.array([[10, 20],[30, 40],[20, 10],[40, 30],[30, 40],[20, 10],[10, 10],[50, 20]
])
四、 模拟退火算法 (Simulated Annealing, SA) 原理
4.1 模拟退火算法定义
模拟退火算法 (Simulated Annealing, SA) 是一种基于概率的随机搜索优化算法,由 S. Kirkpatrick 等人在 1983 年提出。模拟退火算法借鉴了固体退火过程的物理原理,通过在解空间中随机搜索和逐步降低“温度”,找到全局最优解或近似最优解。该算法常用于求解组合优化问题,如旅行商问题 (TSP)、生产调度、资源分配等。
4.2 SA算法的基本思想
模拟退火算法的核心思想是模拟物理退火过程中固体的冷却过程。在退火过程中,固体被加热到一个足够高的温度,然后逐渐冷却,使得固体内部的原子能量状态逐渐达到最小值(即晶格结构最稳定)。在优化问题中,这一过程对应于在解空间中随机搜索,并通过概率准则接受劣解,以避免陷入局部最优解。
4.3 SA算法的工作原理
-
初始化:
- 随机生成一个初始解,并设定初始温度
T和降温速率α(通常为小于 1 的常数)。 - 计算初始解的目标函数值(或称“能量”)。
- 随机生成一个初始解,并设定初始温度
-
迭代过程:
- 在当前解的邻域内随机生成一个新解。
- 计算新解的目标函数值。如果新解更优,则接受该解作为当前解。
- 如果新解不优,以一定概率接受该解:
[
P = \exp\left(-\frac{\Delta E}{T}\right)
]
其中,ΔE是新解和当前解的目标函数值之差,T是当前温度。 - 根据冷却速率
α更新温度:
[
T \leftarrow \alpha \cdot T
]
-
终止条件:
- 当达到最大迭代次数或温度低于某一阈值时,停止搜索,输出当前最优解。
4.4 SA算法的参数
- 初始温度 (
T):初始的高温状态,控制初期的搜索范围和探索能力。温度越高,算法越容易接受劣解,从而有更好的全局探索能力。 - 降温速率 (
α):控制温度的降低速度,通常设为接近 1 的数值(如 0.99)。降温速率过快可能导致过早收敛到局部最优解。 - 迭代次数:算法运行的最大迭代次数。迭代次数越多,算法有更大的机会找到全局最优解。
4.5 SA算法的优缺点
4.5.1 优点
- 跳出局部最优:通过接受劣解的概率机制,SA 算法能够有效跳出局部最优解,逼近全局最优解。
- 简单易实现:算法结构简单,易于实现和应用于多种优化问题。
- 适应性强:SA 算法可以处理非线性、非连续和多峰值的复杂优化问题。
4.5.2 缺点
- 收敛速度较慢:SA 算法在初期的高温阶段具有较强的探索能力,但温度降低后搜索步长缩小,收敛速度较慢。
- 参数敏感:算法性能对初始温度、降温速率等参数较为敏感,需要根据问题特点进行调节。
- 计算开销大:在温度较高和迭代次数较多的情况下,计算开销较大。
4.6 SA算法的应用场景
- 组合优化问题:如旅行商问题 (TSP)、背包问题、图着色问题等。
- 工程设计优化:如集成电路布局优化、结构设计优化等。
- 机器学习:如神经网络训练、特征选择、参数优化等。
- 生产调度与资源分配:如车间调度、任务分配、物流配送等。
4.7 SA算法求解TSP步骤
- 初始化:随机生成一个初始路径,并计算路径的总旅行距离。
- 迭代过程:在当前路径的邻域内(如交换两个城市的位置)随机生成一个新路径,计算新路径的总旅行距离。
- 如果新路径更短,则接受该路径作为当前解。
- 如果新路径更长,以一定概率接受该解,以避免陷入局部最优。
- 降温:逐步降低温度,减少接受劣解的概率。
- 终止条件:当达到最大迭代次数或温度低到一定程度时,停止搜索,输出当前最优路径。
相关文章:
模拟退火算法(SA算法)求解实例---旅行商问题 (TSP)
目录 一、采用SA求解 TSP二、 旅行商问题2.1 实际例子:求解 6 个城市的 TSP2.2 **求解该问题的代码**2.3 代码运行过程截屏2.4 代码运行结果截屏(后续和其他算法进行对比) 三、 如何修改代码?3.1 减少城市坐标,如下&am…...
衡石分析平台使用手册--替换衡石 metadb
替换衡石 metadb 在使用 HENGSHI SENSE 服务过程中,可以根据业务需要替换 HENGSHI 自带的 metadb。本文讲述使用云服务 PostgreSQL 替代衡石 metadb 的过程。 准备工作 在进行配置前,请在云服务 PostgreSQL 上完成如下准备工作。 [必须] 配置衡石…...
【Unity学习心得】如何制作俯视角射击游戏
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、导入素材二、制作流程 1.制作地图2.实现人物动画和移动脚本3.制作单例模式和对象池4.制作手枪pistol和子弹bullet和子弹壳bulletShell5.制作散弹枪shotgun总…...
【资料分析】常见的坑
in 比较或计数类问题 差别大的基期比较,可以直接用现期进行比较 注意单位可能不同! 注意顺序是从小到大还是从大到小 以及老问题,名字本身就叫XX增量,XX增加值,而非还要另外去算的东东 给出的图表可能是不完整的 2…...
GitLab权限及设置
之前很少关注这些,项目的权限,一般由专门的管理人员设置。 但自己创建的项目自己可以设置权限。下面是一些笔记。 GitLab中用户权限_gitlab 权限-CSDN博客 开发中遇到要将自己这块的代码上传到Git,由其他组的同事拉取后继续开发。上传代码后…...
算法练习题24——查找杨辉三角中的组合数
题目描述 杨辉三角中的每个元素是一个组合数。第 ( i ) 行的第 ( j ) 个元素表示组合数 ( C(i, j) ) ,即从 ( i ) 个元素中选 ( j ) 个元素的组合方式。已知一个正整数 ( N ),要求在杨辉三角中找到这个数,并输出它在杨辉三角中的具体位置。位…...
string类的模拟实现
实现string的模拟实现分为三个文件,分别为:string.h、sting.cpp、test.cpp string.h 其中包含一些短小常用的函数的实现,头文件,函数的声明 #include<iostream> #include<string> #include<assert.h>using n…...
如何训练机器学习力场
机器学习力场(MLFF)的训练主要依赖于通过量子力学计算生成的高质量训练数据集,并利用不同的机器学习算法来拟合分子系统中的势能面(Potential Energy Surface, PES)和原子间作用力。这种训练过程包括数据准备、特征提取…...
AI创作新手册:精通Prompt提示词的提问策略
文章目录 🍊AI创作核心:提示词 Prompt 的重要性1. 什么是提示词工程?1.1 提示词的作用原理1.2 提示词工程师的薪资与行业前景1.3 提示词工程的适用性 2. 提示词的编写技巧3. 常见的提示词框架3.1 CO-STAR 框架3.2 BORKE 框架 4. 提示词的实际…...
gingivitis
gingivitis 牙龈炎 1)这个是啥不知道 2)七叶莲片 3)甲硝唑芬布芬胶囊 4)盐酸左氧氟沙星胶囊 5)纳珍 开始学习记录医生开的药。日常备药记录一下。【不要乱吃药哈】...
开源 AI 智能名片小程序:开启内容营销新境界
摘要:本文深入探讨了在当今数字化时代,内容营销的重要性以及如何实现让用户主动找你的最佳效果。通过引入开源 AI 智能名片小程序这一创新工具,阐述了其在明确目标用户群体、迎合用户需求痛点和打造风格特色方面的独特优势,为企业…...
p12docker 进入容器的命令和拷贝的命令
进入当前正在运行的容器 第一种方式是执行docker exec -it 8d57ffda7a29 /bin/bash这个时候可以根据docker容器的id进入到指定id的容器当中***(这个是比较常用的)*** 老师的笔记 第二种方式是docker attach 8d57ffda7a29 这里还是直接引用老师的笔记吧 从容器内部拷贝文…...
代码随想录Day 45|leetcode题目:115.不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
提示:DDU,供自己复习使用。欢迎大家前来讨论~ 文章目录 题目题目一: 115.不同的子序列解题思路:1. 确定dp数组(dp table)以及下标的含义2. 确定递推公式3. dp数组如何初始化4. 确定遍历顺序5. 举例推导dp数…...
浮点数在内存中的存储详解(超详细)
目录 1. 浮点数存储规则 2. IEEE754规定: 3. 关于M的说明: 4. 关于E的说明: 5. 关于S的说明: 6.浮点数从内存中取出(三种情况) 情况1:E不全为0或不全为1 情况2:E全为0 情况3&a…...
Maven下载安装
下载 下载地址:Maven – Download Apache Maven 选择合适的版本进行下载 windows&Linux安装 1, 解压apache-maven-3.6.1.rar即安装完成 2, 配置环境变量MAVEN_HOME为安装路径,并将MAVEN_HOME的bin目录配置到PATH下 3,…...
Qt:Q_GLOBAL_STATIC实现单例(附带单例使用和内存管理)
前言 本文主要写Q_GLOBAL_STATIC实现单例以及单例的释放,网上很多教程只有单例的创建,但是并没有告诉我们单例的内存管理,这就很头疼。 正文 使用 Qt 的 Q_GLOBAL_STATIC // Singleton.h #ifndef SINGLETON_H #define SINGLETON_H#includ…...
URL.createObjectURL 与 FileReader:Web 文件处理两大法宝的对比
URL.createObjectURL 与 FileReader:Web 文件处理两大法宝的对比 在Web开发中,处理用户上传的文件是一项常见且重要的任务。URL.createObjectURL和FileReader是两种常用于此目的的Web API,它们各有特点,适用于不同的场景。本文将…...
零基础考过软考信息系统项目管理师经验分享
选择适合的课程:如果你是零基础,建议找一些专门针对新手的课程,讲解通俗易懂。 刷题至关重要:软考的题库很庞大,多做题是必须的。 做好笔记和复习:上课时要做好笔记,课后及时复习,…...
机器学习课程学习周报十二
机器学习课程学习周报十二 文章目录 机器学习课程学习周报十二摘要Abstract一、机器学习部分1.1 fGAN: General Framework of GAN1.2 CycleGAN1.3 Auto-Encoder1.4 概率论复习(一) 总结 摘要 本周的学习内容涵盖了fGAN框架、CycleGAN、自编码器以及概率…...
python多线程程序设计 之二
python多线程程序设计 之二 线程同步机制lock对象acquirereleaselocked RLock对象条件变量条件变量应用实列实列代码 线程同步机制 lock对象 原语锁是一种同步原语,锁定时不属于特定线程。在Python中,它是目前可用的最低级别的同步原语,由_…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
