【无人机三维路径规划】基于人工鱼群算法求解无人机三维航迹规划附matlab代码

文章介绍了使用人工鱼群算法进行无人机路径规划的方法。人工鱼是算法中的基本单位,其行为受环境影响并影响环境。算法通过觅食、聚群、追尾等行为避免局部最优,实现全局寻优。在路径规划中,结合障碍物检测,寻找最优路径。代码示例展示了算法的实现过程。
摘要由CSDN通过智能技术生成

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信       无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机 

⛄ 内容介绍

一种基于人工鱼群的无人机路径规划方法.

一、 人工鱼的结构模型

人工鱼是真实鱼抽象化、虚拟化的一个实体,其中封装了自身数据和一系列行为,可以接受环境的刺激信息,做出相应的活动。其所在的环境由问题的解空间和其他人工鱼的状态,它在下一时刻的行为取决于自身的状态和环境的状态,并且它还通过自身的活动来影响环境,进而影响其他人工鱼的活动。

 图片

二、 人工鱼群算法的寻优原理

人工鱼群算法在寻优的过程中,可能会集结在几个局部最优解的周围,使人工鱼跳出局部最优解,实现全局寻优的因素主要有:

  • 觅食行为中重复次数较少时,为人工鱼提供了随机移动的机会,从而可能跳出局部最优解;

  • 随机步长使得人工鱼在前往局部最优解的途中,有可能转向全局最优解;

  • 拥挤度因子 δδ 限制了聚群的规模,使得人工鱼能够更广泛的寻优;

  • 聚群行为能够促使少出陷于局部最优解的人工鱼趋向全局最优解的人工鱼方向聚集,从而逃出局部最优解;

  • 追尾行为加快了人工鱼向更优状态游动。

三、 人工鱼群算法实现的步骤

  1. 初始化设置,包括种群规模N、每条人工鱼的初始位置、人工鱼的视野Visual、步长step、拥挤度因子δ、重复次数Trynumber;

  2. 计算初始鱼群各个体的适应值,取最优人工鱼状态及其值赋予给公告牌;

  3. 对每个个体进行评价,对其要执行的行为进行选择,包括觅食Pray、聚群Swarm、追尾Follow和评价行为bulletin;

  4. 执行人工鱼的行为,更新自己,生成新鱼群;

  5. 评价所有个体。若某个体优于公告牌,则将公告牌更新为该个体;

  6. 当公告牌上最优解达到满意误差界内或者达到迭代次数上限时算法结束,否则转步骤3。

四、人工鱼群算法实现流程图

图片

⛄ 部分代码

    pointNum,visual,startPos,goalPos,try_number,delta,step,X,Y,Z)

N = length(fishs);

% 确定视野范围内的伙伴数目与中心位置

for i = 1:pointNum

    % 初始化感知范围内的位置变量和鱼数量

    pos_sum = [0 0 0];

    n_swarm = 0;

    

    % 依次遍历

    for j = 1:N

        % 计算第j只鱼与本鱼的距离

        dx = fish.pos.x(i) - fishs(j).pos.x(i);

        dy = fish.pos.y(i) - fishs(j).pos.y(i);

        dz = fish.pos.z(i) - fishs(j).pos.z(i);

        dist = sqrt(dx^2 + dy^2 + dz^2);

        

        % 判断是否位于感知范围内

        if dist < visual

            n_swarm = n_swarm+1;  % 统计在感知范围内的鱼数量

            pos_sum = pos_sum + ...

                [fishs(j).pos.x(i), fishs(j).pos.y(i), fishs(j).pos.z(i)];

        end

    end

    

    % 计算其他伙伴的中心位置,并减掉自身的位置

    pos_sum = pos_sum -[fish.pos.x(i),fish.pos.y(i),fish.pos.z(i)];

    n_swarm = n_swarm - 1;

    centerPos = pos_sum / n_swarm;

    

    % 对于第i个维度的控制点,赋值

    pos_c.x(i) = centerPos(1);

    pos_c.y(i) = centerPos(2);

    pos_c.z(i) = centerPos(3);

