基于麻雀搜索算法机器人寻路(文末附代码)


一、车间调度问题

路径规划是指移动机器人在空间环境中自主寻找一条最优的无障碍路径。当移动机器人可以获取到周围环境中所有障碍物的完整信息时,这样的路径规划被分类为全局路径规划。反之,如果机器人只能获取到局部的、不完整的障碍物信息,那么这样的路径规划则被归为局部路径规划。在目前的研究中,全局路径规划常用的算法包括A算法、Dikstra算法、D算法等算法。而局部路径规划则主要依赖于动态窗口法以及人工势场法等手段来实现。

二、麻雀搜索算法

1.算法介绍

麻雀搜索算法是近两年提出的新兴群智能优化算法,具备算法原理简单、收敛速度快等优势。该算法基于麻雀种群的社会行为将麻雀个体分为发现、加入者以及警戒者,发现者能力较强可以找到食物并为同类指明方向,公式为:
在这里插入图片描述
式中:t和T分别为算法当前以及最大更新次数,∝为随机数,其取值范围为1,1;Q同样为随机数,但服从正态分布;L为所有元素都是1的行短阵,其列数由待求解问题维度确定;R2为大于0小于1的预警值,ST为大于0.5小于1的安全值。

加入者则通过观察发现者的食物来源以便取而代之,公式为:
在这里插入图片描述
式中:Xp(t+1)为所有发现者中位置更新后的最佳位置;A+ = AT(AAT)-1其中,A为所有元素随机取值为1或-1的行矩阵,列数为求解问题维度;Xworst为当前种群中的最劣位置;n为种群中麻雀数量.
警戒者需要时刻留意当前环境,以便发现危险立即飞往安全环境。位置更新公式为:
在这里插入图片描述
式中:Xbest为当前种群中的最佳位置;β为随机数且遵循标准正态分布;fi, fg, fw分别为目前个体、当前种群最优、最劣的适应度值;k在-1,1范围内随机取值,E的作用是防止分母为0.

2.部分代码

代码如下(示例):

clear all 
clc

rng('default');
global i_func;
%% 载入数据
MAP=[0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 0
    0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1 0 0 0
    0 1 1 0 0 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0
    0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1
    0 1 1 0 0 1 1 1 1 0 0 0 0 1 1 0 0 0 0 0
    0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 1
    0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0
    0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0
    1 1 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 1 1
    0 1 1 1 0 0 1 0 0 0 1 0 0 1 1 0 0 1 0 0
    0 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 1 1 1
    0 0 1 0 1 0 0 0 1 0 1 0 1 1 0 0 0 0 0 1
    0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0
    1 1 1 0 1 1 0 0 1 0 0 0 1 1 0 0 0 0 1 0
    1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0
    0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
    1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1
    1 1 0 0 1 0 0 1 1 0 0 1 1 0 1 0 0 0 1 0
    0 0 0 0 1 1 0 1 1 1 0 1 1 1 1 0 0 0 0 0
    0 0 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0];
L = bwlabel(MAP);   % 对连通区域进行标记
landmark=[];
for i=1:max(max(L))
    [p1,p2]=find(L==i);
    temp=MAP*0;
    for j=1:length(p1)
        temp(p1(j),p2(j))=1;
    end
    D=bwdist(temp');
    [n,m]=find((1<D)&(D<2));
    landmark=[landmark;n,m];
end
figure
%%给值是1的坐标赋值黑色,给值是0的坐标赋值白色
b =MAP; %把MAP赋值给b
b(end+1,end+1) = 0;
colormap([1 1 1;0 0 0]);  % 创建颜色:其中1是白色,0是黑色
pcolor(0.5:size(MAP,2)+0.5,0.5:size(MAP,1)+0.5,b); % 赋予栅格颜色
set(gca,'XTick',1:size(MAP,1),'YTick',1:size(MAP,2));  % 设置坐标
axis image xy;
hold on
plot(landmark(:,1),landmark(:,2),'b+');
%% 画图

%%
data.landmark=landmark;
data.map=MAP;
sizeMap=size(MAP);
node=[];
for i=1:sizeMap(1)
    for j=1:sizeMap(2)
        x=i;
        y=j;
        if MAP(i,j)==0
            node=[node;y,x];
        end
    end
end
data.node=node;
data.D=pdist2(node,node);
data.R=1;%只允许上下行走
% data.R=sqrt(2); %可以斜着走

[p1,p2]=find(data.D<=data.R);
clear D
for i=1:length(p1)
    D(i,1)=data.D(p1(i),p2(i));
end
data.net=sparse(p1,p2,D);
for i=1:length(data.landmark(:,1))
    data.noLM(i)=find(node(:,1)==data.landmark(i,1) & node(:,2)==data.landmark(i,2));
end
%% 起点和终点
data.S=[1,1];
data.E=[20,20];
data.noS=find(node(:,1)==data.S(1,1) & node(:,2)==data.S(1,2));
data.noE=find(node(:,1)==data.E(1,1) & node(:,2)==data.E(1,2));
data.numLM0=10; 
dim=length(data.noLM);
%% 测试函数
option.dim = dim;
lb = 0;
ub = 1;
fobj = @aimFcn_1;

%% 算法设置
%  Function_name='F8'; % Name of the test function that can be from F1 to F23 (Table 1,2,3 in the paper) 设定适应度函数
SearchAgents_no=50; % Number of search agents 种群数量
Max_iteration=50;
% Load details of the selected benchmark function
% [lb,ub,dim,fobj]=Get_Functions_details(Function_name);  %设定边界以及优化函数

[Best_pos,Best_score,SSA_curve]=SSANew(SearchAgents_no,Max_iteration,lb,ub,dim,fobj,option,data); %开始优化


str='AFO1'
[~,result1]=fobj(Best_pos,option,data);
drawPC(result1,option,data,str)

figure

plot(SSA_curve,'LineWidth',2)

legend("SSA")
title('fitness curve')




三、总算法优化结果

按照工件加工顺序:
在这里插入图片描述

代码获取:

点击获取代码

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值