• 多因素蚁群算法的移动机器人路径规划研究附Matlab代码


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

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

    🍊个人信条:格物致知。

    更多Matlab仿真内容点击👇

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

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

    ⛄ 内容介绍

    针对蚁群算法的特点,把蚁群算法应用到移动机器人的路径规划中,在Matlab中建立移动机器人仿真系统,运用格栅法创建移动机器人的工作环境,设置蚁群算法中的参数,运行程序得出了移动机器人的运动轨迹,得到了蚁群从起始点运动目标点的最优路径.仿真结果表明,蚁群算法能够准确得到移动机器人的最优路径,在移动机器人的路径规划中具有很好的实用性.

    ⛄ 部分代码

    function [routes,min_PL,min_NC,min_ant]=ACO(NC_max,m,n,D_move,s,position_e1,Tau,Alpha,Eta,Beta,Q,Rho)

    position_e=position_e1(1);%选择一个终点

    min_PL_NC_ant=inf;%%蚂蚁最短的行进距离

    min_ant=0;%%最短行进距离的蚂蚁坐标

    min_NC=0;%%最短行进距离的迭代次数

    % 计算邻接矩阵及启发因子%%邻接矩阵作用是计算启发因子

    z=1;

    %开始迭代

    routes=cell(NC_max,m);%%%%存储每次迭代每个蚂蚁的路径

    PL=zeros(NC_max,m); %%%%%存储每次迭代每个蚂蚁的路径长度

    NC=1;               %迭代计数器,记录迭代次数

    while NC<=NC_max

        NC

        for ant=1:m

            current_position=s;%%%当前位置为起始点

            path=s;%%路径初始化

            PL_NC_ant=0;%%长度初始化

            Tabu=ones(1,n*n);   %%%%禁忌表,排除已经走过的位置

            Tabu(s)=0;%%排除已经走过的初始点

            D_D=D_move;%%%%D_D是D_move的中间矩阵,作用是为了不让D_move参与计算,也可不用D_D矩阵,直接用D_move

            D_work=D_D(current_position,:);%%%把当前点可以前往的写一个节点的信息传送给D_work

            nonzeros_D_work=find(D_work);%%%找到不为0的元素的位置

            for i1=1:length(nonzeros_D_work)

                if Tabu(D_work(i1))==0

                    D_work(nonzeros_D_work(i1))=[];%%将禁忌表中已走过的元素删除,防止走已经走过的位置

                    D_work=[D_work,zeros(1,8-length(D_work))];%%%保证D_work向量长度为8(每个点最多能往周围的8个点走),为后面for循环做准备

                end

            end

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%排除走过的第一点(排除起点)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

            len_D_work=length(find(D_work));

            while current_position~=position_e&&len_D_work>=1%%当前点是否为终点或者走进死胡同

                p=zeros(1,len_D_work);

                for j1=1:len_D_work

                    [r1,c1]=position2rc(D_work(j1));%%利用自己编的函数把可以前进的点计算为行列表示

                    p(j1)=(Tau(r1,c1)^Alpha)*(Eta(r1,c1)^Beta);%%%%计算每个可以前往的节点的概率

                end

                p=p/sum(p);%%%归一化

                pcum=cumsum(p);%%%概率累加

                select=find(pcum>=rand);%%%%轮盘赌法选择下个节点

                to_visit=D_work(select(1));%%%前往下一个节点

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%到达下一个节点%%%%%%%%%%%%%%%%%%%%%%%%

                path=[path,to_visit];%%%路径累加

                dis=distance(current_position,to_visit);%%%计算到下个节点的距离

                PL_NC_ant=PL_NC_ant+dis;%%距离累加

                current_position=to_visit;%%%当前点设为前往点

                D_work=D_D(current_position,:);%%%%把当前节点可以前往的下一个节点的信息传给D_work

                Tabu(current_position)=0;%%%禁忌表中排除已经到的点

                for kk=1:400

                    if Tabu(kk)==0

                        for i3=1:8

                            if D_work(i3)==kk

                               D_work(i3)=[];%%%%排除禁忌表中已经走过的节点

                               D_work=[D_work,zeros(1,8-length(D_work))];%%保证长度为8

                            end

                        end

                    end

                end

                len_D_work=length(find(D_work));%%%计算当前点可以前往的下一个节点的数量

            end

            %%%%%%%%%%%%%%%%%%%%%%%%迭代一次所有蚂蚁走完%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

            routes{NC,ant}=path;%%%把蚂蚁走过的路径记录下来

            if path(end)==position_e

                z=z+1;

                PL(NC,ant)=PL_NC_ant;%%记录到达终点的蚂蚁的行进距离

                if PL_NC_ant

                    min_NC=NC;min_ant=ant;min_PL_NC_ant=PL_NC_ant;%%记录路径最短的蚂蚁的迭代次数和属于那一只

                end

            else

                PL(NC,ant)=0;

            end

        end

        delta_Tau=zeros(n,n);%%%信息素变量初始化

        for j3=1:m

            if PL(NC,ant)

                rout=routes{NC,ant};

                tiaoshu=length(rout)-1;%%%找出到达终点蚂蚁前进的次数

                value_PL=PL(NC,ant);%%%%%%到达终点蚂蚁的行进距离

                for u=1:tiaoshu

                    [r3,c3]=position2rc(rout(u+1));

                    delta_Tau(r3,c3)=delta_Tau(r3,c3)+Q/value_PL;%%%%计算信息素变量的值

                end

            end

        end

        Tau=(1-Rho).*Tau+delta_Tau;%%%%信息素更新

        NC=NC+1;

    end

    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%绘制收敛曲线%%%%%%%%%%%%%%%%%%%%%%%%%%%

    min_PL=ones(NC_max,1);

    for i=1:NC_max

        PL_1=PL(i,:);

        nonzero_PL_1=find(PL_1);%%%找到非零行进距离位置

        if isempty(nonzero_PL_1)

            min_PL(i)=min_PL(i-1);

        else

            min_PL(i)=min(PL_1(nonzero_PL_1));%%%找到第i次迭代中到达终点蚂蚁行进最短距离

        end

    end

    ⛄ 运行结果

    ​⛄ 参考文献

    [1]林伟民, 邓三鹏, 祁宇明,等. 基于蚁群算法的移动机器人路径规划研究[J]. 机械研究与应用, 2018(4):144-145.

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

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

     

  • 相关阅读:
    操作系统内存换入-请求调页---14
    电脑基础知识—————— 删除文件
    软件测试周刊(第78期):你对未来越有信心,你对现在越有耐心。
    通用/参考电路/ 连接备份
    漫谈 Java 平台上的反应式编程
    高通mm-camera_setting
    计算机操作系统笔记总结:Part1 计算机系统概述
    Hive-源码分析一条hql的执行过程
    迈向数字化发展新阶段,某商业银行数据存储创新方案及实践经验
    宝塔一键安装wordpress
  • 原文地址:https://blog.csdn.net/matlab_dingdang/article/details/127459433