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

news2024/11/15 10:32:57

一、问题描述

旅行商问题(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. 最后回到起始城市,形成一个封闭的路径。

优点

  • 简单易行&

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153719.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RK3588/RK3588s运行yolov8达到27ms

前言 Hello,小伙伴们~~我最近做了一个比较有意思的东西,想起来也好久没有写博客了,就记录一下吧。希望和大家一起学习,一起进步! 我简单介绍一下我最近做的这个东西的经过哈~上个月在B站上看到了一个博主发了一条视频关…

DataGrip远程连接Hive

学会用datagrip远程操作hive 连接前提条件: 注意:mysql是否是开启状态 启动hadoop集群 start-all.sh 1、启动hiveserver2服务 nohup hiveserver2 >> /usr/local/soft/hive-3.1.3/hiveserver2.log 2>&1 & 2、beeline连接 beelin…

上海市高等学校信息技术水平考试 C程序设计(2021A场)全解

2e-1 为 1.0^(-1)*2 在顺序查找法中,如果要从n个学生中找到某个特定的学生信息,最坏的情况是这个学生是最后一个被比较的,这时需要比较n次。但是,如果学生是均匀分布的,那么平均来说,你会在列表的中间找到这…

stm32单片机个人学习笔记5(OLED调试工具)

前言 本篇文章属于stm32单片机(以下简称单片机)的学习笔记,来源于B站教学视频。下面是这位up主的视频链接。本文为个人学习笔记,只能做参考,细节方面建议观看视频,肯定受益匪浅。 STM32入门教程-2023版 细…

校园场景物体检测系统源码分享

校园场景物体检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer…

【RabbitMQ】⾼级特性

RabbitMQ ⾼级特性 1. 消息确认1.1 消息确认机制1.2 代码示例 2. 持久化2.1 交换机持久化2.2 队列持久化2.3 消息持久化 3. 发送⽅确认3.1 confirm确认模式3.2 return退回模式3.3 问题: 如何保证RabbitMQ消息的可靠传输? 4. 重试机制5. TTL5.1 设置消息的TTL5.2 设置队列的TTL…

华为HarmonyOS地图服务 10 - 如何在地图上绘制圆?

场景介绍 本章节将向您介绍如何在地图上绘制圆形。 接口说明 添加圆形功能主要由MapCircleOptions、addCircle和MapCircle提供,更多接口及使用方法请参见

gbase8s数据库常见的索引扫描方式

1 顺序扫描(Sequential scan):数据库服务器按照物理顺序读取表中的所有记录。 常发生在表上无索引或者数据量很少或者一些无法使用索引的sql语句中 2 索引扫描(Index scan):数据库服务器读取索引页&#…

Leetcode—1184. 公交站间的距离【简单】

2024每日刷题&#xff08;161&#xff09; Leetcode—1184. 公交站间的距离 实现代码 class Solution { public:int distanceBetweenBusStops(vector<int>& distance, int start, int destination) {int clockwise 0;int counterclockwise 0;if(start > desti…

CompletableFuture的allOf一定不要乱用!血泪史复盘

文章目录 1. 到底遇到了什么问题&#xff1f;2. CountDownLatch搞起&#xff1f;3. allOf里面的坑4. 优化建议&#xff1a; 1. 到底遇到了什么问题&#xff1f; 最近看到组里面的同学遇到了这样的业务场景&#xff1a; 主线程需要异步并发调用多个接口&#xff0c;并且主线程…

大模型终极指南:零基础到精通,一文搞定!

随着 ChatGPT 的到来&#xff0c;大模型[1]&#xff08;Large Language Model&#xff0c;简称 LLM&#xff09;成了新时代的 buzzword&#xff0c;各种 GPT 产品百花齐放。 大多数人直接用现有产品就可以了&#xff0c;但对于喜欢刨根问底的程序员来说&#xff0c;能够在本地…

python-SZ斐波那契数列/更相减损数

一&#xff1a;SZ斐波那契数列题目描述 你应该很熟悉斐波那契数列&#xff0c;不是吗&#xff1f;现在小理不知在哪里搞了个山寨版斐波拉契数列&#xff0c;如下公式&#xff1a; F(n) { $\ \ \ \ \ \ \ \ \ \ \ \ $ a,( n1) $\ \ \ \ \ \ \ \ \ \ \ \ $ b,( n2) $\ \ \ \ \ \ …

回归预测 | Matlab实现ReliefF-XGBoost多变量回归预测

回归预测 | Matlab实现ReliefF-XGBoost多变量回归预测 目录 回归预测 | Matlab实现ReliefF-XGBoost多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.ReliefF-xgboost回归预测代码&#xff0c;对序列数据预测性能相对较高。首先通过ReleifF对输入特征计算权…

Spring中的Web Service消费者集成(应该被淘汰的技术)

问题 最近需要对接一个老系统的web service接口&#xff0c;我已经有7&#xff0c;8年没有遇到过这种接口了。 思路 先用Spring空项目中的jaxws-maven-plugin插件生成一波web service客户端&#xff0c;然后&#xff0c;集成到现有的SpringBoot3项目中使用就可以了。 生成w…

人才有约,职为你:颐年集团携手粤荣学校共绘养老行业的美好未来

摘要&#xff1a;广州市白云区粤荣职业培训学校成功举办“人才有约&#xff0c;职为你”颐年集团养老机构线下招聘会 2024年9月19日下午2点30分&#xff0c;广州市白云区金骊城二楼热闹非凡。粤荣职业培训学校携手颐年集团&#xff0c;共同举办了主题为“人才有约&#xff0c;…

做短剧申请微信小程序备案整体的操作流程!

做国内短剧对接微信小程序&#xff0c;小程序备案是必不可少的&#xff0c;需要准备哪些资料&#xff0c;以及需要注意的事项&#xff0c;所需材料全部整理出来了&#xff0c;小程序从注册到类目和备案分为五个步骤来讲解&#xff0c;下面就由我来向大家介绍所有的操作流程。 …

【RabbitMQ】消息分发、事务

消息分发 概念 RabbitMQ队列拥有多个消费者时&#xff0c;队列会把收到的消息分派给不同的消费者。每条消息只会发送给订阅该队列订阅列表里的一个消费者。这种方式非常适合扩展&#xff0c;如果现在负载加重&#xff0c;那么只需要创建更多的消费者来消费处理消息即可。 默…

docker desktop windows stop

服务docker改为启动 cmd下查看docker版本 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},"experimental": false,"registry-mirrors": ["https://hub.atomgit.com/"]…

详解c++:new和delete

文章目录 前言一、new和mallocnew的用法&#xff08;爽点&#xff09;自动构造 delete和freedelete的用法&#xff08;爽点&#xff09; 提醒 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 在C中&#xff0c;new 和 delete 是两个非常重要的操作符&am…

Python面相对象案例熟悉对MySQL的操作(案例一、学生管理系统,案例二、模拟注册与用户登录)有源码

Python面相对象案例熟悉对MySQL的操作 案例一&#xff0c;学生管理系统 对数据表的要求&#xff1a; 在mysql中创建数据库gamedb,创建用户表userinfo,字段如下&#xff1a; 用户编号uid(int,主键&#xff0c;自动增长) 用户姓名uname(varchar(20),非空) 用户昵称nickname(…