m基于蚁群优化模糊控制的机器人路线规划和避障算法matlab仿真

简介: m基于蚁群优化模糊控制的机器人路线规划和避障算法matlab仿真

1.算法描述

   蚁群算法是受到对真实蚂蚁群觅食行为研究的启发而提出。生物学研究表明:一群相互协作的蚂蚁能够找到食物和巢穴之间的最短路径,而单只蚂蚁则不能。生物学家经过大量细致观察研究发现,蚂蚁个体之间的行为是相互作用相互影响的。蚂蚁在运动过程中,能够在它所经过的路径上留下一种称之为信息素的物质,而此物质恰恰是蚂蚁个体之间信息传递交流的载体。蚂蚁在运动时能够感知这种物质,并且习惯于追踪此物质爬行,当然爬行过程中还会释放信息素。一条路上的信息素踪迹越浓,其它蚂蚁将以越高的概率跟随爬行此路径,从而该路径上的信息素踪迹会被加强,因此,由大量蚂蚁组成的蚁群的集体行为便表现出一种信息正反馈现象。某一路径上走过的蚂蚁越多,则后来者选择该路径的可能性就越大。蚂蚁个体之间就是通过这种间接的通信机制实现协同搜索最短路径的目标的。

   蚁群算法是对自然界蚂蚁的寻径方式进行模拟而得出的一种仿生算法。蚂蚁在运动过程中,能够在它所经过的路径上留下信息素进行信息传递,而且蚂蚁在运动过程中能够感知这种物质,并以此来指导自己的运动方向。因此,由大量蚂蚁组成的蚁群的集体行为便表现出一种信息正反馈现象:某一路径上走过的蚂蚁越多,则后来者选择该路径的概率就越大。

2.仿真效果预览
matlab2022a仿真结果如下:

1.png
2.png

3.MATLAB核心程序

%产生障碍物模型
[Obstacle1,Obstacle2] = func_obstacle();
 
%%
%蚁群算法初始化
Initial_matrix = size(Obstacle1,1);      
%保留觅食活动中有残留的信息素
Res_pher       = 8*ones(Initial_matrix*Initial_matrix,Initial_matrix*Initial_matrix);
%迭代次数
Max_iter       = 100;    
%蚂蚁个数
Number         = 60;    
%起点
Start_point    = 1 ; 
%终点
End_point      = Initial_matrix*Initial_matrix;
%信息素重要性参数
Importance     = 1;      
%启发式因子重要性参数
Importance2    = 4;     
%蚂蚁信息素挥发系数
Rho            = 0.2;     
%信息素增加强度系数
Enhance_Q      = 1;           
minkl          = 1e50;
mink           = 0;
minl           = 0;
%障碍物搜搜
D              = func_search(Obstacle1);
%障碍物大小
N              = size(D,1); 
%小方格象素的边长
Lens           = 1;
 
%终点坐标
Ex             = Lens*(mod(End_point,Initial_matrix)-0.5);
if Ex == -0.5
   Ex = Initial_matrix-0.5;
end
Ey = Lens*(Initial_matrix+0.5-ceil(End_point/Initial_matrix));
 
