基于改进遗传算法的卡车和两架无人机旅行推销员问题(D2TSP)(Matlab代码实现)

 👨‍🎓个人主页:研学社的博客 

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

🎉3 参考文献

 🌈4 Matlab代码实现


💥1 概述

 本文为解决卡车和两个无人机旅行推销员的问题,表示为串联团队,无人机提供最后一英里的努力。使用遗传算法(路由突变)来解决问题。该问题可以解决随机生成坐标的100个城市的D2TSP。该解决方案基于最小化时间而不是距离。最短时间计算基于卡车或无人机在操作中交付的最长时间。操作表示为无人机(或两者)发射、发送交付然后在会合位置恢复的节点或停靠点。每架无人机都受到航程和容量的限制。因此,操作中的停靠范围和停靠次数受到无人机约束的限制。

旅行推销员问题(Travelling Salesman Problem, TSP)是一个经典的组合优化问题,目标是找到最短的可能路线,让旅行者访问每个城市恰好一次并返回起点。D2TSP则是这一问题的一个变体,它引入了无人机来辅助解决传统TSP中的效率和成本问题。在D2TSP中,考虑的不仅是卡车(或称为主载体)的行驶路径,还包括一到多架无人机的飞行路径,使得某些点由无人机快速访问,而主载体则继续其路径,最终所有访问完成且无人机返回主载体。

基于改进遗传算法的D2TSP研究主要集中在如何有效设计遗传算法以求解这种复杂问题,旨在通过模拟自然选择和遗传机制来搜索最优解。改进遗传算法通常包括以下几个方面:

  1. 编码方式:传统的TSP问题可以通过排列编码表示访问城市的顺序,而在D2TSP中,需要设计更复杂的编码方式来同时表示卡车和无人机的行程。一种可能的方法是对卡车和每架无人机的路径分别进行编码,或者使用混合编码策略,如将卡车和无人机的决策点整合进一个统一的解决方案表示中。

  2. 适应度函数:定义合适的适应度函数至关重要,因为它决定了算法评估解的质量。在D2TSP中,适应度函数不仅要考虑总行程距离,还要考虑无人机的飞行限制(如续航能力、起飞和降落费用)、货物分配以及主载体与无人机之间的协同工作策略。

  3. 遗传算子:为了提高搜索效率和避免早熟收敛,可以对遗传算法的基本算子(选择、交叉、变异)进行改进或创新。例如,引入局部搜索策略来优化解的局部结构,使用多点交叉或自适应交叉率来保持多样性,以及设计针对D2TSP特点的特定变异操作。

  4. 多目标优化:实际应用中,D2TSP可能涉及多个相互冲突的目标(如最小化总成本、最大化服务效率等)。因此,可以采用多目标遗传算法或多目标优化策略,寻找帕累托最优解集。

  5. 并行计算和分布式处理:鉴于D2TSP的复杂性,利用并行计算资源可以加速搜索过程。这包括使用分布式遗传算法,在不同节点上独立运行算法,然后交换信息以促进全局搜索。

  6. 无人机调度策略:特别地,研究还应关注如何高效调度无人机,如确定无人机的最佳起降点、任务分配及路径规划,确保无人机的高效利用并减少主载体等待时间。

综上所述,基于改进遗传算法的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. 

 🌈4 Matlab代码实现

  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值