基于混合ABC和A*算法复现

基于混合ABC和A*算法复现

    • 一、背景介绍
    • 二、算法原理
      • (一)A*算法原理
      • (二)人工蜂群算法原理
      • (三)混合ABC和A*算法策略
    • 三、代码实现
      • (一)数据准备
      • (二)关键函数实现
      • (三)主程序
    • 四、实验结果
      • (一)实验设置
      • (二)结果展示
  • 部署方式
  • 资源获取

本文所涉及所有资源均在传知代码平台可获取

一、背景介绍

旅行商问题(Traveling Salesman Problem,TSP)作为组合优化领域中的经典NP完全问题,在物流配送、电路布线、旅游规划等诸多领域具有广泛应用。其核心在于为旅行商规划一条遍历所有城市且不重复、最终回到起点的最短路径,然而随着城市数量的增加,问题的复杂程度呈指数级增长,传统算法在求解大规模TSP问题时面临着效率和精度的双重挑战。

人工蜂群算法(Artificial Bee Colony Algorithm,ABC)是一种基于群智能优化的算法,它模拟蜜蜂群体的觅食行为,将优化求解过程转化为仿生行为,具有一定的全局搜索能力,易于求得可行解。但该算法存在种群数量需求大、收敛速度较慢以及容易陷入局部最优解等缺点。A*算法是一种启发式搜索算法,在路径规划领域表现出色,能够高效地寻找最优路径,其通过评估函数(f(n)=g(n)+h(n))(其中(g(n))为从起始节点到当前节点的实际代价,(h(n))为从当前节点到目标节点的估计代价)来选择下一个扩展节点,在合适条件下能快速提供较优解,但应用于TSP问题时,单独使用可能无法有效处理大规模搜索空间。

本复现旨在深入理解和验证基于混合ABC和A算法在解决TSP问题上的有效性,通过将两种算法有机结合,充分发挥ABC算法的全局搜索能力和A算法的高效局部搜索能力,提高算法的收敛速度和求解精度,为TSP问题的求解提供更高效、更稳定的解决方案。
原文链接

二、算法原理

(一)A*算法原理

  1. 核心思想
    • A*算法在搜索过程中,始终维护两个列表:开放列表(open list)和关闭列表(closed list)。开放列表用于存放待扩展的节点,关闭列表用于存放已扩展的节点。每次从开放列表中选择(f(n))值最小的节点进行扩展,计算其相邻节点的(g(n))、(h(n))和(f(n))值,并根据情况更新开放列表和关闭列表。在TSP问题中,以城市为节点,城市间距离为边权,通过不断扩展节点,寻找从起始城市到其他城市再回到起始城市的最短路径。
  2. 搜索过程
    • 首先将起始城市加入开放列表,计算其(f(n))值(初始时(g(n)=0),(h(n))根据启发式函数计算,如欧几里得距离)。然后循环执行以下步骤:从开放列表中取出(f(n))值最小的节点,如果该节点为目标城市(即回到起始城市且遍历了所有其他城市),则搜索结束,根据记录的路径信息重建路径;否则,将该节点加入关闭列表,扩展其相邻节点,计算相邻节点的(g(n))、(h(n))和(f(n))值,若相邻节点不在开放列表或新的(f(n))值更小,则更新开放列表中的相应信息。重复上述过程,直到开放列表为空,表示未找到可行解。

(二)人工蜂群算法原理

  1. 蜜蜂角色与行为模拟
    • 雇佣蜂:作为蜜源的发现者,在解空间(城市排列组合空间)中随机搜索初始解(路径),并记录蜜源信息(路径长度等)。然后通过特定的搜索方式(如邻域搜索)在当前蜜源附近寻找新的蜜源(改进路径),并根据新蜜源的质量(路径长度更短)决定是否更新蜜源信息。
    • 观察蜂:根据雇佣蜂提供的蜜源信息(路径长度等),以一定概率选择较好的蜜源进行进一步搜索。观察蜂通过评估蜜源的适应度(与路径长度相关)来选择蜜源,适应度越高(路径越短)被选择的概率越大,从而引导搜索向更优解方向进行。
    • 侦察蜂:当雇佣蜂在一定次数内无法找到更好的蜜源时,侦察蜂随机搜索新的蜜源,以避免算法陷入局部最优解。侦察蜂的存在增加了算法的探索能力,有助于跳出局部最优,发现更广阔的搜索空间。
  2. 参数更新机制
    • 跟随因子更新:简化计算过程,直接取上一代蜜蜂走过的最短路径作为跟随路径,其计算涉及不同模型(如Bes模型、Bqs模型和Bds模型),根据模型不同,跟随因子的计算方式有所差异,主要与蜜蜂走过的距离或城市间距离等因素相关。
    • 转移因子动态更新:侦察蜂根据跟随蜂建立的路径模型,动态确定候选城市的转移因子,其更新规则根据不同情况(如候选城市是否在雇佣蜂搜索路径中)而有所不同,通过转移因子确定城市间转移的优先级,影响蜜蜂选择下一个访问城市的概率。
    • 采蜜蜂状态转移:蜂群总数由侦察蜂总数和跟随蜂总数组成,其比例关系影响算法的收敛性。跟随蜂和侦察蜂根据转移因子概率选择后续路线,确保大部分采蜜蜂根据上一代信息选择转移路线,同时侦察蜂保持一定随机性,以平衡算法的开发和探索能力。

