基于混合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*算法原理
- 核心思想
- A*算法在搜索过程中,始终维护两个列表:开放列表(open list)和关闭列表(closed list)。开放列表用于存放待扩展的节点,关闭列表用于存放已扩展的节点。每次从开放列表中选择(f(n))值最小的节点进行扩展,计算其相邻节点的(g(n))、(h(n))和(f(n))值,并根据情况更新开放列表和关闭列表。在TSP问题中,以城市为节点,城市间距离为边权,通过不断扩展节点,寻找从起始城市到其他城市再回到起始城市的最短路径。
- 搜索过程
- 首先将起始城市加入开放列表,计算其(f(n))值(初始时(g(n)=0),(h(n))根据启发式函数计算,如欧几里得距离)。然后循环执行以下步骤:从开放列表中取出(f(n))值最小的节点,如果该节点为目标城市(即回到起始城市且遍历了所有其他城市),则搜索结束,根据记录的路径信息重建路径;否则,将该节点加入关闭列表,扩展其相邻节点,计算相邻节点的(g(n))、(h(n))和(f(n))值,若相邻节点不在开放列表或新的(f(n))值更小,则更新开放列表中的相应信息。重复上述过程,直到开放列表为空,表示未找到可行解。
(二)人工蜂群算法原理
- 蜜蜂角色与行为模拟
- 雇佣蜂:作为蜜源的发现者,在解空间(城市排列组合空间)中随机搜索初始解(路径),并记录蜜源信息(路径长度等)。然后通过特定的搜索方式(如邻域搜索)在当前蜜源附近寻找新的蜜源(改进路径),并根据新蜜源的质量(路径长度更短)决定是否更新蜜源信息。
- 观察蜂:根据雇佣蜂提供的蜜源信息(路径长度等),以一定概率选择较好的蜜源进行进一步搜索。观察蜂通过评估蜜源的适应度(与路径长度相关)来选择蜜源,适应度越高(路径越短)被选择的概率越大,从而引导搜索向更优解方向进行。
- 侦察蜂:当雇佣蜂在一定次数内无法找到更好的蜜源时,侦察蜂随机搜索新的蜜源,以避免算法陷入局部最优解。侦察蜂的存在增加了算法的探索能力,有助于跳出局部最优,发现更广阔的搜索空间。
- 参数更新机制
- 跟随因子更新:简化计算过程,直接取上一代蜜蜂走过的最短路径作为跟随路径,其计算涉及不同模型(如Bes模型、Bqs模型和Bds模型),根据模型不同,跟随因子的计算方式有所差异,主要与蜜蜂走过的距离或城市间距离等因素相关。
- 转移因子动态更新:侦察蜂根据跟随蜂建立的路径模型,动态确定候选城市的转移因子,其更新规则根据不同情况(如候选城市是否在雇佣蜂搜索路径中)而有所不同,通过转移因子确定城市间转移的优先级,影响蜜蜂选择下一个访问城市的概率。
- 采蜜蜂状态转移:蜂群总数由侦察蜂总数和跟随蜂总数组成,其比例关系影响算法的收敛性。跟随蜂和侦察蜂根据转移因子概率选择后续路线,确保大部分采蜜蜂根据上一代信息选择转移路线,同时侦察蜂保持一定随机性,以平衡算法的开发和探索能力。
(三)混合ABC和A*算法策略
- 结合方式与优势
- 混合算法先利用人工蜂群算法进行全局搜索,通过蜜蜂群体的协作初步找到一个较优的初始路径。然后以该初始路径的起始城市为起点和终点,运用A算法进行局部优化。A算法在局部搜索中,能够快速找到从当前城市到下一个城市的最优路径,避免了ABC算法在局部搜索时可能出现的盲目性和低效率。这种结合方式充分发挥了ABC算法的全局探索能力和A*算法的局部最优搜索能力,有效提高了算法的收敛速度和求解精度。
- 具体实现步骤
- 首先使用ABC算法进行城市点之间的初始规划,包括种群初始化、雇佣蜂搜索蜜源、跟随蜂根据转移因子选择路径、侦察蜂随机搜索新蜜源等操作,经过一定迭代次数后得到初始路径点。然后,针对初始路径点,每相邻路径点之间使用A算法进行优化,计算相邻点之间的实际代价(g(n))(如城市间距离)和估计代价(h(n))(如对角线距离),根据A算法的搜索策略选择最优路径,最终得到全局较优的旅行商路径。
三、代码实现
(一)数据准备
- 城市坐标生成
create_cities
函数用于生成(n)个城市的随机坐标,坐标范围在(0)到(100)之间,模拟TSP问题中的城市分布情况。通过随机生成城市坐标,为后续路径计算和算法验证提供了多样化的测试数据。
(二)关键函数实现
- 路径长度计算函数
calculate_distance
函数计算给定路径的长度,通过计算路径中相邻城市间的欧几里得距离之和(考虑循环路径,最后一个城市与第一个城市相连),使用numpy
的linalg.norm
函数计算向量的范数来获取距离。该函数准确地量化了路径的优劣,为算法中的路径选择和优化提供了评估标准。
- A*算法函数
a_star
函数实现A算法的核心逻辑,通过维护开放列表和关闭列表,根据代价函数(f(n))选择下一个扩展节点,计算节点到起点的实际代价(g(n))和到终点的估计代价(h(n)),不断搜索直到找到目标节点或开放列表为空,返回从起点到各个节点的路径和代价信息。其内部实现了节点的扩展、列表的更新以及路径的记录,是A算法在TSP问题中的关键实现部分。
- 路径重建函数
reconstruct_path
函数根据A算法返回的路径信息(came_from
字典),从目标节点开始回溯,构建出完整的路径,将路径反转后返回。该函数将A算法搜索得到的路径信息转化为旅行商实际可行的遍历路径,是获取最终结果的重要步骤。
- 人工蜂群算法函数
abc_algorithm
函数实现了人工蜂群算法的主要流程,包括种群初始化、适应度计算、雇佣蜂搜索、跟随蜂选择和侦察蜂操作等。通过随机生成种群,计算路径长度作为适应度,雇佣蜂通过交换路径中的城市进行邻域搜索,跟随蜂根据适应度选择蜜源,侦察蜂在必要时随机搜索新蜜源,经过多次迭代找到较优路径,返回最佳路径和适应度。
- 混合ABC和A*算法函数
aabc_algorithm
函数是混合算法的核心,先调用abc_algorithm
获取初始路径,然后以初始路径的起始城市为起点和终点,使用a_star
算法进行路径优化,通过重建路径和计算路径长度,最终返回优化后的路径和长度。该函数整合了ABC和A*算法,实现了两种算法的优势互补,是求解TSP问题的关键步骤。
(三)主程序
- 参数设置与算法调用
- 在主程序中,首先设置城市数量(如(n = 20))、蜜蜂数量(如(n_bees = 10))和最大迭代次数(如(max_iter = 100))等参数,然后调用
create_cities
函数生成城市坐标,接着调用aabc_algorithm
函数执行混合算法,获取优化后的路径和距离。
- 在主程序中,首先设置城市数量(如(n = 20))、蜜蜂数量(如(n_bees = 10))和最大迭代次数(如(max_iter = 100))等参数,然后调用
- 结果输出与可视化
- 输出优化后的路径(
Route
)和距离(Distance
),展示算法的求解结果。同时,使用matplotlib
库绘制城市坐标点和优化后的路径,将城市显示为散点,路径显示为红线,直观地展示了旅行商的最优遍历路径,帮助用户更好地理解算法的效果。
- 输出优化后的路径(
四、实验结果
(一)实验设置
- 参数调整
- 在
aabc_algorithm
函数中,可调整参数包括蜜蜂数量n_bees
、最大迭代次数max_iter
等。增加蜜蜂数量可能会增强全局搜索能力,但也会增加计算资源的消耗和计算时间;增加迭代次数可能有助于找到更优解,但同样会增加计算时间,且可能导致算法在后期陷入局部最优解的风险增加。
- 在
(二)结果展示
- 最优路径和距离
- 运行代码后,输出最优路径(
Route
)和最佳距离(Distance
),展示算法在给定城市分布下找到的最优旅行商路径及其长度。通过多次运行代码或调整参数,可以进一步分析算法在不同条件下的性能表现,如最优解的稳定性、收敛速度等。
- 运行代码后,输出最优路径(
- 对比实验结果
-
文中进行了两组对比实验,一组对比传统ABC算法与AABC算法在随机生成城市点下的运行情况,结果表明AABC算法在迭代次数和运行时间上具有一定优势;另一组对比遗传算法(GA)、ABC算法和AABC算法在TSPlib测试集中的运行时间,同样显示AABC算法表现较好。这些对比实验验证了混合ABC和A*算法在求解TSP问题上的有效性和优势,即在保证求解质量的前提下,能够提高求解速度,减少迭代次数,有效避免陷入局部最优解。
-
部署方式
- python 3.8以上
资源获取
详细复现过程的项目源码、数据和预训练好的模型可从该文章下方附件地址获取。
附件地址:基于混合ABC和A*算法复现
相关文章:
基于混合ABC和A*算法复现
基于混合ABC和A*算法复现 一、背景介绍二、算法原理(一)A*算法原理(二)人工蜂群算法原理(三)混合ABC和A*算法策略 三、代码实现(一)数据准备(二)关键函数实现…...
狂野飙车8+(Asphalt 8+) for Mac 赛车竞速游戏 安装教程
Mac分享吧 文章目录 狂野飙车8(Asphalt 8) for Mac 赛车竞速游戏软件 效果图展示一、狂野飙车8(Asphalt 8) 赛车竞速游戏 Mac电脑版——v2.1.11️⃣:下载软件2️⃣:安装软件2.1 左侧安装包拖入右侧文件夹中,等待安装完成,运行软件…...
网络技术-VRRP(虚拟路由冗余协议)部署介绍
一、VRRP的含义 VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)是一种高度可靠的路由器备用协议,用于在局域网内部提供路由器冗余。 其部署方式主要是通过多个路由器组成一个虚拟路由器组,通过协议选…...
C语言解决空瓶换水问题:高效算法与实现
标题:C语言解决空瓶换水问题:高效算法与实现 一、问题描述 在一个饮料促销活动中,你可以通过空瓶换水的方式免费获得更多的水:3个空瓶可以换1瓶水。喝完这瓶水后,空瓶会再次变为空瓶。假设你最初拥有一定数量的空瓶&a…...
day2全局注册
全局注册代码: //文件核心作用:导入App.vue,基于App.vue创建结构渲染index.htmlimport Vue from vue import App from ./App.vue //编写导入的代码,往代码的顶部编写(规范) import HmButton from ./components/Hm-But…...
鸿蒙多线程应用-taskPool
并发模型 并发模型是用来实现不同应用场景中并发任务的编程模型,常见的并发模型分为基于内存共享的并发模型和基于消息通信的并发模型。 Actor并发模型作为基于消息通信并发模型的典型代表,不需要开发者去面对锁带来的一系列复杂偶发的问题,同…...
【失败经验】将算法模型封装为安卓应用
背景:不懂安卓开发,希望能使用大模型编码完成安卓应用生成,调用算法模型进行预测。 模型准备: pip方案安装pcnn; 然后需要将pytorch训练完成的算法模型保存为torchscript模型,然后使用pcnn转换为ncnn的模…...
ABAP OOALV模板
自用模板,可能存在问题 一、主程序 *&---------------------------------------------------------------------* *& Report ZVIA_OO_ALV *&---------------------------------------------------------------------* REPORT ZVIA_OO_ALV.INCLUDE ZVI…...
YOLOv8-ultralytics-8.2.103部分代码阅读笔记-autobatch.py
autobatch.py ultralytics\utils\autobatch.py 目录 autobatch.py 1.所需的库和模块 2.def check_train_batch_size(model, imgsz640, ampTrue, batch-1): 3.def autobatch(model, imgsz640, fraction0.60, batch_sizeDEFAULT_CFG.batch): 1.所需的库和模块 # Ultraly…...
SycoTec 4060 ER-S德国高精密主轴电机如何支持模具的自动化加工?
SycoTec 4060 ER-S高速电主轴在模具自动化加工中的支持体现在以下几个关键方面: 1.高精度与稳定性:SycoTec 4060 ER-S锥面跳动小于1微米,确保了加工过程中的极高精度,这对于模具的复杂几何形状和严格公差要求至关重要。高精度加工…...
部署 DeepSpeed以推理 defog/sqlcoder-70b-alpha 模型
部署 DeepSpeed 以推理 defog/sqlcoder-70b-alpha 这样的 70B 模型是一个复杂的过程,涉及多个关键步骤。下面是详细的步骤,涵盖了从模型加载、内存优化到加速推理的全过程。 1. 准备环境 确保你的环境配置正确,以便能够顺利部署 defog/sqlc…...
Python网络爬虫基础
Python网络爬虫是一种自动化工具,用于从互联网上抓取信息。它通过模拟人类浏览网页的行为,自动地访问网站并提取所需的数据。网络爬虫在数据挖掘、搜索引擎优化、市场研究等多个领域都有广泛的应用。以下是Python网络爬虫的一些基本概念: 1.…...
每天五分钟机器学习:支持向量机数学基础之超平面分离定理
本文重点 超平面分离定理(Separating Hyperplane Theorem)是数学和机器学习领域中的一个重要概念,特别是在凸集理论和最优化理论中有着广泛的应用。该定理表明,在特定的条件下,两个不相交的凸集总可以用一个超平面进行分离。 定义与表述 超平面分离定理(Separating Hy…...
TCP/IP网络协议栈
TCP/IP网络协议栈是一个分层的网络模型,用于在互联网和其他网络中传输数据。它由几个关键的协议层组成,每一层负责特定的功能。以下是对TCP/IP协议栈的简要介绍: TCP/IP协议模型的分层 1. 应用层(Application Layer)…...
利用编程思维做题之最小堆选出最大的前10个整数
1. 理解问题 我们需要设计一个程序,读取 80,000 个无序的整数,并将它们存储在顺序表(数组)中。然后从这些整数中选出最大的前 10 个整数,并打印它们。要求我们使用时间复杂度最低的算法。 由于数据量很大,直…...
详解MVC架构与三层架构以及DO、VO、DTO、BO、PO | SpringBoot基础概念
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 今天毛毛张分享的是SpeingBoot框架学习中的一些基础概念性的东西:MVC结构、三层架构、POJO、Entity、PO、VO、DO、BO、DTO、DAO 文章目录 1.架构1.1 基本…...
Unity C# 影响性能的坑点
c用的时间长了怕unity的坑忘了,记录一下。 GetComponent最好使用GetComponent<T>()的形式, 继承自Monobehaviour的函数要避免空的Awake()、Start()、Update()、FixedUpdate().这些空回调会造成性能浪费 GetComponent方法最好避免在Update当中使用…...
工作学习:切换git账号
概括 最近工作用的git账号下发下来了,需要切换一下使用的账号。因为是第一次弄,不熟悉,现在记录一下。 打开设置 路径–git—git remotes,我这里选择项是Manage Remotes,点进去就可以了。 之后会出现一个输入框&am…...
量化交易系统开发-实时行情自动化交易-8.量化交易服务平台(一)
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于收集整理的33个量化交易服…...
Scala习题
姓名,语文,数学,英语 张伟,87,92,88 李娜,90,85,95 王强,78,90,82 赵敏,92,88,91 孙涛,…...
结构方程模型(SEM)入门到精通:lavaan VS piecewiseSEM、全局估计/局域估计;潜变量分析、复合变量分析、贝叶斯SEM在生态学领域应用
目录 第一章 夯实基础 R/Rstudio简介及入门 第二章 结构方程模型(SEM)介绍 第三章 R语言SEM分析入门:lavaan VS piecewiseSEM 第四章 SEM全局估计(lavaan)在生态学领域高阶应用 第五章 SEM潜变量分析在生态学领域…...
OpenCV图像基础处理:通道分离与灰度转换
在计算机视觉处理中,理解图像的颜色通道和灰度表示是非常重要的基础知识。今天我们通过Python和OpenCV来探索图像的基本组成。 ## 1. 图像的基本组成 在数字图像处理中,彩色图像通常由三个基本颜色通道组成: - 蓝色(Blue&#x…...
C++ 类和对象(类型转换、static成员)
目录 一、前言 二、正文 1.隐式类型转换 1.1隐式类型转换的使用 2.static成员 2.1 static 成员的使用 2.1.1static修辞成员变量 2.1.2 static修辞成员函数 三、结语 一、前言 大家好,我们又见面了。昨天我们已经分享了初始化列表:https://blog.c…...
【网络安全设备系列】12、态势感知
0x00 定义: 态势感知(Situation Awareness,SA)能够检测出超过20大类的云上安全风险,包括DDoS攻击、暴力破解、Web攻击、后门木马、僵尸主机、异常行为、漏洞攻击、命令与控制等。利用大数据分析技术,态势感…...
Linux介绍与安装指南:从入门到精通
1. Linux简介 1.1 什么是Linux? Linux是一种基于Unix的操作系统,由Linus Torvalds于1991年首次发布。Linux的核心(Kernel)是开源的,允许任何人自由使用、修改和分发。Linux操作系统通常包括Linux内核、GNU工具集、图…...
BGE-M3模型结合Milvus向量数据库强强联合实现混合检索
在基于生成式人工智能的应用开发中,通过关键词或语义匹配的方式对用户提问意图进行识别是一个很重要的步骤,因为识别的精准与否会影响后续大语言模型能否检索出合适的内容作为推理的上下文信息(或选择合适的工具)以给出用户最符合…...
鸿蒙NEXT开发案例:文字转拼音
【引言】 在鸿蒙NEXT开发中,文字转拼音是一个常见的需求,本文将介绍如何利用鸿蒙系统和pinyin-pro库实现文字转拼音的功能。 【环境准备】 • 操作系统:Windows 10 • 开发工具:DevEco Studio NEXT Beta1 Build Version: 5.0.…...
CTF之密码学(栅栏加密)
栅栏密码是古典密码的一种,其原理是将一组要加密的明文划分为n个一组(n通常根据加密需求确定,且一般不会太大,以保证密码的复杂性和安全性),然后取每个组的第一个字符(有时也涉及取其他位置的字…...
修改插槽样式,el-input 插槽 append 的样式
需缩少插槽 append 的 宽度 方法1、使用内联样式直接修改,指定 width 为 30px <el-input v-model"props.applyBasicInfo.outerApplyId" :disabled"props.operateCommandType input-modify"><template #append><el-button click…...
UPLOAD LABS | PASS 01 - 绕过前端 JS 限制
关注这个靶场的其它相关笔记:UPLOAD LABS —— 靶场笔记合集-CSDN博客 0x01:过关流程 本关的目标是上传一个 WebShell 到目标服务器上,并成功访问: 我们直接尝试上传后缀为 .php 的一句话木马: 如上,靶场弹…...
it公司怎么在国外网站做宣传/云浮seo
需求一:从键盘输入一串字符串,统计数字,字母,空格,其它字符的个数 1 import java.util.Scanner;2 3 public class Q1 {4 5 public static void main(String[] args) {6 // TODO Auto-generated method stu…...
网站开发云南/广州各区最新动态
java环境变量配置新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7.0_75变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;Path添加变量置变量名࿱…...
有了域名空间怎么做网站/网络营销品牌推广
携手创作,共同成长!这是我参与「掘金日新计划 8 月更文挑战」的第16天,点击查看活动详情 降低阅读负担,启发创作心智,轻松学习 JavaScript 技巧,日拱一卒,jym,冲~ 注:本…...
微信网站是多少钱一年/百度指数功能模块有哪些
忙里偷闲读首诗–前言 对酒当歌,人生几何?譬如朝露,去日苦多。 你我皆星尘,离合奈何悲欢。不可忙于奔跑,而忘记思考我是谁?我从哪里来?我要到哪里去?不经思索的人生不值得一过。 中国古诗词,源远流长…...
帮别人做网站哪里可以接单/网站推广软件免费版
闲来无事,看到了拓扑排序就学习了一下。 拓扑排序: 算导上说是使用深搜来对有向无环图进行排序,得到一种线性次序。不过深搜的理解还理解不到。估计是深搜学的不怎么样吧! 说说我理解的这个线性次序吧。我认为算导上的例子就特别…...
手机如何创建网站/优化系统软件
sudo yum install expect#!/usr/bin/expect set timeout 3 spawn ssh root192.168.234.249 expect "*password*" send "123456\r" send "sudo -s\r" send "cd /data/logs\r" interact...