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

MATLAB智能优化算法-学习笔记(3)——大规模邻域搜索算法求解旅行商问题【过程+代码】

一、问题描述

旅行商问题(TSP, Traveling Salesman Problem)是组合优化中的经典问题之一。给定一组城市和每对城市之间的距离,要求找到一条最短的路径,使旅行商从某个城市出发,访问每个城市一次并最终回到出发点。TSP问题广泛应用于物流配送、工厂调度、芯片制造等领域。

由于TSP问题的复杂性,特别是在城市数量较多时,其计算复杂度随着城市数量的增加而呈指数级增长。因此,使用精确算法求解大规模的TSP问题是不现实的,需要借助启发式算法或元启发式算法来求解近似最优解。

在本章中,使用**大规模邻域搜索(LNS, Large Neighborhood Search)**算法求解TSP问题。LNS通过破坏当前解的一部分,并使用局部搜索修复解的方式,不断优化路径,最终找到一个较优的解决方案。

二、算法简介

**大规模邻域搜索(Large Neighborhood Search, LNS)**是一种用于解决组合优化问题的元启发式算法,尤其适用于像旅行商问题(TSP)这种复杂的NP难问题。LNS的核心思想是通过在解空间中进行大规模扰动,即“破坏”部分解的结构,随后通过优化手段“修复”解,以避免陷入局部最优解,从而寻找到全局较优解。

1. LNS算法的基本流程

LNS的求解策略可以总结为以下步骤:

  1. 初始解生成:首先通过贪心算法或其他启发式算法生成一个初始解,作为搜索的起点。

  2. 破坏操作:从当前解中移除若干个城市(或元素),对解进行大规模扰动。扰动的规模可以动态调整,以确保解脱离局部最优。

  3. 修复操作:将被移除的城市按照一定的策略重新插回路径中,形成一个新的解。修复操作时通过局部搜索或插入最优位置的方式来最小化路径的总长度。

  4. 解接受准则:根据接受准则判断是否接受新的解。常用的接受准则包括模拟退火中的Metropolis准则,可以在一定概率下接受次优解,以避免陷入局部最优。

  5. 重复迭代:以上过程在设定的迭代次数或其他终止条件下重复进行,最终找到一个较优解。

2. LNS在TSP中的应用

在TSP中,LNS的破坏操作可以通过随机移除当前路径中的若干个城市来实现,而修复操作则可以通过将这些城市重新插入到路径中使路径增量最小化的方式进行优化。每次破坏和修复后的解都会与当前解比较,如果新的解更优,则更新全局最优解。

3. LNS算法的优势
  • 跳出局部最优:LNS通过大规模扰动当前解的结构,有效避免了传统局部搜索算法容易陷入局部最优的问题。
  • 可控的扰动规模:LNS可以根据问题的复杂度调整破坏的规模,灵活性较强。
  • 局部搜索与全局搜索的平衡:通过破坏-修复的方式,LNS能够平衡局部搜索和全局搜索,既能保留当前解的优点,又能通过大范围扰动扩展搜索空间。
4. 算法复杂度

LNS的时间复杂度主要取决于破坏和修复操作的复杂度。破坏操作通常是随机或基于一定策略的子集选择,因此复杂度较低。而修复操作则涉及将移除的元素重新插入原解中,这可能需要多次计算增量代价,因此复杂度与问题规模成正比。

通过LNS算法求解TSP,可以在合理的时间内得到接近最优的解,尤其适用于大规模的TSP实例。

三、求解策略

使用LNS求解TSP有以下2个难点:

(1)如何“破坏”解?

(2)如何“修复”解?

针对上述2个难点,本节将涉及LNS求解TSP的求解策略

在使用**大规模邻域搜索(LNS)求解旅行商问题(TSP)**时,主要的挑战在于如何设计有效的“破坏”和“修复”策略。针对这两个核心难点,LNS的求解策略可以分为以下几步:

1. 破坏策略

