当前位置: 首页 > 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的数据一致性&…...

作业本耐用度差距巨大?深圳大明印刷厂拆解合规工艺,告别定制作业本掉页开裂通病

在校园日常教学中,很多学校都会遇到同一个难题:同一学期采购的作业本、定制作业本,品质差距悬殊,有的完好无损用到期末,有的短短几周就出现书脊开裂、页面脱落、边角破损、翻页卡顿等问题。不少人误以为是学生使用习惯…...

为什么视频代剪辑会影响你的内容传播效果

为什么你精心拍的视频,发出去却没人看? 你有没有过这样的经历:花了一整天拍Vlog,素材画质高清、内容真实,可一剪出来就显得平淡无奇,点赞寥寥?或者婚礼当天感动全场,回看成片却像流水…...

Unity主题系统设计:状态驱动的主题抽象与自动注入方案

1. 这不是换个颜色那么简单:为什么Unity项目里“换肤”总在发布前夜崩盘?你有没有经历过这样的场景:美术同学凌晨两点发来一套新主题资源包,UI设计师说“这次配色更符合品牌调性”,产品说“上线前必须支持深色模式”&a…...

3分钟掌握HashCalculator:你的文件完整性守护专家

3分钟掌握HashCalculator:你的文件完整性守护专家 【免费下载链接】HashCalculator 哈希值计算工具,批量计算/批量校验/查找重复文件/改变哈希值等,支持集成到系统右键菜单 项目地址: https://gitcode.com/gh_mirrors/ha/HashCalculator …...

自制极低频电流探头:负电阻补偿原理与低频方波测量实践

1. 项目概述:为极低频电流测量而生在电子测试领域,电流探头是个再常见不过的工具,无论是排查开关电源的纹波,还是分析电机驱动的波形,都离不开它。但如果你尝试用市面上常见的电流探头去观察一个频率低至几赫兹&#x…...

如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型

如何快速上手DeepPurpose?5分钟完成你的第一个药物-靶点相互作用预测模型 【免费下载链接】DeepPurpose A Deep Learning Toolkit for DTI, Drug Property, PPI, DDI, Protein Function Prediction (Bioinformatics) 项目地址: https://gitcode.com/gh_mirrors/de…...

【python】ImportError: DLL load failed while importing QtWidgets: 找不到指定的程序。重新安装后搞定

文章目录前言一、PyQt6引用后报错二、使用步骤总结前言 想做个好看的界面,引用了PyQt6,却产生了新问题。 pip install pyqt6-tools,优先做这个动作进行修复。 一、PyQt6引用后报错 python里引用: from PyQt6.QtWidgets import…...

LeagueAkari:英雄联盟终极自动化助手革命性指南

LeagueAkari:英雄联盟终极自动化助手革命性指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否在英雄联盟游戏中反复经历这…...

ArduPilot飞行模式实战:从代码角度看Stabilize、Acro、Loiter模式如何切换(附避坑指南)

ArduPilot飞行模式深度解析:从状态机到实战避坑指南 在开源飞控领域,ArduPilot以其强大的飞行模式系统著称。不同于普通用户只需了解模式功能,开发者更需要掌握模式切换的底层机制——这直接关系到飞行安全与二次开发效率。本文将带您深入Sta…...

收藏干货|2026年程序员转型大模型指南,8个高薪岗位小白也能入局

分享一则身边真实职场经历,想必能戳中当下不少陷入职业迷茫的开发从业者。 同窗老友深耕Java后端开发整整六年,常年扎根业务开发模块,算得上行业内经验老道的技术老手。可从去年年初开始,他的职业焦虑感愈发强烈。传统业务开发同质…...