ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

多智能体实现带状栅栏覆盖——MATLAB代码

2022-03-11 11:59:56  阅读:193  来源: 互联网

标签:rand 栅栏 end 带状 cos num MATLAB theta sin


仔细阅读一篇关于栅栏覆盖的文献(文末会给出文献)之后把代码写出来了。还有点小bug,不过已经可以实现了。代码写得比较粗糙,读者可以自己改一改。

代码如下:

clc
clear 
close all
%%
%生成智能体和地标
s=0.5;
r=1;
tk=1;
T=1;
xc=0.00001;
v0=0.01;
vmax=0.01;
L1=[5*rand(1),5*rand(1)];
L2=L1+[5*rand(1),5*rand(1)];
delta=atan((L2(2)-L1(2))/(L2(1)-L1(1))); 
theta_av=delta+pi/2;
q0=[sin(theta_av) -cos(theta_av)]*(L1)';
qn_1=[sin(theta_av) -cos(theta_av)]*(L2)';
figure(10);
rectangle('Position', [L1-[0.6/2 0.6/2],0.6,0.6], 'Curvature', [0 0],'EdgeColor', 'k','facecolor','k');
rectangle('Position', [L2-[0.6/2 0.6/2],0.6,0.6], 'Curvature', [0 0],'EdgeColor', 'k','facecolor','k');
rectangle('Position', [L1-[s/2 s/2],s,s], 'Curvature', [1 1],'EdgeColor', 'g','facecolor','g');
rectangle('Position', [L2-[s/2 s/2],s,s], 'Curvature', [1 1],'EdgeColor', 'g','facecolor','g');
axis equal;
n=round(norm(L1-L2)/s);
a=[10*rand(1),10*rand(1)];
[y,x]=meshgrid(1,1:n);
P = arrayfun(@(x,y)[x,y],x,y, 'UniformOutput' , false );
[y,x]=meshgrid(1,1:n);
theta = arrayfun(@(x,y)[x,y],x,y, 'UniformOutput' , false );
[y,x]=meshgrid(1,1:n);
q = arrayfun(@(x,y)[x,y],x,y, 'UniformOutput' , false );
[y,x]=meshgrid(1,1:n);
th = arrayfun(@(x,y)[x,y],x,y, 'UniformOutput' , false );
[y,x]=meshgrid(1,1:n);
Q = arrayfun(@(x,y)[x,y],x,y, 'UniformOutput' , false );
[y,x]=meshgrid(1,1:n);
vj = arrayfun(@(x,y)[x,y],x,y, 'UniformOutput' , false );
[y,x]=meshgrid(1,1:n);
vb = arrayfun(@(x,y)[x,y],x,y, 'UniformOutput' , false );
[y,x]=meshgrid(1,1:n);
v = arrayfun(@(x,y)[x,y],x,y, 'UniformOutput' , false );
[y,x]=meshgrid(1,1:n);
F = arrayfun(@(x,y)[x,y],x,y, 'UniformOutput' , false );
[y,x]=meshgrid(1,1:n);
qi = arrayfun(@(x,y)[x,y],x,y, 'UniformOutput' , false );
sumthe=1:n;
num=1:n;
cij=1:n; 
H=1:n; 
M=1:n; 
P{n+1}=L1;
P{n+2}=L2;
theta{n+1}(1)=theta_av;
theta{n+2}(1)=theta_av;
for i=1:round(n/2)
    %生成智能体初始位置和初始航向角
    P{i}=L1+[(rand(1)-0.5)*0.4,(rand(1)-0.5)*0.4];
    th{i}(1)=pi*rand(1);
    theta{i}(1)=th{i}(1);
    F{i}(1)=[cos(theta{i}(1)) sin(theta{i}(1))]*(P{i})';
    a(i)=rectangle('Position', [P{i}-[s/2 s/2],s,s], 'Curvature', [1 1],'EdgeColor', 'g','facecolor','g');
end
for i=round(n/2)+1:n
    %生成智能体初始位置和初始航向角
    P{i}=L2+[(rand(1)-0.5)*0.4,(rand(1)-0.5)*0.4];
    th{i}(1)=pi*rand(1);
    theta{i}(1)=th{i}(1);
    F{i}(1)=[cos(theta{i}(1)) sin(theta{i}(1))]*(P{i})';
    a(i)=rectangle('Position', [P{i}-[s/2 s/2],s,s], 'Curvature', [1 1],'EdgeColor', 'g','facecolor','g');