破坏策略的主要目的是对当前解进行大幅度的修改,以跳出局部最优并扩展搜索空间。破坏的本质是“移除”解的一部分,从而为后续的修复提供新的搜索空间。常见的破坏策略有以下几种:

1.1 随机移除城市
  • 操作:从当前路径中随机选择若干个城市,将这些城市从路径中移除。这种方式简单直接,能够随机地打破当前的解。
  • 优点:简单易行,能够快速破坏当前解。
  • 缺点:破坏的随机性可能导致解的质量大幅下降,尤其是在移除关键城市时。
1.2 路径段移除
  • 操作:从当前路径中选择一段连续的路径,然后将这一段的城市移除。这种方法更有针对性,可以通过控制移除路径的长度来调节破坏的幅度。
  • 优点:通过移除连续路径,可以有效地改变局部结构,有助于在局部区域内寻找更优解。
  • 缺点:如果移除的路径段不够好,可能难以跳出局部最优。
1.3 距离或相似性移除
  • 操作:基于城市之间的距离或其他相似性(如位置接近度),移除距离较远或较近的一组城市。例如,移除路径中距离最远的几个城市,或者是距离较近的一些城市,以打破现有路径的某种平衡。
  • 优点:能够有针对性地打破那些可能产生较差路径的部分,尤其是在处理较复杂的问题时,这种方法能够引导算法朝着更优的方向前进。
  • 缺点:可能在某些情况下会失去对全局的掌控,过多依赖距离或相似性。
1.4 基于时间窗的破坏
  • 操作:如果TSP带有时间窗约束,可以针对违反时间窗约束的城市进行破坏,移除这些城市并优先重新安排。
  • 优点:针对具有时间窗的TSP问题非常有效,可以通过调整时间约束来优化解。
  • 缺点:该策略在标准TSP中作用不大。

2. 修复策略

破坏之后,当前的解会失去部分城市,这时候需要通过修复策略将这些城市重新插入到路径中。修复策略的好坏直接影响算法的性能,好的修复策略可以在不大幅度增加总距离的情况下,将移除的城市插回到路径中。以下是常见的修复策略:

2.1 贪婪插入
  • 操作:每次从被移除的城市中选择一个城市,并将其插入到路径中增量最小的地方。即选择一个插入点,使得插入后路径的总距离增加最少。
  • 优点:贪婪策略相对简单,而且在很多情况下能够有效减少路径的总长度。
  • 缺点:虽然贪婪策略每次都做出局部最优决策,但可能会陷入全局次优解。
2.2 随机插入
  • 操作:将移除的城市随机插入到路径中的某个位置。这种方式增加了搜索的随机性,能够避免贪婪策略过早陷入局部最优。
  • 优点:能够有效避免陷入局部最优。
  • 缺点:纯随机策略可能会导致解的质量不佳,因此往往需要与其他策略结合使用。
2.3 基于2-opt的修复
  • 操作:在将移除的城市重新插入到路径中后,使用2-opt(或3-opt)对路径进行局部优化。2-opt是一种经典的邻域操作,它通过交换路径中的两条边来优化路径长度。
  • 优点:2-opt可以在修复后进一步优化路径结构,降低总行程。
  • 缺点:2-opt的计算复杂度较高,可能需要较多时间。
2.4 邻域插入
  • 操作:将移除的城市插入到与其最接近的城市附近,即按照地理位置的邻近关系进行修复。这种策略基于距离信息,可以确保重新插入城市后不会大幅增加总距离。
  • 优点:基于邻域的插入能够保持路径的紧凑性,减少不必要的绕行。
  • 缺点:这种方法可能无法打破原有路径的局部结构,难以跳出局部最优。
2.5 时间窗插入
  • 操作:如果问题包含时间窗约束,可以优先插入那些与时间窗约束冲突较大的城市。通过优先满足时间窗约束,可以提高解的可行性。
  • 优点:在带有时间窗的TSP问题中非常有效,可以提高解的可行性。
  • 缺点:对于没有时间窗的TSP问题,这种策略没有直接作用。

