基于改进蚁群算法的路径规划 Rho=0.3 ; % Rho 信息素蒸发系数 改进Rho初值为0.1 ,迭代中自适应变化 设置自适应变化系数值,加启发因子 提高搜索效率 收敛曲线对比如下
(基于原始代码逻辑忠实还原)
一、程序核心目标
本程序通过改进蚁群算法,在含障碍物的二维网格地图中寻找从起始点到目标点的最短路径,核心功能是实现高效的路径搜索与结果可视化,重点通过信息素蒸发系数自适应调整、启发因子强化等策略提升搜索性能。
二、核心模块与功能实现
(一)地图建模模块(G2D.m函数)
- 输入输出:
- 输入:0-1矩阵表示的网格地图(G),其中G(i,j)=0表示可通行区域,G(i,j)=1表示障碍物。
- 输出:邻接矩阵(D),维度为l²×l²(l为地图边长),D(i,j)表示节点i到节点j的距离(0表示不可达)。
- 核心逻辑:
- 将地图坐标(i,j)转换为节点编号(行优先规则:node=(i-1)*l + j)。
- 定义相邻节点距离:上下左右相邻节点距离为1,对角线相邻节点距离为√2(通过坐标差计算)。
- 仅为可通行节点(G(i,j)=0)建立邻接关系,障碍物节点不参与路径计算。
(二)算法参数初始化模块(main.m)
- 基础参数:
- 地图参数:地图边长MM、总节点数N=MM×MM、网格单位长度a=1。
- 算法控制参数:总迭代次数K、每轮蚂蚁数量M、起始节点S、目标节点E、信息素重要度因子Alpha、启发因子重要度因子Beta。
- 改进参数:
- 信息素蒸发系数初始值Rho_init=0.1(区别于原始算法的固定值0.3)。
- 初始信息素矩阵Tau:全局信息素初始值设为8,确保初始探索的均匀性。
(三)路径搜索模块(蚂蚁移动逻辑)
- 蚂蚁状态初始化:
- 每只蚂蚁从起始节点S出发,通过禁忌表(TABUkm)记录已访问节点(1=可访问,0=已访问),避免重复路径。
- 节点选择规则:
- 基于信息素(Tau)和启发因子(Eta)的“转轮赌法”: - 计算当前节点的可达邻居(排除障碍物和已访问节点)。
- 对每个邻居节点,计算选择概率:
PP(i) = (Tau(W, LJD(i))^Alpha) × (Eta(LJD(i))^Beta),归一化后作为选择依据。 - 随机生成0-1之间的数,选择累积概率首次大于该随机数的邻居节点作为下一站。
(四)改进策略实现模块
- 信息素蒸发系数(Rho)自适应调整:
- 迭代过程中Rho动态变化,公式为:Rho = 0.6 × (1 - exp(-k/K × 1000))(k为当前迭代次数,K为总迭代次数)。
- 效果:迭代初期Rho≈0(信息素挥发慢,利于探索),后期Rho≈0.6(挥发快,强化优质路径)。
- 启发因子(Eta)强化:
-Eta表示节点到目标点的吸引力,计算方式为“直线距离倒数的平方”:Eta(i) = (1 / 节点i到目标点的直线距离)²(目标点E的Eta固定为100,避免循环)。
- 效果:距离目标点越近的节点吸引力越强,提升搜索导向性。
- 信息素(Tau)上下限约束:
- 上限Taumax:基于当前最优路径长度计算,公式为Taumax = (1/(2*(1-Rho))×(1/minkl) + 1/minkl)×200,防止信息素过度积累导致路径扎堆。
- 下限Taumin = Taumax / 500,防止信息素过度挥发导致探索能力丧失。
(五)信息素更新模块
- 增量计算:每只蚂蚁在有效路径(到达目标点)上的信息素增量为
Delta_Tau(x,y) = Q / 路径长度(Q为增量强度系数),双向更新(x→y和y→x)。 - 全局更新:
Tau = (1 - Rho)×Tau + Delta_Tau,结合挥发与增量,平衡探索与利用。
(六)结果记录与可视化模块
- 数据记录:
- 存储每轮蚂蚁的路径(ROUTES)和路径长度(PL),追踪最优路径(Route_Shortest)及其长度(minkl)。
- 可视化输出:
- 收敛曲线:展示每轮迭代的最小路径长度变化,处理无有效路径的情况(继承前一轮最优值)。
- 路径图:在地图中标记障碍物(黑色)、可通行区域(白色)、最优路径(红色)、起点(绿色)和目标点(蓝色),直观呈现搜索结果。
三、程序执行流程
- 输入地图矩阵,调用
G2D.m生成邻接矩阵。 - 初始化算法参数、信息素矩阵、启发因子矩阵。
- 迭代搜索:每轮蚂蚁按规则移动,记录路径与长度,更新信息素(含自适应调整与上下限约束)。
- 迭代结束后,输出最优路径信息(长度、迭代轮次、节点序列)并绘制收敛曲线与路径图。
四、核心改进的程序意图
- 自适应
Rho:通过动态调整信息素挥发速度,解决原始算法“探索-利用”失衡问题(初期多探索,后期快收敛)。 - 强化
Eta:增强目标导向性,减少无效绕路,提升搜索效率。 - 信息素约束:避免信息素数值失控,维持算法稳定性,降低陷入局部最优的风险。
以上功能均严格基于代码逻辑实现,未添加额外假设,忠实反映程序设计意图。