【无人机】基于遗传算法混合粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较](Matlab代码实现)

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

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

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

💥1 概述

基于遗传算法混合粒子群算法的无人机路径规划研究及其与遗传算法、粒子群算法的比较分析

一、遗传算法(GA)与粒子群算法(PSO)的基本原理与特点
  1. 遗传算法(GA)
    • 基本原理:模拟生物进化过程,包括种群初始化、适应度评估、选择、交叉、变异等步骤。通过保留适应度高的个体并引入随机变异,逐步逼近全局最优解。
    • 核心操作
  • 交叉:通过交换染色体片段生成新个体,增强种群多样性。
  • 变异:随机改变基因编码,避免早熟收敛。
    • 特点
  • 优点:全局搜索能力强,适合复杂多峰优化问题。
  • 缺点:收敛速度慢,局部搜索能力弱,计算复杂度高。


2. 粒子群算法(PSO)

  • 基本原理:模拟鸟群觅食行为,通过个体与群体的历史最优位置调整粒子速度和方向。

  • 核心公式

  • 特点

  • 优点:收敛速度快,参数少,实时性强。

  • 缺点:易陷入局部最优,缺乏全局搜索能力。


二、混合遗传-粒子群算法的设计思路

混合算法旨在结合GA的全局搜索与PSO的局部搜索优势,常见设计包括:

  1. 串行混合:前期用GA进行广泛搜索,后期用PSO精细调整。
  2. 嵌入式混合:在PSO中嵌入GA的交叉和变异操作,增加种群多样性。
  3. 分层结构:底层用GA子群进行全局搜索,上层用PSO精英群进行局部优化。

实现案例

  • GA-APSO算法:在自适应混沌PSO中引入GA的交叉和变异,显著提升全局收敛性。
  • HGA-PSO算法:多子群分层结构,底层GA子群提供多样性,上层PSO精英群加速收敛。

三、无人机路径规划中的性能对比
  1. 收敛速度

    • PSO:由于信息单向流动和记忆机制,收敛速度最快。
    • GA:交叉和变异操作导致冗余迭代,收敛速度较慢。
    • 混合算法:结合PSO的快速收敛和GA的多样性,速度介于两者之间,但稳定性更高。
      实验数据:在无人机编队会合任务中,PSO平均迭代次数比GA减少30%,混合算法进一步缩短10%。
  2. 优化程度

    • PSO:局部搜索能力强,但在复杂地形中易漏掉全局最优解。
    • GA:全局搜索能力突出,但路径平滑性较差。
    • 混合算法:综合优势明显。例如,在三维路径规划中,混合算法生成的路径总威胁指数较PSO降低15%,路径长度较GA减少10%。
  3. 计算复杂度

    • GA:复杂度为 O(N⋅G⋅D)O(N⋅G⋅D)(NN为种群规模,GG为迭代次数,DD为解维度),适合离线规划。

    • PSO:复杂度 O(N⋅T)O(N⋅T)(TT为迭代次数),实时性更强。
    • 混合算法:复杂度略高于单一算法,但通过分层或并行设计可优化。例如,HGA-PSO在无人机多区域覆盖任务中,计算时间比纯GA减少40%。

四、典型应用案例对比
算法类型应用场景优势与局限案例来源
GA静态障碍物环境下的全局路径规划路径多样性高,但实时性差栅格地图路径规划
PSO动态威胁环境下的实时路径调整响应速度快,但路径易陷入局部最优动态雷达威胁规避
GA-PSO混合算法复杂三维环境下的多无人机协同任务兼顾全局最优与实时性,计算资源需求高多无人机编队会合

五、总结与展望
  1. 总结

    • GA更适合静态环境下的全局路径探索,PSO在动态环境中表现更优,而混合算法通过优势互补,在复杂任务中综合性能最佳。
    • 混合算法的核心挑战在于平衡计算效率与优化精度,需根据任务需求选择分层、嵌入式或并行策略。
  2. 未来方向

    • 多算法融合:结合蚁群算法、深度学习等进一步提升适应性。
    • 硬件加速:利用FPGA或GPU实现混合算法的并行计算。
    • 动态参数调整:设计自适应惯性权重和变异概率。