(三)混合ABC和A*算法策略

  1. 结合方式与优势
    • 混合算法先利用人工蜂群算法进行全局搜索,通过蜜蜂群体的协作初步找到一个较优的初始路径。然后以该初始路径的起始城市为起点和终点,运用A算法进行局部优化。A算法在局部搜索中,能够快速找到从当前城市到下一个城市的最优路径,避免了ABC算法在局部搜索时可能出现的盲目性和低效率。这种结合方式充分发挥了ABC算法的全局探索能力和A*算法的局部最优搜索能力,有效提高了算法的收敛速度和求解精度。
  2. 具体实现步骤
    • 首先使用ABC算法进行城市点之间的初始规划,包括种群初始化、雇佣蜂搜索蜜源、跟随蜂根据转移因子选择路径、侦察蜂随机搜索新蜜源等操作,经过一定迭代次数后得到初始路径点。然后,针对初始路径点,每相邻路径点之间使用A算法进行优化,计算相邻点之间的实际代价(g(n))(如城市间距离)和估计代价(h(n))(如对角线距离),根据A算法的搜索策略选择最优路径,最终得到全局较优的旅行商路径。

三、代码实现

(一)数据准备

  1. 城市坐标生成
    • create_cities函数用于生成(n)个城市的随机坐标,坐标范围在(0)到(100)之间,模拟TSP问题中的城市分布情况。通过随机生成城市坐标,为后续路径计算和算法验证提供了多样化的测试数据。

(二)关键函数实现

  1. 路径长度计算函数
    • calculate_distance函数计算给定路径的长度,通过计算路径中相邻城市间的欧几里得距离之和(考虑循环路径,最后一个城市与第一个城市相连),使用numpylinalg.norm函数计算向量的范数来获取距离。该函数准确地量化了路径的优劣,为算法中的路径选择和优化提供了评估标准。
  2. A*算法函数
    • a_star函数实现A算法的核心逻辑,通过维护开放列表和关闭列表,根据代价函数(f(n))选择下一个扩展节点,计算节点到起点的实际代价(g(n))和到终点的估计代价(h(n)),不断搜索直到找到目标节点或开放列表为空,返回从起点到各个节点的路径和代价信息。其内部实现了节点的扩展、列表的更新以及路径的记录,是A算法在TSP问题中的关键实现部分。
  3. 路径重建函数
    • reconstruct_path函数根据A算法返回的路径信息(came_from字典),从目标节点开始回溯,构建出完整的路径,将路径反转后返回。该函数将A算法搜索得到的路径信息转化为旅行商实际可行的遍历路径,是获取最终结果的重要步骤。
  4. 人工蜂群算法函数
    • abc_algorithm函数实现了人工蜂群算法的主要流程,包括种群初始化、适应度计算、雇佣蜂搜索、跟随蜂选择和侦察蜂操作等。通过随机生成种群,计算路径长度作为适应度,雇佣蜂通过交换路径中的城市进行邻域搜索,跟随蜂根据适应度选择蜜源,侦察蜂在必要时随机搜索新蜜源,经过多次迭代找到较优路径,返回最佳路径和适应度。
  5. 混合ABC和A*算法函数
    • aabc_algorithm函数是混合算法的核心,先调用abc_algorithm获取初始路径,然后以初始路径的起始城市为起点和终点,使用a_star算法进行路径优化,通过重建路径和计算路径长度,最终返回优化后的路径和长度。该函数整合了ABC和A*算法,实现了两种算法的优势互补,是求解TSP问题的关键步骤。

