鲸鱼算法优化多旅行商问题的Matlab实现

发布时间:2026/7/28 13:24:44
鲸鱼算法优化多旅行商问题的Matlab实现 1. 项目概述当鲸鱼算法遇上多旅行商难题去年接手一个物流路径优化项目时我遇到了一个典型的大规模单仓库多旅行商问题LS-SDMTSP。简单来说就是如何让多辆配送车从同一个仓库出发在覆盖所有客户点的前提下找到总里程最短的行驶路线。这类问题在快递配送、电网巡检等场景中非常常见但传统方法在超过50个节点时就会出现组合爆炸——可能的路线方案数量会呈指数级增长。当时试过遗传算法和蚁群算法效果都不太理想。直到看到鲸鱼迁徙算法WMA的论文这种模拟鲸鱼群体狩猎行为的元启发式算法在解决高维优化问题上展现出独特优势。经过三个月的Matlab实现和调参最终开发出的求解器在1000个节点的测试案例中比传统方法节省了17%的总里程。下面就把这套方法的实现细节和踩坑经验分享给大家。2. 问题建模与算法原理2.1 SDMTSP的数学表达假设我们有一个中心仓库编号为0N个客户点编号1到NK辆配送车需要最小化的目标函数是总距离 Σ(每辆车的行驶路线距离)约束条件包括每个客户点必须被且仅被访问一次所有路线必须从仓库出发并返回仓库各路线长度尽量均衡可通过惩罚函数实现在Matlab中我们用N×2的矩阵存储所有点的坐标距离矩阵D通过pdist2函数预先计算好。这是后续算法优化的基础。2.2 鲸鱼迁徙算法的生物机理WMA的核心是模拟鲸鱼群的三种行为模式螺旋气泡网捕食- 局部搜索阶段随机游走觅食- 全局探索阶段信息共享机制- 群体协作阶段与遗传算法相比WMA的独特优势在于通过螺旋更新方程实现精细搜索收敛精度高自适应调整探索/开发比例避免早熟收敛群体间信息交换效率高收敛速度快3. Matlab实现详解3.1 算法框架搭建function [bestRoute, minDist] WMA_SDMTSP(coords, K, params) % 初始化鲸鱼种群 whales initWhales(params.popSize, coords, K); for iter 1:params.maxIter % 计算适应度总距离倒数 fitness 1./calcTotalDist(whales, coords); % 更新领导鲸位置最优解 [~, leaderIdx] max(fitness); leader whales(leaderIdx,:); % 参数a线性递减 a 2 - iter*(2/params.maxIter); % 更新每头鲸的位置 for i 1:params.popSize if rand() 0.5 % 螺旋气泡网捕食局部开发 whales(i,:) spiralUpdate(whales(i,:), leader, a); else % 随机游走觅食全局探索 whales(i,:) randomSearch(whales(i,:), a); end end % 信息共享机制交叉变异 whales infoExchange(whales, fitness); end end3.2 关键操作实现编码方案采用优先权值编码Priority-based Encoding每条鲸鱼用一个长度为N的向量表示数值越大表示该客户点优先级越高。解码时对所有客户点按优先级排序依次将客户点分配给当前路程最短的车辆适应度计算特别注意function totalDist calcTotalDist(whales, coords) totalDist zeros(size(whales,1),1); for i 1:size(whales,1) % 解码得到K条路线 routes decodeRoutes(whales(i,:), coords); % 计算总距离加入均衡惩罚项 dists cellfun((r) sum(pdist2(r, r([2:end 1]))), routes); totalDist(i) sum(dists) 0.1*std(dists); end end4. 参数调优与加速技巧4.1 推荐参数设置通过500次实验得到的黄金参数组合参数推荐值作用说明种群规模50-100过小易陷入局部最优最大迭代次数500-1000根据问题规模调整螺旋形状常数b1控制局部搜索的精细程度信息共享概率0.3-0.5影响算法收敛速度实际测试发现当客户点超过500个时将种群规模设为问题规模的1/5效果最佳4.2 计算加速方案距离矩阵预计算D pdist2(coords, coords); % 在算法开始前计算一次并行化适应度计算parfor i 1:size(whales,1) totalDist(i) calcTotalDist(whales(i,:), D); end使用Mex函数将解码过程用C实现并编译为Mex文件可提速3-5倍5. 典型问题排查指南5.1 收敛过早问题现象迭代100代后解的质量不再提升解决方案增加信息共享概率0.5→0.7在随机搜索阶段加入高斯扰动whales(i,:) whales(i,:) 0.1*randn(size(whales(i,:)));5.2 路线不均衡问题现象某辆车负责90%的客户点优化方法调整适应度函数中的惩罚系数0.1→0.3在解码时加入容量约束while length(route{k}) ceil(N/K)*1.2 % 限制单路线最大点数 movePointToNextRoute(); end6. 实际应用案例某电商区域配送中心的数据客户点856个配送车20辆传统遗传算法结果总里程3872kmWMA优化结果总里程3241km降低16.3%关键优化点利用鲸鱼算法的精细搜索能力在仓库周边形成紧密的配送簇通过信息共享机制自动识别长距离单点配送需求最终路线间的里程差异控制在8%以内实现代码已开源在GitHub搜索WMA-SDMTSP-Matlab包含完整的测试数据集和可视化模块。对于超大规模问题5000点建议先用K-means聚类分区后再应用本算法。