通过上述分析可见,混合遗传-粒子群算法在无人机路径规划中展现出更强的鲁棒性和适应性,为复杂环境下的任务执行提供了新的解决方案。

📚2 运行结果

部分代码:

%种群的适应度值
seeds_fitness=zeros(1,model.NP);
%全局最优
p_global.cost=inf;
%适应度最优值保留
best=zeros(model.MaxIt+1,1);
best(1)=model.globel.cost;
%种群初始化
for i=1:model.NP
    chromosome(i).pos=model.chromosome(i).pos;
    chromosome(i).alpha=model.chromosome(i).alpha;
    chromosome(i).beta=model.chromosome(i).beta;
    chromosome(i).atkalpha=model.chromosome(i).atkalpha;
    chromosome(i).atkbeta=model.chromosome(i).atkbeta;
    chromosome(i).T=model.chromosome(i).T;
    chromosome(i).sol=model.chromosome(i).sol;
    chromosome(i).cost=model.chromosome(i).cost;
    chromosome(i).IsFeasible=model.chromosome(i).IsFeasible;

    seeds_fitness(i)=model.seeds_fitness(i);
  for d=1:3
  chromosome(i).vel(d,:)= zeros(1,model.dim);
  end
  %更新历史最优粒子
  chromosome(i).best.pos =chromosome(i).pos;
  chromosome(i).best.alpha =chromosome(i).alpha;
  chromosome(i).best.beta =chromosome(i).beta;
  chromosome(i).best.T =chromosome(i).T;
  chromosome(i).best.sol =chromosome(i).sol;
  chromosome(i).best.cost =chromosome(i).cost;
  %更新全局最优例子
  if p_global.cost > chromosome(i).best.cost
    p_global = chromosome(i).best;
  end
  
end

for it=1:model.MaxIt
    %得到最大和平均适应度值
    model.f_max =max(seeds_fitness);
    model.f_avg =mean(seeds_fitness);
   %按照适应度对染色体排序
    sort_array =zeros(model.NP,2);
    for i=1:model.NP
    sort_array(i,:)= [i,chromosome(i).cost];
    end
    %以cost从小到大进行排序
    sort_array =sortrows(sort_array,2);
    model.p_global =p_global;
    %只保留前一半的染色体,后一般抛弃
    for i=1:model.NP/2
           
           next_chromosome(i) =chromosome(sort_array(i,1));
      
           %更新染色体的速度和位置
           [next_chromosome(i).vel,next_chromosome(i).alpha,next_chromosome(i).beta,next_chromosome(i).T]=Update_vel_pos( next_chromosome(i),model );
           [next_chromosome(i).pos]=Angel2Pos( next_chromosome(i),model );
           %检验坐标是否合理
           [flag(i),next_chromosome(i).atkalpha,next_chromosome(i).atkbeta] = IsReasonble(next_chromosome(i),model);
      
           %计算适应度值
           [next_chromosome(i).cost,next_chromosome(i).sol] = FitnessFunction(next_chromosome(i),model);
    end
    %对剩余的NP/2个染色体进行选择交叉变异操作
    for i=model.NP/2+1:2:model.NP
        %随机选择父母
        parents =repmat(my_chromosome,2,1);
        for p=1:2
        array =ceil(rand(1,2)*model.NP/2);
        if next_chromosome(array(1)).cost < next_chromosome(array(2)).cost
            parents(p) = next_chromosome(array(1));
        else
            parents(p) = next_chromosome(array(2));
        end
        end
        %交叉变异操作
        [ sons] = CrossoverAndMutation( parents,model );
        %符合要求以后计算子代的适应度值
        [sons(1).cost,sons(1).sol] = FitnessFunction(sons(1),model);
        [sons(2).cost,sons(2).sol] = FitnessFunction(sons(2),model);
        next_chromosome(i) = sons(1);
        next_chromosome(i+1) =sons(2);
    end
    for i=1:model.NP
       chromosome(i) =next_chromosome(i);
       %更新局部最优
       if chromosome(i).cost < chromosome(i).best.cost
              chromosome(i).best.pos =chromosome(i).pos;
              chromosome(i).best.alpha =chromosome(i).alpha;
              chromosome(i).best.beta =chromosome(i).beta;
              chromosome(i).best.T =chromosome(i).T;
              chromosome(i).best.sol =chromosome(i).sol;
              chromosome(i).best.cost =chromosome(i).cost;