(三)主程序

  1. 参数设置与算法调用
    • 在主程序中,首先设置城市数量(如(n = 20))、蜜蜂数量(如(n_bees = 10))和最大迭代次数(如(max_iter = 100))等参数,然后调用create_cities函数生成城市坐标,接着调用aabc_algorithm函数执行混合算法,获取优化后的路径和距离。
  2. 结果输出与可视化
    • 输出优化后的路径(Route)和距离(Distance),展示算法的求解结果。同时,使用matplotlib库绘制城市坐标点和优化后的路径,将城市显示为散点,路径显示为红线,直观地展示了旅行商的最优遍历路径,帮助用户更好地理解算法的效果。

四、实验结果

(一)实验设置

  1. 参数调整
    • aabc_algorithm函数中,可调整参数包括蜜蜂数量n_bees、最大迭代次数max_iter等。增加蜜蜂数量可能会增强全局搜索能力,但也会增加计算资源的消耗和计算时间;增加迭代次数可能有助于找到更优解,但同样会增加计算时间,且可能导致算法在后期陷入局部最优解的风险增加。

(二)结果展示

  1. 最优路径和距离
    • 运行代码后,输出最优路径(Route)和最佳距离(Distance),展示算法在给定城市分布下找到的最优旅行商路径及其长度。通过多次运行代码或调整参数,可以进一步分析算法在不同条件下的性能表现,如最优解的稳定性、收敛速度等。
  2. 对比实验结果
    • 文中进行了两组对比实验,一组对比传统ABC算法与AABC算法在随机生成城市点下的运行情况,结果表明AABC算法在迭代次数和运行时间上具有一定优势;另一组对比遗传算法(GA)、ABC算法和AABC算法在TSPlib测试集中的运行时间,同样显示AABC算法表现较好。这些对比实验验证了混合ABC和A*算法在求解TSP问题上的有效性和优势,即在保证求解质量的前提下,能够提高求解速度,减少迭代次数,有效避免陷入局部最优解。

    • 在这里插入图片描述

    • 在这里插入图片描述

部署方式

  • python 3.8以上

资源获取

详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件地址获取。

附件地址:基于混合ABC和A*算法复现

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024 APMCM亚太数学建模C题 - 宠物行业及相关产业的发展分析和策略(详细解题思路)

在当下, 日益发展的时代,宠物的数量应该均为稳步上升,在美国出现了下降的趋势, 中国 2019-2020 年也下降,这部分变化可能与疫情相关。需要对该部分进行必要的解释说明。 问题 1: 基于附件 1 中的数据及您的团队收集的额…

鸿蒙MVVM模式介绍与使用

文章目录 鸿蒙MVVM模式介绍与使用背景MVVM模式介绍相关装饰器介绍State状态变量Prop、Link的作用 MVVM架构模式的实现以及相关装饰器的使用具体实现效果 总结 鸿蒙MVVM模式介绍与使用 背景 最近在学习鸿蒙开发,想到了以前写安卓移动端应用时经常会用到的MVVM架构模式,就想着能…

Jmeter测试工具的安装和使用,mac版本,jmeter版本5.2.1

Jmeter测试工具的安装和使用JSON格式请求 一、安装1、安装jdk包和设置java环境2、去官网下载Jmeter3、解压后,打开mac终端,进入apache-jmeter的bin文件开启jmeter 二、使用jmeter1、添加线程2、添加HTTP请求3、配置请求的协议、IP地址、端口号、请求方法…

Spring Boot教程之十: 使用 Spring Boot 实现从数据库动态下拉列表

使用 Spring Boot 实现从数据库动态下拉列表 动态下拉列表(或依赖下拉列表)的概念令人兴奋,但编写起来却颇具挑战性。动态下拉列表意味着一个下拉列表中的值依赖于前一个下拉列表中选择的值。一个简单的例子是三个下拉框,分别显示…

Vue前端开发2.3.6 列表渲染指令

在Vue.js中,v-for指令是渲染列表的关键工具,支持从数组、对象、数字和字符串中生成列表。它简化了商品列表等重复元素的创建。为了优化性能,key属性为每个列表项提供唯一标识,帮助Vue追踪节点身份,实现元素重用。实战中…

敏捷开发02:敏捷开发之Scrum开发框架介绍

一、什么是 Scrum 1.1 Scrum 定义 Scrum 是敏捷开发方法之一,它使用比较广泛。 敏捷的其它开发方法还有 XP(极限编程)、FDD(特性驱动开发)、Crystal(水晶方法)、TDD(测试驱动开发)、DSDM(动态系统开发)等等敏捷方法。 Scrum-Guide 中定义的 Scrum: S…

使用mingw+CMake在Windows平台编译OpenCV

