基于混合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*算法复现