🎉3 参考文献

文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。

[1]鞠宏浩,程楷钧,邓彩连,等.无人机空地网络研究综述[J/OL].西南交通大学学报:1-14[2024-04-16].http://kns.cnki.net/kcms/detail/51.1277.U.20240415.1013.004.html.

[2]薛斌,张志才,付芳.无人机辅助智能交通系统中面向视频多播的资源优化[J].测试技术学报,2024,38(02):194-202.

[3]李鹏娜.无人机路径规划方法研究及在油田巡井中的应用[D].东北石油大学[2024-04-17].DOI:CNKI:CDMD:2.1017.085318.

🌈4 Matlab代码实现

本框架提供了有关粒子群算法(PSO)遗传算法(GA)的完整实现,以及一套关于改进、应用、测试、结果输出的完整框架。 本框架对粒子群算法遗传算法进行逻辑解耦,对其中的改进点予以封装,进行模块化,使用者可以采取自己对该模块的改进替换默认实现组成新的改进算法与已有算法进行对比试验。试验结果基于Excel文件输出,并可通过设定不同的迭代结束方式选择试验数据的输出方式,包括: 1. 输出随迭代次数变化的平均达优率数据(设定终止条件区间大于0)。 2. 输出随迭代次数变化的平均最优值数据(设定终止条件区间等于0)。 本框架了包含了常用基准函数的实现以及遗传算法粒子群算法对其的求解方案实现对比,如TSP,01背包,Banana函数,Griewank函数等。并提供大量工具方法,如KMeans,随机序列生成与无效序列修补方法等等。 对遗传算法的二进制编码,整数编码,实数编码,整数序列编码(用于求解TSP等),粒子群算法的各种拓扑结构,以及两种算法的参数各种更新方式均有实现,并提供接口供使用者实现新的改进方式并整合入框架进行试验。 其中还包括对PSO进行离散化的支持接口,自己的设计一种离散PSO方法及其用以求解01背包问题的实现样例。 欢迎参考并提出宝贵意见,特别欢迎愿意协同更新修补代码的朋友(邮箱starffly@foxmail.com)代码已作为lakeast项目托管在Google Code: http://code.google.com/p/lakeast http://code.google.com/p/lakeast/downloads/list 某些类的功能说明: org.lakest.common中: BoundaryType定义了一个枚举,表示变量超出约束范围时为恢复到约束范围所采用的处理方式,分别是NONE(不处理),WRAP(加减若干整数个区间长度),BOUNCE(超出部分向区间内部折叠),STICK(取超出方向的最大限定值)。 Constraint定义了一个代表变量约束范围的类。 Functions定义了一系列基准函数的具体实现以供其他类统一调用。 InitializeException定义了一个代表程序初始化出现错误的异常类。 Randoms类的各个静态方法用以产生各种类型的随机数以及随机序列的快速产生。 Range类的实现了用以判断变量是否超出约束范围以及将超出约束范围的变量根据一定原则修补到约束范围的方法。 ToStringBuffer是一个将数组转换为其字符串表示的类。 org.lakeast.ga.skeleton中: AbstractChromosome定义了染色体的公共方法。 AbstractDomain是定义问题域有关的计算与参数的抽象类。 AbstractFactorGenerator定义产生交叉概率变异概率的共同方法。 BinaryChromosome是采用二进制编码的染色体的具体实现类。 ConstantFactorGenerator是一个把交叉概率变异概率定义为常量的参数产生器。 ConstraintSet用于在计算过程中保存获取应用问题的各个维度的约束。 Domain是遗传算法求解中所有问题域必须实现的接口。 EncodingType是一个表明染色体编码类型的枚举,包括BINARY(二进制),REAL(实数),INTEGER(整型)。 Factor是交叉概率变异概率的封装。 IFactorGenerator参数产生器的公共接口。 Population定义了染色体种群的行为,包括种群的迭代,轮盘赌选择交叉以及最优个体的保存。 org.lakeast.ga.chromosome中: BinaryChromosome二进制编码染色体实现。 IntegerChromosome整数编码染色体实现。 RealChromosome实数编码染色体实现。 SequenceIntegerChromosome整数序列染色体实现。 org.lakeast.pso.skeleton中: AbstractDomain提供一个接口,将粒子的位置向量解释到离散空间,同时不干扰粒子的更新方式。 AbstractFactorGenerator是PSO中参数产生器的公共抽象类。 AbstractParticle定义了PSO种群中粒子的基本行为,最主要是实现了如何根据现有位置计算得到下一代粒子的位置的合法值。 ConstraintSet用于在粒子迭代过程中保存获取应用问题的各个维度的约束。 AbstractSwarm.java各种拓扑结构的PSO种群的抽象父类,主要实现了种群迭代过程中计算流程的定义以及中间数据被如何输出到测试工具类。 Domain是PSO算法求解中所有问题域必须实现的接口。 DynamicFatorGenerator若种群在迭代过程中,w,c1,c2随迭代次数发生变化,那么它们的产生器需要继承这个抽象类。 Factor封装了w,c1,c2三个参数的字面值。 Location用于保存获取迭代中粒子的位置速度向量的数值。 NeighborhoodBestParticle定义了采用邻域版本的PSO算法的具体实现。主要是实现了如何根据邻域版本的PSO算法计算下一迭代中的粒子速度。 RingTopoSwarm定义环拓扑结构的具体实现,主要是定义了如何获取粒子的邻域粒子的方法。 StaticTopoSwarm静态拓扑结构的PSO算法的抽象父类。 org.lakeast.pso.swarm中包含粒子群拓扑结构的各种实现,基本见名知意。 对各种问题的求解样例位于org.lakeast.main包中,以...TaskTest结尾,基本见名知意。 以ShafferF6DomainTaskTes对ShafferF6函数进行求解(采用的是PSO,遗传算法样例参见TSPValueTaskTest)为例说明求解过程如下: 1. 入口函数位于org.lakeast.main.ShafferF6DomainTaskTest中,go函数执行。 2. 在go函数中,首先指定迭代次数(numberOfIterations),测试多少轮(testCount,多次运行以得到平均达优值),种群大小(popSize),邻域大小(neighborhoodSize),迭代结束条件(exitCondition,由于制定了迭代次数,所以设定为[0,0],也就是只有达到指定迭代次数才退出)。 3. 以testCount,numberOfIterations以及迭代结束条件exitCondition为参数构建TestBatch类的实例batch。这个类用来进行管理参与测试的各种具体算法,且把数据结果按指定的格式输出为Excel文件。 4. 指定PSO中的因子产生方法,采用ExponentFactorGeneratorConstrictFactorGenerator两种方式(实现位于org.lakeast.pso.gen包)。 5. Y表示参与测试的算法数目。 6. Testable是所有可以被TestBatch测试的类需要实现的接口,以提供TestBatch生成结果Excel文件所需要的数据。 7. Domain接口是所有可以被算法解决的问题所需要实现的接口,比如说明该问题所需要的粒子位置约束范围,速度约束范围,以及适值评估的公司等。这里的Domain被实例化为ShafferF6Domain,也就是按照ShafferF6函数评估适值。 8. RingTopoSwarm是用来封装环拓扑邻域结构的类,NeighboordBestParticle是配合该类来实现按邻域最优更新速度而不是全局最优来更新。 9. 各个测试算法都被加入到TestBatch以后,batch.run()开始执行算法比较过程并输出结果Excel文件到C盘根目录(输出路径可在Testable接口中配置,除了生成Excel文件外,还可以通过修改log4j.properties在制定的位置产生运行结果日志)。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值