3. 求解策略总结

针对LNS求解TSP的两个难点,破坏和修复策略相辅相成。在求解过程中,破坏的目的是打破现有解的结构,增加搜索空间,避免陷入局部最优;而修复的目的是在破坏后尽可能生成一个更优的解,确保路径质量的提升。理想情况下,破坏和修复策略应当动态调整,以应对不同问题的规模和特性。

一个有效的LNS求解策略可能会包含以下步骤:

  1. 破坏策略的动态选择:根据当前解的特性(如解的质量、当前迭代次数等),动态调整破坏的力度和方式,以确保破坏后的解能够探索新的搜索空间。
  2. 修复策略的优化:修复过程可以通过多种方法结合使用,如贪婪插入与2-opt联合操作,确保解的修复不仅快速,而且能够保持较高的质量。
  3. 多样化破坏-修复策略的结合:在迭代过程中,可以交替使用不同的破坏和修复策略,以增加算法的搜索多样性,提升全局搜索的能力。

这种结合“破坏”和“修复”的求解策略,是LNS算法在解决复杂优化问题(如TSP)中的核心优势所在。

4. 构造初始解

1. 最近邻算法(Nearest Neighbor Algorithm)

最近邻算法是一种经典的启发式方法,广泛应用于TSP问题的初始解构造。其基本思想是:从某一个城市开始,选择距离最近的城市作为下一个访问的城市,直到所有城市都被访问一次。

步骤:

  1. 从某一个起始城市开始(通常是随机选择)。
  2. 每次选择与当前城市距离最近且未访问过的城市作为下一个访问的城市。
  3. 重复步骤2,直到所有城市都被访问。
  4. 最后回到起始城市,形成一个封闭的路径。

优点

  • 简单易行&

相关文章:

MATLAB智能优化算法-学习笔记(3)——大规模邻域搜索算法求解旅行商问题【过程+代码】

一、问题描述 旅行商问题(TSP, Traveling Salesman Problem)是组合优化中的经典问题之一。给定一组城市和每对城市之间的距离,要求找到一条最短的路径,使旅行商从某个城市出发,访问每个城市一次并最终回到出发点。TSP问题广泛应用于物流配送、工厂调度、芯片制造等领域。…...

货币单位换算 - 华为OD统一考试(E卷)

2024华为OD机试(E卷D卷)最新题库【超值优惠】Java/Python/C合集 题目描述 记账本上记录了若干条多国货币金额,需要转换成人民币分(fen),汇总后输出。 每行记录一条金额,金额带有货币单位,格式为数字单位&…...

95、k8s之rancher可视化

一、ranker 图形化界面 图形化界面进行k8s集群的管理 rancher自带监控----普罗米修斯 [rootmaster01 opt]# docker load -i rancher.tar ##所有节点 [rootmaster01 opt]# docker pull rancher/rancher:v2.5.7 ##主节点[rootmaster01 opt]# vim /etc/docker/daemon.jso…...

简单生活的快乐

小明经常会被问到一个问题:为什么他那么有钱却选择过一种简单、谦逊的生活。先从小明的早年经历说起吧,大概是他六到十三岁的时候,物质对他来说是非常重要的。他记得当妈妈给他买了一双昂贵的鞋子时,他特别兴奋,喜欢向…...

【JAVA开源】基于Vue和SpringBoot的在线文档管理系统

本文项目编号 T 038 ,文末自助获取源码 \color{red}{T038,文末自助获取源码} T038,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

大数据新视界 --大数据大厂之数据驱动决策:如何利用大数据提升企业竞争力

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【Linux】生产者消费者模型:基于阻塞队列,使用互斥锁和条件变量维护互斥与同步关系