%蚁群算法构造初始化信息
Eta    = func_Heuristic_matrix(Initial_matrix,Ex,Ey,End_point,N,Lens);
%爬行路线
Routes = cell(Max_iter,Number);
%每只蚂蚁的爬行路线长度
RLen   = zeros(Max_iter,Number);
 
 
%%
%开始算法
for i1=1:Max_iter
    i1
    for i2=1:Number
        %初始化模糊控制器
        %模糊控制器的输入为蚁群算法的迭代误差
        if i1==1
           error = 1; 
        else
           error = mean(mean(Res_pher)); 
        end
        %将误差输入到模糊控制器
        controller = func_fuzzy(error);
 
        %状态初始化
        %初始为起始点
        Wpoint   = Start_point;
        %路线初始化
        Wpath    = Start_point;
        %长度初始化
        Wlen    = 0;
        %禁忌表初始化
        Wtl     = ones(N);
        %已经在初始点了,因此要排除
        Wtl(Start_point) = 0;
        %邻接矩阵初始化
        Nmatrix = D;
        %蚂蚁搜索行走 
        dworks   = Nmatrix(Wpoint,:);
        dworks1  = find(dworks);
        for j=1:length(dworks1)
            if Wtl(dworks1(j))==0
               dworks(dworks1(j))=0;
            end
        end
        %蚂蚁行走过的节点
        LJD     = find(dworks);
        Len_LJD = length(LJD);
 
        %觅食条件
        while(Wpoint ~= End_point && Len_LJD >= 1)
            %转轮赌法
            PP=zeros(Len_LJD);
            for i=1:Len_LJD
                PP(i) = (Res_pher(Wpoint,LJD(i))^Importance)*((Eta(LJD(i)))^(Importance2+0.01/controller));
            end
            %概率分布
            sumpp   = sum(PP);
            PP      = PP/sumpp;
            Pcum(1) = PP(1);
            for i=2:Len_LJD
                Pcum(i) = Pcum(i-1) + PP(i);
            end
            %产生模拟超声波
            %设备发送超声波出去,产生超声波脉冲
            op_seq  = pnseq(6,[1 0 1 1 0 0],[1 0 1 0 0 1]);
            %发送超声波脉冲
            op_seq2 = 2*[rand(size(op_seq)),rand(size(op_seq)),rand(size(op_seq)),rand(size(op_seq)),rand(size(op_seq)),op_seq,rand(size(op_seq)),rand(size(op_seq))]-1;
            %如果感知前方没有障碍物,则进行下一个点运动,Pcum用来模拟传感器的接收信号      
            %根据接收到的信号分析是否前方有障碍物
            op_seq3 = awgn(op_seq2,10+20*randn,'measured');  
            %根据接收到的超声波反射信号计算峰值
            dout    = func_peak(op_seq3,op_seq);
            %根据接收到的信号获得方向,即select。
            %判断是否有回收信号峰值
            flag    = 0;
            [Vmax,Imax] = max(dout);
            if Vmax > mean(abs(dout));
               flag = 1;%说明检测到回声波,则说明有障碍物,则调整角度
            end
            if flag == 1
               Select   = find(Pcum>=rand);
               %需要调整角度
               to_visit = LJD(Select(1));
            else
               to_visit = LJD(1);
            end
            
            %状态更新和记录
            %路径增加
            Wpath    =[Wpath,to_visit];
            %路径长度增加
            Wlen     = Wlen+Nmatrix(Wpoint,to_visit);
            
            %蚂蚁移到下一个节点
            Wpoint   = to_visit;
            for kk=1:N
               if Wtl(kk)==0
                  Nmatrix(Wpoint,kk) = 0;
                  Nmatrix(kk,Wpoint) = 0;
               end
            end
            %已访问过的节点从禁忌表中删除
            Wtl(Wpoint) = 0;
            dworks      = Nmatrix(Wpoint,:);
            dworks1     = find(dworks);
            for j=1:length(dworks1)
                if Wtl(dworks1(j))==0
                   dworks(j)=0;
                end
            end
            LJD     = find(dworks);
            %可选节点的个数
            Len_LJD = length(LJD);
        end
        %记下每代每只蚂蚁的觅食路线和路线长度
        Routes{i1,i2} = Wpath;
        if Wpath(end)==End_point
           RLen(i1,i2)=Wlen;
           if Wlen < minkl
              mink = i1;
              minl = i2;
              minkl= Wlen;
           end
        else
          RLen(i1,i2)=0;
        end
    end
    %第六步:更新信息素
    Delta_Tau = zeros(N,N);%更新量初始化
    for i2 = 1:Number
        if RLen(i1,i2)
           ROUT  = Routes{i1,i2};
           TS    = length(ROUT)-1;%跳数
           PL_km = RLen(i1,i2);
           for s=1:TS
               x              = ROUT(s);
               y              = ROUT(s+1);
               Delta_Tau(x,y) = Delta_Tau(x,y)+Enhance_Q/PL_km;
               Delta_Tau(y,x) = Delta_Tau(y,x)+Enhance_Q/PL_km;
           end
        end
    end
    
    %改进算法,Delta_Tau计算方法的改进。
    if sum(sum(Delta_Tau)) > 10;
       Res_pher =(1-Rho).*Res_pher+Rho*Delta_Tau;%信息素挥发一部分,新增加一部分
    else
       Res_pher =(1-Rho).*Res_pher;%信息素挥发一部分,新增加一部分 
    end
    
    PLK      = RLen(i1,:);
    minPL(i1)= mean(PLK(find(PLK)))-1;
     
end
 
 
figure
plot(minPL);
grid on
title('收敛曲线');
xlabel('迭代次数');
ylabel('路径长度');
 
 
%绘爬行图
figure
func_lines(Obstacle2,Routes,Initial_matrix,mink,minl,Lens);
axis([0,20,0,20]); 
%显示模糊规则表
fuzzy; 
02_030m
相关文章
|
4天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
5天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
5天前
|
机器学习/深度学习 算法 芯片
基于GSP工具箱的NILM算法matlab仿真
基于GSP工具箱的NILM算法Matlab仿真,利用图信号处理技术解析家庭或建筑内各电器的独立功耗。GSPBox通过图的节点、边和权重矩阵表示电气系统,实现对未知数据的有效分类。系统使用MATLAB2022a版本,通过滤波或分解技术从全局能耗信号中提取子设备的功耗信息。
|
5天前
|
机器学习/深度学习 算法 5G
基于MIMO系统的SDR-AltMin混合预编码算法matlab性能仿真
基于MIMO系统的SDR-AltMin混合预编码算法通过结合半定松弛和交替最小化技术,优化大规模MIMO系统的预编码矩阵,提高信号质量。Matlab 2022a仿真结果显示,该算法能有效提升系统性能并降低计算复杂度。核心程序包括预编码和接收矩阵的设计,以及不同信噪比下的性能评估。
22 3
|
3月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
191 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
3月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
122 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
3月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
88 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
6月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)
|
6月前
|
算法 调度
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)