一、鲸鱼迁徙算法
鲸鱼迁徙算法(Whale Migration Algorithm,WMA)是2025年提出的一种新颖生物启发式元启发式优化方法,其灵感来源于座头鲸的协作迁徙行为。该算法通过模拟座头鲸的迁徙和捕食行为,实现了在优化过程中的高效搜索和优化能力。WMA通过整合领导者-追随者动态和自适应迁徙策略,平衡了探索和开发之间的关系,从而提高了算法避免局部最优和有效收敛的能力。WMA通过模拟座头鲸的迁徙行为,实现了在搜索空间中的有效探索和开发。这种平衡使得算法能够在避免陷入局部最优的同时,快速收敛到全局最优解。WMA的自适应迁徙策略使其能够根据问题的复杂性和搜索空间的特性动态调整搜索策略,从而在不同的优化问题中表现出良好的适应性。
参考文献:
[1]Ghasemi, M., Deriche, M., Trojovský, P., Mansor, Z., Zare, M., Trojovská, E., Abualigah, L.M., Ezugwu, A.E., & Mohammadi, S.K. (2025). An efficient bio-inspired algorithm based on humpback whale migration for constrained engineering optimization. Results in Engineering.
二、大规模多仓库多旅行商问题原理
大规模多仓库多旅行商问题(Large-Scale Multi-Depot Multi-Traveling Salesman Problem,LS-MDMTSP)是在经典旅行商问题(TSP)基础上拓展而来的复杂组合优化问题。以下是对该问题的原理介绍:
1. 问题定义
- 基本场景:存在多个仓库(起点/终点)和大量分散的客户节点,多支旅行商队伍分别从不同仓库出发,访问指定客户后返回原仓库。
- 核心目标:在满足所有客户被访问且仅被访问一次的约束下,最小化整体成本(如总行驶距离、时间、车辆使用成本等)或均衡各旅行商的工作量。
2. 核心要素
要素 | 描述 |
---|---|
多仓库 | 每个仓库作为旅行商的出发地和终点,不同仓库可能对应不同地理位置或资源限制。 |
多旅行商 | 多支队伍协同完成任务,每支队伍需从指定仓库出发并返回。 |
客户节点 | 所有客户必须被访问且仅被访问一次,形成闭合路径。 |
闭合路径约束 | 每个旅行商的路径必须从仓库出发,经过若干客户节点后返回原仓库。 |
优化目标 | 可灵活设定目标函数,例如最小化总成本、均衡各旅行商路径长度等。 |
3. 关键约束条件
- 单次访问:每个客户节点仅能被一个旅行商访问一次。
- 路径闭合性:旅行商的路径需形成闭合回路,起点与终点为同一仓库。
- 容量限制(可选):在实际应用中可能增加车辆容量、时间窗口等额外约束。
4. 与单仓库问题的区别
对比维度 | LS-MDMTSP(多仓库) | SD-MTSP(单仓库) |
---|---|---|
仓库数量 | 多个仓库,旅行商从不同仓库出发。 | 单一仓库,所有旅行商从同一仓库出发。 |
路径规划复杂度 | 需同时优化仓库分配和路径规划,复杂度更高。 | 仅需优化路径分配,复杂度相对较低。 |
适用场景 | 分布式物流中心、多区域配送等。 | 集中式配送中心、单一仓库覆盖全区域等。 |
5. 挑战与难点
- 组合爆炸:随着客户节点和仓库数量增加,解空间呈指数级增长,传统算法难以高效求解。
- 多目标优化:需平衡总成本、路径均衡性、仓库利用率等多目标。
- 动态适应性:在大规模场景下需应对实时数据更新(如新增客户或仓库变动)。
6. 典型应用场景
- 物流配送:多个配送中心向区域内的客户送货。
- 无人机巡检:多基站控制多无人机执行区域巡查任务。
- 交通调度:多站点共享车辆的资源分配与路线规划。
三、部分MATLAB代码及结果
figure
bar(path_length)
ylabel('路径长度')
set(gca,'xtick',1:1:m);
set(gca,'XTickLabel',salemans)
title(Name)
saveas(gca,[Name '-length.jpg']);
figure
semilogy(CurveLine,'LineWidth',2);
xlabel('迭代次数')
ylabel('总路径长度')
legend('')
title(Name)
saveas(gca,[Name '-curve.jpg']);
%% 显示结果
fprintf('数据集:%s\n',Name)
for j=1:length(saleman_path)
Kd=saleman_path{j};
fprintf('算法得到的路径%d:\n',j)
fprintf('具体路径信息:%d',Kd(1))
for i=2:length(Kd)
fprintf(' > %d',Kd(i));
end
fprintf(' 路径长度%f\n',path_length(j))
end
fprintf('算法求解得到的总路径长度:%f\n',sum(path_length));
数据集可以选择:
以数据集:tsp225为例
算法得到的路径1:
具体路径信息:59 > 58 > 57 > 51 > 207 > 49 > 133 > 199 > 191 > 205 > 189 > 190 > 225 > 47 > 2 > 59 路径长度195.000000
算法得到的路径2:
具体路径信息:192 > 196 > 48 > 45 > 193 > 218 > 194 > 195 > 46 > 44 > 52 > 55 > 56 > 50 > 224 > 192 路径长度318.000000
算法得到的路径3:
具体路径信息:197 > 198 > 200 > 1 > 3 > 5 > 7 > 8 > 41 > 53 > 54 > 42 > 43 > 6 > 4 > 197 路径长度513.000000
算法得到的路径4:
具体路径信息:9 > 10 > 18 > 19 > 203 > 20 > 17 > 16 > 12 > 11 > 38 > 39 > 74 > 70 > 40 > 9 路径长度564.000000
算法得到的路径5:
具体路径信息:15 > 21 > 22 > 23 > 24 > 36 > 31 > 75 > 71 > 72 > 76 > 32 > 37 > 13 > 14 > 15 路径长度504.000000
算法得到的路径6:
具体路径信息:73 > 216 > 206 > 35 > 33 > 34 > 208 > 25 > 26 > 204 > 29 > 30 > 202 > 217 > 219 > 73 路径长度326.000000
算法得到的路径7:
具体路径信息:77 > 78 > 97 > 98 > 100 > 69 > 99 > 96 > 95 > 209 > 221 > 81 > 80 > 79 > 28 > 77 路径长度363.000000
算法得到的路径8:
具体路径信息:93 > 101 > 102 > 91 > 92 > 90 > 87 > 210 > 131 > 86 > 85 > 84 > 82 > 83 > 94 > 93 路径长度300.000000
算法得到的路径9:
具体路径信息:211 > 130 > 89 > 103 > 104 > 220 > 88 > 128 > 164 > 135 > 134 > 215 > 132 > 129 > 222 > 211 路径长度388.000000
算法得到的路径10:
具体路径信息:183 > 136 > 137 > 138 > 139 > 140 > 161 > 162 > 166 > 127 > 105 > 165 > 213 > 158 > 163 > 183 路径长度422.000000
算法得到的路径11:
具体路径信息:160 > 159 > 141 > 142 > 201 > 143 > 144 > 157 > 156 > 155 > 154 > 151 > 106 > 126 > 167 > 160 路径长度446.000000
算法得到的路径12:
具体路径信息:214 > 152 > 153 > 146 > 145 > 147 > 148 > 149 > 150 > 168 > 125 > 109 > 108 > 107 > 212 > 214 路径长度345.000000
算法得到的路径13:
具体路径信息:169 > 124 > 67 > 65 > 110 > 123 > 171 > 174 > 180 > 179 > 178 > 177 > 176 > 172 > 170 > 169 路径长度499.000000
算法得到的路径14:
具体路径信息:173 > 122 > 121 > 111 > 112 > 66 > 64 > 114 > 113 > 175 > 120 > 185 > 184 > 182 > 181 > 173 路径长度373.000000
算法得到的路径15:
具体路径信息:119 > 186 > 187 > 117 > 188 > 27 > 60 > 61 > 68 > 63 > 62 > 116 > 223 > 115 > 118 > 119 路径长度322.000000
算法求解得到的总路径长度:5878.000000