end

% 判断中心位置是否拥挤

[fitness_c,~] = calFitness(startPos, goalPos, pos_c);

if  fitness_c/n_swarm < delta*fish.fitness  && fitness_c < fish.fitness

    % 群聚行为:伙伴中心位置状态较优,向此方向群聚

    for i = 1:pointNum

        direction = [pos_c.x(i)-fish.pos.x(i), pos_c.y(i)-fish.pos.y(i), ...

            pos_c.z(i)-fish.pos.z(i)];

        centerPos = [fish.pos.x(i),fish.pos.y(i),fish.pos.z(i)] + ...

            rand*step*direction/norm(direction);

        pos_swarm.x(i) = centerPos(1);

        pos_swarm.y(i) = centerPos(2);

        pos_swarm.z(i) = centerPos(3);

    end

    

    % 计算适应度

    [fitness_swarm,path_swarm] = calFitness(startPos, goalPos,pos_swarm);

    

    % 碰撞检测判断

    flag = judgeObs(path_swarm,X,Y,Z);

    if flag == 1

        % 若flag=1,表明此路径将与障碍物相交,则增大适应度值

        fitness_swarm = 1000*fitness_swarm;

    end

else

    

    % 觅食行为

    label_prey = 0;             % 用于判断觅食行为是否找到优于当前的状态

    for i = 1:try_number

        % 随机搜索一个状态

        pos_rand.x = fish.pos.x + visual*(-1 + rand*2);

        pos_rand.y = fish.pos.y + visual*(-1 + rand*2);

        pos_rand.z = fish.pos.z + visual*(-1 + rand*2);

        [fitness_rand,~] = calFitness(startPos, goalPos, pos_rand);

        

        % 判断搜索到的状态是否比原来的好

        if fitness_rand < fish.fitness

            for j = 1:pointNum

                direction = [pos_rand.x(j) - fish.pos.x(j), pos_rand.y(j)-fish.pos.y(j), ...

                    pos_rand.z(j) - fish.pos.z(j)];

                centerPos = [fish.pos.x(j),fish.pos.y(j),fish.pos.z(j)] + ...

                    rand*step*direction/norm(direction);

                pos_swarm.x(j) = centerPos(1);

                pos_swarm.y(j) = centerPos(2);

                pos_swarm.z(j) = centerPos(3);

            end

            % 计算适应度

            [fitness_swarm,path_swarm] = calFitness(startPos, goalPos,pos_swarm);

            

            % 碰撞检测判断

            flag = judgeObs(path_swarm,X,Y,Z);

            if flag == 1

                % 若flag=1,表明此路径将与障碍物相交,则增大适应度值

                fitness_swarm = 1000*fitness_swarm;

            end

            label_prey = 1;

            break

        end

    end

    

    % 随机行为

    if label_prey == 0

        % 随机搜索一个状态

        pos_swarm.x = fish.pos.x + step *(-1 + rand*2);

        pos_swarm.y = fish.pos.y + step *(-1 + rand*2);

        pos_swarm.z = fish.pos.z + step *(-1 + rand*2);

        [fitness_swarm,path_swarm] = calFitness(startPos, goalPos,pos_swarm);

        

        % 碰撞检测判断

        flag = judgeObs(path_swarm,X,Y,Z);

        if flag == 1

            % 若flag=1,表明此路径将与障碍物相交,则增大适应度值

            fitness_swarm = 1000*fitness_swarm;

        end

    end

end

⛄ 运行结果

⛄ 参考文献

[1]许江波, 刘琳岚. 基于改进人工鱼群算法的无人机三维航迹规划[J]. 计算机工程与设计, 2019, 40(2):5.

[2]曹学玉, 邱毅, 王会芳. 一种基于人工鱼群的无人机路径规划方法:, CN112650287A[P]. 2021.

⛄ 完整代码

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matlab科研助手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值