👨🎓个人主页:研学社的博客
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
💥1 概述
本文为解决卡车和两个无人机旅行推销员的问题,表示为串联团队,无人机提供最后一英里的努力。使用遗传算法(路由突变)来解决问题。该问题可以解决随机生成坐标的100个城市的D2TSP。该解决方案基于最小化时间而不是距离。最短时间计算基于卡车或无人机在操作中交付的最长时间。操作表示为无人机(或两者)发射、发送交付然后在会合位置恢复的节点或停靠点。每架无人机都受到航程和容量的限制。因此,操作中的停靠范围和停靠次数受到无人机约束的限制。
旅行推销员问题(Travelling Salesman Problem, TSP)是一个经典的组合优化问题,目标是找到最短的可能路线,让旅行者访问每个城市恰好一次并返回起点。D2TSP则是这一问题的一个变体,它引入了无人机来辅助解决传统TSP中的效率和成本问题。在D2TSP中,考虑的不仅是卡车(或称为主载体)的行驶路径,还包括一到多架无人机的飞行路径,使得某些点由无人机快速访问,而主载体则继续其路径,最终所有访问完成且无人机返回主载体。
基于改进遗传算法的D2TSP研究主要集中在如何有效设计遗传算法以求解这种复杂问题,旨在通过模拟自然选择和遗传机制来搜索最优解。改进遗传算法通常包括以下几个方面:
-
编码方式:传统的TSP问题可以通过排列编码表示访问城市的顺序,而在D2TSP中,需要设计更复杂的编码方式来同时表示卡车和无人机的行程。一种可能的方法是对卡车和每架无人机的路径分别进行编码,或者使用混合编码策略,如将卡车和无人机的决策点整合进一个统一的解决方案表示中。
-
适应度函数:定义合适的适应度函数至关重要,因为它决定了算法评估解的质量。在D2TSP中,适应度函数不仅要考虑总行程距离,还要考虑无人机的飞行限制(如续航能力、起飞和降落费用)、货物分配以及主载体与无人机之间的协同工作策略。
-
遗传算子:为了提高搜索效率和避免早熟收敛,可以对遗传算法的基本算子(选择、交叉、变异)进行改进或创新。例如,引入局部搜索策略来优化解的局部结构,使用多点交叉或自适应交叉率来保持多样性,以及设计针对D2TSP特点的特定变异操作。
-
多目标优化:实际应用中,D2TSP可能涉及多个相互冲突的目标(如最小化总成本、最大化服务效率等)。因此,可以采用多目标遗传算法或多目标优化策略,寻找帕累托最优解集。
-
并行计算和分布式处理:鉴于D2TSP的复杂性,利用并行计算资源可以加速搜索过程。这包括使用分布式遗传算法,在不同节点上独立运行算法,然后交换信息以促进全局搜索。
-
无人机调度策略:特别地,研究还应关注如何高效调度无人机,如确定无人机的最佳起降点、任务分配及路径规划,确保无人机的高效利用并减少主载体等待时间。
综上所述,基于改进遗传算法的D2TSP研究不仅要求深入理解遗传算法原理及其优化技术,还需要对D2TSP特有的挑战有清晰的认识,通过不断实验和调整算法参数,以达到解决问题的目的。随着无人机技术和算法的不断进步,这一领域的研究成果有望为物流配送、紧急救援等多个领域提供更加高效、经济的解决方案。
📚2 运行结果
部分代码:
% Sanity Checks
popSize = max(12,12*ceil(popSize(1)/12));
numIter = max(1,round(real(numIter(1))));
showProg = logical(showProg(1));
showResult = logical(showResult(1));
showWaitbar = logical(showWaitbar(1));
% Initialize the Populations
popRoute = zeros(popSize,n); %routes
popTrk = zeros(popSize,n); %truck route
popDrn = zeros(popSize,n); %drone route
popDrn2 = zeros(popSize,n); %drone 2 route
popOps = zeros(popSize,n); %operations drone 1
popRoute(1,:) = (1:n);
rp =popRoute(1,:);
%[rp, optr, oppr, opdr] = map_cir2(rp) ;
[rp, optr, oppr, opdr, opdr2] = map_cir2(rp);
popRoute(1,:) = map_cir( rp);
popTrk(1,:) = optr;
popDrn(1,:) = opdr;
popDrn2(1,:) = opdr2;
popOps(1,:) = oppr;
for k = 2:popSize
[op, tr, dr, dr2] = rand_ops_d_o();
% op=oppr; tr=optr; dr=opdr; dr2=opdr2;
popRoute(k,:) = randperm(n);
if mod(k,2)==0 % swap
r = sort([randi(n) randi(n)]);
r1=r(1); r2=r(2);
popRoute(k,:)= popRoute(1,:);
popRoute(k,[r1 r2]) = popRoute(k,[r2 r1]);
elseif mod(k,3)==0 % flip
r = sort([randi(n) randi(n)]);
r1=r(1); r2=r(2);
popRoute(k,:)= popRoute(1,:);
popRoute(k,r1:r2) = popRoute(k,r2:-1:r1);
elseif mod(k,4)==0% swap, flip
r = sort([randi(n) randi(n)]);
r1=r(1); r2=r(2);
popRoute(k,:)= popRoute(1,:);
popRoute(k,[r1 r2]) = popRoute(k,[r2 r1]);
popRoute(k,r1:r2) = popRoute(k,r2:-1:r1);
else
r = sort([randi(n) randi(n)]);
r1=r(1); r2=r(2);
popRoute(k,:)= popRoute(1,:);
popRoute(k,[r1 r2]) = popRoute(k,[r2 r1]);
% popRoute(k,r1:r2) = popRoute(k,r2:-1:r1);
end
popTrk(k,:) = tr;
popOps(k,:) = op;
popDrn(k,:) = dr;
popDrn2(k,:) = dr2;
end
% Run the GA
globalMin = Inf;
totalDist = zeros(1,popSize);
totalTime = zeros(1,popSize); % total time for route
totalEnergy = zeros(1,popSize); % total energy for route
totalCost = zeros(1,popSize); % cost of route
totalCostkm = zeros(1,popSize);
totalCosthr = zeros(1,popSize);
totalEnergyP = zeros(1,popSize);
distHistory = zeros(1,numIter);
timeHistory = zeros(1,numIter);
energyHistory= zeros(1,numIter);
costHistory = zeros(1,numIter);
costkmHistory= zeros(1,numIter);
costhrHistory= zeros(1,numIter);
tmpPopRoute = zeros(12,n);
tmpPopTrks = zeros(12,n);
tmpPopOps = zeros(12,n);
tmpPopDrns = zeros(12,n);
tmpPopDrns2 = zeros(12,n);
newPopRoute = zeros(popSize,n);
newPopTrks = zeros(popSize,n);
newPopOps = zeros(popSize,n);
newPopDrns = zeros(popSize,n);
newPopDrns2 = zeros(popSize,n);
🎉3 参考文献
部分理论来源于网络,如有侵权请联系删除。
[1]黄书召,田军委,乔路,王沁,苏宇.基于改进遗传算法的无人机路径规划[J.计算机应用,2021,41(02):390-397.