多因素蚁群算法的移动机器人路径规划研究附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

⛄ 运行结果

多因素蚁群算法的移动机器人路径规划研究附Matlab代码_第1张图片

​⛄ 参考文献

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

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

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

 

你可能感兴趣的:(路径规划,matlab,算法,开发语言)