目录 一、什么是生产者消费者模型 二、为什么要引入生产者消费者模型? 三、详解生产者消费者模型 ​编辑 生产者和生产者、消费者和消费者、生产者和消费者,它们之间为什么会存在互斥关系? 生产者和消费者之间为什么会存在同步关系&…...

多层感知机paddle

多层感知机——paddle部分 本文部分为paddle框架以及部分理论分析,torch框架对应代码可见多层感知机 import paddle print("paddle version:",paddle.__version__)paddle version: 2.6.1多层感知机(MLP,也称为神经网络&#xff0…...

linux-网络管理-网络服务管理 17 / 100

Linux 网络管理:网络服务管理 一、概述 在 Linux 系统中,网络服务管理是系统管理中的重要组成部分。网络服务通常涉及到多种协议、服务和工具,用于确保服务器与客户端、局域网与广域网、以及不同系统之间的通信畅通。Linux 提供了强大的工具…...

Docker上安装mysql

获取 MySQL 镜像 获取镜像。使用以下命令来拉取镜像: 1docker pull mysql:latest 这里拉取的是最新版本的 MySQL 镜像。你也可以指定特定版本,例如: 1docker pull mysql:8.0 运行 MySQL 容器 运行 MySQL 容器时,你需要指定一些…...

【秋招笔试-支持在线评测】8.28华为秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 华为专栏传送🚪 -> 🧷华为春秋招笔试 目前今年秋招的笔…...

基于python上门维修预约服务数据分析系统

目录 技术栈和环境说明解决的思路具体实现截图python语言框架介绍技术路线性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示操作可行性详细视频演示源码获取 技术栈和环境说明 结合用户的使用需求,本系统采用运用较为广…...

React基础教程(10):React Hooks

9.1 使用hooks理由 高阶组件为了复用,导致代码层级复杂。生命周期的复杂。写成函数组件,无状态组件,因为需要状态,又写成了class,成本高9.2 useState(保存组件状态) const [state, setState] = useState(initialState);案例:点击按钮修改name...

JVM 调优篇9 调优案例6- cpu使用过载解决办法【超赞】

一 cpu过载说明 1.1 背景说明 如果线程死锁,那么线程一直在占用CPU,这样就会导致CPU一直处于一个比较高的占用率。 1.2 代码 模拟一个死锁的代码 public class JstackDeadLockDemo {/*** 必须有两个可以被加锁的对象才能产生死锁,只有一个不会产生死锁问题*/private f…...

Spring8-事务

目录 JdbcTemplate 声明式事务 事务 概述 特性(ACID) 编程式事务 声明式事务 基于注解的声明式事务 Transactional注解标识的位置 事务属性:只读 事务属性:超时 事务属性:隔离级别 事务属性:传…...

在Python中,类是用于定义对象的蓝图或模板,而对象则是根据类创建的具体实例

当然,我可以为您演示类与对象的基本概念和它们之间的关系。在Python中,类是用于定义对象的蓝图或模板,而对象则是根据类创建的具体实例。 下面是一个简单的Python程序,它定义了一个Car类,该类具有一些属性和方法&…...

【小波去噪】【matlab】基于小波分析的一维信号滤波(对照组:中值滤波、均值滤波、高斯滤波)

链接1-傅里叶变换 链接2-傅立叶分析和小波分析间的关系 链接3-小波变换(wavelet transform)的通俗解释 链接4-小波基的选择 1.示例代码 function main_wavelet clc clear close all warning off %% 1.信号生成 time_length 10;%总时长,秒 …...

CentOS 7官方源停服,配置本机光盘yum源

1、挂载系统光盘 mkdir /mnt/iso mount -o loop /tools/CentOS-7-x86_64-DVD-1810.iso /mnt/iso cd /mnt/iso/Packages/ rpm -ivh /mnt/iso/Packages/yum-utils-1.1.31-50.el7.noarch.rpm(图形界面安装,默契已安装) 如安装yum-utils依赖错误&#x…...

2024年汉字小达人区级自由报名备考冲刺:2024官方模拟题练一练(续)

2024年第十一届汉字小达人的区级活动的时间9月25-30日正式开赛,满打满算还有9天时间。 今天继续回答一些问题关于汉字小达人的常见问题,再做几道2024年官方模拟题,帮助大家直观地了解汉字小达人的比赛题型和那你程度。 本专题在比赛前持续更…...

实战Redis与MySQL双写一致性的缓存模式

​Redis和MySQL都是常用的数据存储系统,它们各自有自己的优缺点。在实际应用中,我们可能需要将它们结合起来使用,比如将Redis作为缓存,MySQL作为持久化存储。 在这种情况下,我们需要保证Redis和MySQL的数据一致性&…...

股指期货期权交易规则是什么?

本文主要介绍股指期货期权交易规则是什么?股指期货期权是以股指期货合约为标的物的期权交易,其规则结合了期货与期权的特点。 股指期货期权交易规则是什么? 一、基础交易规则 交易时间 交易日9:30-11:30,13:00-15:00&#xff0…...

VmWare Ubuntu22.04 搭建DPDK 20.11.1

一、开发环境 Ubuntu 版本 二、增加虚拟机的网卡 给虚拟机增加1个网卡,加上原来的网卡,一共2个 网络适配器作为 ssh 连接的网卡,网络适配器2作为 DPDK 运行的网卡。 三、NAT模式简介 这里待补充,网上都是那一张图,看不懂 四、使网卡名称从0开始命名 进入管理员权限 s…...

SpringAI(GA):Nacos2下的分布式MCP

原文链接地址:SpringAI(GA):Nacos2下的分布式MCP 教程说明 说明:本教程将采用2025年5月20日正式的GA版,给出如下内容 核心功能模块的快速上手教程核心功能模块的源码级解读Spring ai alibaba增强的快速上手教程 源码级解读 版…...

MobaXterm配置跳转登录堡垒机

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 背景操作步骤 背景 主要是为了能通过MobaXterm登录堡垒机,其中需要另外一台服务器进行跳转登录 操作步骤 MobaXterm登录堡垒机的操作,需…...

【envoy】-1.安装与下载源码

1.安装 建议使用ubuntu2004,对glibc有要求。上个ti子更快。 wget -O- https://apt.envoyproxy.io/signing.key | sudo gpg --dearmor -o /etc/apt/keyrings/envoy-keyring.gpg $ echo "deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/envo…...

.Net Framework 4/C# 属性和方法

一、属性的概述 属性是对实体特征的抽象,用于提供对类或对象的访问,C# 中的属性具有访问器,这些访问器指定在它们的值被读取或写入时需要执行的语句,因此属性提供了一种机制,用于把读取和写入对象的某些特征与一些操作…...

springboot的test模块使用Autowired注入失败

springboot的test模块使用Autowired注入失败的原因: 注入失败的原因可能是用了junit4的包的Test注解 import org.junit.Test;解决方法:再加上RunWith(SpringRunner.class)注解即可 或者把Test由junit4改成junit5的注解,就不用加上RunWith&…...

Vue3学习(4)- computed的使用

1. 简述与使用 作用:computed 用于基于响应式数据派生出新值,其值会自动缓存并在依赖变化时更新。 ​缓存机制​:依赖未变化时直接返回缓存值,避免重复计算(通过 _dirty 标志位实现)。​响应式更新​&…...

股指期货波动一个点多少钱?

很多朋友在交易股指期货时,都会好奇一个问题:股指期货波动一个点,我的账户里到底是赚了还是亏了多少钱?要搞清楚这个问题,其实很简单,只需要了解两个关键信息:股指期货的“交易单位”&#xff0…...

【JVM】三色标记法原理

在JVM中,三色标记法是GC过程中对象状态的判断依据,回收前给对象设置上不同的三种颜色,三色分为白色、灰色、黑色。根据颜色的不同,决定对象是否要被回收。 白色表示: 初始状态:所有对象未被 GC 访问。含义…...