end

%% 时间序列
for k=1:2500
theta{n+1}(k)=theta_av;
theta{n+2}(k)=theta_av;
%% 计算Hi(KT)Mi(KT) 更新Fi(KT) theta(KT)计算Qi(KT)
for i=1:n
sumthe(i)=0;   %D区域的角度和
num(i)=0;      %D区域的智能体数量
cij(i)=0;      %D区域的共识信息
    for io=1:n+2
        if(norm(P{i}-P{io})<=r)
            num(i)=num(i)+1;
            sumthe(i)=sumthe(i)+theta{io}(k);
            cij(i)=cij(i)+[cos(theta{i}(k)) sin(theta{io}(k))]*(P{io})';
            q{i}(num(i))=[sin(theta{i}(k)) -cos(theta{i}(k))]*(P{io})';
        end
    end
    if (num(i)>1) %存在α和β中的一个
        q{i}=sort(q{i});%排个序
        for i2=1:num(i)
            if (q{i}(i2)==[sin(theta{i}(k)) -cos(theta{i}(k))]*(P{i})')%找到i=i2
                if(i2==1)%只存在β
                    Q{i}=(q{i}(i2)-s+q{i}(2))/2;
                elseif(i2==num(i))%只存在α
                    Q{i}=(q{i}(i2-1)+q{i}(i2)+s)/2;
                else %α和β都存在
                    Q{i}=(q{i}(i2+1)+q{i}(i2-1))/2;
                end
            end
        end
    else %α和β都不存在
         Q{i}=q{i}(1);
    end
        if ((0<(q0-[sin(theta{i}(k)) -cos(theta{i}(k))]*(P{i})'))&&((q0-[sin(theta{i}(k)) -cos(theta{i}(k))]*(P{i})')<s+xc))
            qi{i}(k)=([sin(theta{i}(k)) -cos(theta{i}(k))]*(P{i})'+q0+v0*T)/2;
        elseif((0<([sin(theta{i}(k)) -cos(theta{i}(k))]*(P{i})'-qn_1))&&(([sin(theta{i}(k)) -cos(theta{i}(k))]*(P{i})'-qn_1)<s+xc))
            qi{i}(k)=([sin(theta{i}(k)) -cos(theta{i}(k))]*(P{i})'+qn_1-v0*T)/2;
        else 
            qi{i}(k)=Q{i};
        end 
 H(i)=sumthe(i)/num(i);
 theta{i}(k+1)=H(i);
 M(i)=cij(i)/num(i);
 F{i}(k+1)=M(i);
 F{i}(k)=[cos(theta{i}(k)) sin(theta{i}(k))]*(P{i})';%这一步太重要了
 vj{i}(k)=(F{i}(k+1)-F{i}(k))/T; 
 vb{i}(k)=(qi{i}(k)-[sin(theta{i}(k)) -cos(theta{i}(k))]*(P{i})')/T;
 v{i}(k)=sqrt((vj{i}(k))^2+(vb{i}(k))^2);
 if(vj{i}(k)<0)
        th{i}(k)=theta{i}(k)-acos(vb{i}(k)/v{i}(k))-pi/2;
 else
        th{i}(k)=theta{i}(k)+acos(vb{i}(k)/v{i}(k))-pi/2;
 end
end
%% 移动智能体
    pause(0.012);
for i=1:n
   delete(a(i));
   if v{i}(k)>vmax
       v{i}(k)=vmax;
   end
    P{i}=P{i}+(v{i}(k))*[cos(th{i}(k)) sin(th{i}(k))]*T;
    a(i)=rectangle('Position', [P{i}-[s/2 s/2],s,s], 'Curvature', [1 1],'EdgeColor', 'g','facecolor','g');
end
end

仿真图:

 

参考文献:

[1] Cheng T M, Savkin A V. A distributed self-deployment algorithm for the coverage of mobile        wireless sensor networks[J]. IEEE Communications Letters, 2009, 13(11): 877-879.

标签:rand,栅栏,end,带状,cos,num,MATLAB,theta,sin
来源: https://blog.csdn.net/FANYANGYANG_/article/details/123420875

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有