1. 安装mingw和cmake cmake的安装比较简单,百度一下完成相关操作即可,笔者安装的是3.24.3版本。 Mingw的安装也有很多相关文章,不过我使用的是安装QT时附带安装的mingw,其路径为D:\software\Qt\Tools\mingw1120_64。其中的bin文件…

能源电力企业安全数据内外网文件交换

在数字化浪潮的推动下,能源电力行业数据交换的频率急剧上升,涉及的视频、研发、设计等各类文件数量庞大。这些文件的内外网传输不仅要追求速度,更要确保数据安全。随着国家对数据安全重视程度的提高,《网络安全法》和《数据安全法…

突破内存限制:Mac Mini M2 服务器化实践指南

本篇文章,我们聊聊如何使用 Mac Mini M2 来实现比上篇文章性价比更高的内存服务器使用,分享背后的一些小的思考。 希望对有类似需求的你有帮助。 写在前面 在上文《ThinkPad Redis:构建亿级数据毫秒级查询的平民方案》中,我们…

C++ 二叉搜索树(Binary Search Tree, BST)深度解析与全面指南:从基础概念到高级应用、算法优化及实战案例

🌟个人主页:落叶 🌟当前专栏: C专栏 目录 ⼆叉搜索树的概念 ⼆叉搜索树的性能分析 ⼆叉搜索树的插⼊ ⼆叉搜索树的查找 二叉搜索树中序遍历 ⼆叉搜索树的删除 cur的左节点为空的情况 cur的右节点为空的情况 左,右节点都不为…

数据库、数据仓库、数据湖、数据中台、湖仓一体的概念和区别

数据库、数据仓库、数据湖、数据中台和湖仓一体是数据管理和分析领域的不同概念,各自有不同的特点和应用场景。以下是它们的主要区别: 1. 数据库(Database) 定义:结构化的数据存储系统,用于高效地存储、检…

RabbitMQ原理架构解析:消息传递的核心机制

文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1、简单模式3.2、工作模式3.3、发布订阅3.4、路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1、单机部署5.2、集群部署(镜像模式)5.3、K8s部署…

idea_常用设置

相关设置 项目的JDK设置out目录取消自动更新设置主题设置菜单和窗口字体大小滚轮调节字体大小显示行号与方法分隔符代码智能提示忽略大小写自动导包配置设置项目文件编码设置控制台的字符编码修改类头的文档注释信息设置自动编译 项目的JDK设置 File -> Project Structure -…

Redis的管道操作

在现代应用程序中,Redis作为一种高性能的内存数据库,被广泛用于缓存、消息队列、实时分析等场景。为了进一步提高Redis的性能,Redis提供了管道(Pipeline)操作,允许客户端将多个命令一次性发送到服务器&…

详解登录MySQL时出现SSL connection error: unknown error number错误

目录 登录MySQL时出错SSL connection error: unknown error number 出错原因 使用MySQL自带的工具登录MySQL 登陆之后,使用如下命令进行查看 解决方法 找到MySQL8安装目录下的my.ini配置文件 记事本打开my.ini文件,然后按下图所示添加配置 此时再…

E2、UML类图顺序图状态图实训

一、实验目的 在面向对象的设计里面,可维护性复用都是以面向对象设计原则为基础的,这些设计原则首先都是复用的原则,遵循这些设计原则可以有效地提高系统的复用性,同时提高系统的可维护性。在掌握面向对象七个设计原则基础上&…

Angular面试题汇总系列一

1. 如何理解Angular Signal Angular Signals is a system that granularly tracks how and where your state is used throughout an application, allowing the framework to optimize rendering updates. 什么是信号 信号是一个值的包装器,可以在该值发生变化时…

我要成为算法高手-递归篇

目录 题目1:汉诺塔题目2:合并两个有序链表题目3:反转链表题目4:两两交换链表中的结点题目5:Pow(x,n) 题目1:汉诺塔 面试题 08.06. 汉诺塔问题 - 力扣(LeetCode) 解题思路&#xff1…

【大数据技术基础】 课程 第8章 数据仓库Hive的安装和使用 大数据基础编程、实验和案例教程(第2版)

第8章 数据仓库Hive的安装和使用 8.1 Hive的安装 8.1.1 下载安装文件 访问Hive官网(http://www.apache.org/dyn/closer.cgi/hive/)下载安装文件apache-hive-3.1.2-bin.tar.gz 下载完安装文件以后,需要对文件进行解压。按照Linux系统使用的…

js.二叉树的层序遍历2

链接:107. 二叉树的层序遍历 II - 力扣(LeetCode) 题目: 给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历&#xff09…