基于混合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 孙涛,…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
