多领导者改进算法的MATLAB仿真
%多領導者改進算法
%---------系統附初值------------------------
clear;clc;
loop=500; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? %確定循環周期
s=0.1; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%s取值范圍為(0,1)
n=10; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? %初始化智能體個數
r=6; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%初始化智能體感知半徑
dw=5; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? %網格Lattice距離
a=1;b=2; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%0<=a<=b
c1=0.1;c2=0.2; ? ? ? ? ? ? ? ? ? ? ? ? ?%領導者影響函數參數,c1,c2>0
step=0.1; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? %確定步長
h=0.9; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%定義參數h,其取值范圍為(0,1)
size=50; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%初始范圍
%---------系統初始化------------------------
q=size*rand(2,n); ? ? ? ? ? ? ? ? ? ? ? %初始化智能體初始位置向量
p=2*rand(2,n)-1; ? ? ? ? ? ? ? ? ? ? ? ?%初始化智能體初始速度向量
qr1=size*rand(2,1); ? ? ? ? ? ? ? ? ? ? %初始領導者1位置向量
pr1=2*rand(2,1)-1; ? ? ? ? ? ? ? ? ? ? ?%初始領導者1速度向量
qr2=size*rand(2,1); ? ? ? ? ? ? ? ? ? ? %初始領導者2位置向量
pr2=2*rand(2,1)-1; ? ? ? ? ? ? ? ? ? ? ?%初始領導者2速度向量
qqr1=zeros(2,loop); ? ? ? ? ? ? ? ? ? ? %每個時間段領導者的位置向量
ppr1=zeros(2,loop); ? ? ? ? ? ? ? ? ? ? %每個時間段領導者的速度向量
qqr2=zeros(2,loop); ? ? ? ? ? ? ? ? ? ? %每個時間段領導者的位置向量
ppr2=zeros(2,loop); ? ? ? ? ? ? ? ? ? ? %每個時間段領導者的速度向量
qq=zeros(2,n,loop); ? ? ? ? ? ? ? ? ? ? %每個時間段的位置向量
pp=zeros(2,n,loop); ? ? ? ? ? ? ? ? ? ? %每個時間段的速度向量
ra=(1/s)*[sqrt(1+s*(r^2))-1];
dwa=(1/s)*[sqrt(1+s*(dw^2))-1];
%----------開始循環--------------------------
%對智能體進行循環,實驗主題
?for ld=1:loop
? ? ?qq(:,:,ld)=q(:,:);
? ? ?pp(:,:,ld)=p(:,:);?
? ? ?qqr1(:,ld)=qr1(:,:);
? ? ?ppr1(:,ld)=pr1(:,:);?
? ? ?qqr2(:,ld)=qr2(:,:);
? ? ?ppr2(:,ld)=pr2(:,:);?
? ? ?ur1(:,1)=cos(qr1(:,1));
? ? ?ur2(:,1)=cos(qr2(:,1));
? ? ?qr=zeros(2,10);
? ? ?pr=zeros(2,10);
? ? ?%-------給每個智能體對應領導者--------------
? ? ?%----1~5跟隨領導者1,6~10跟隨領導者2---------
? ? ?for j=1:10
? ? ? ? ?if j>=1&j<=5
? ? ? ? ? ? ?qr(:,j)=qr1(:,1);
? ? ? ? ?else?
? ? ? ? ? ? ?qr(:,j)=qr2(:,1);
? ? ? ? ?end
? ? ?end
? ? ?for j=1:10
? ? ? ? ?if j>=1&j<=5
? ? ? ? ? ? ?pr(:,j)=pr1(:,1);
? ? ? ? ?else?
? ? ? ? ? ? ?apr(:,j)=pr2(:,1);
? ? ? ? ?end
? ? ?end
? ? ?
? ? %----------------系統結構搭建-----------------------
? ? %定義共識網絡A,判斷智能體之間的相互影響
? ? A=zeros(n,n);
? ? for i=1:n
? ? ? ? for j=1:n
? ? ? ? ? ? if [q(1,i)-q(1,j)]^2+[q(2,i)-q(2,j)]^2<=r^2
? ? ? ? ? ? ? ? A(i,j)=1;
? ? ? ? ? ? end
? ? ? ? end ? ?
? ? end
? ? for i=1:n
? ? ? ? A(i,i)=0;
? ? end
? ? %求agent之間距離d
? ? d=zeros(n,n);
? ? for i=1:n
? ? ? ? for j=1:n
? ? ? ? ? ? d(i,j)=sqrt((q(1,i)-q(1,j)-qr(1,i)+qr(1,j))^2+(q(2,i)-q(2,j)-qr(2,i)+qr(2,j))^2);
? ? ? ? end
? ? end
? ? %實現fya(z)
? ? %計算n(i,j)
? ? N=zeros(n,n,2);
? ? for i=1:n
? ? ? ? for j=1:n
? ? ? ? ? ? N(i,j,1)=(q(1,j)-q(1,i))/sqrt(1+s*d(i,j)^2);
? ? ? ? ? ? N(i,j,2)=(q(2,j)-q(2,i))/sqrt(1+s*d(i,j)^2);
? ? ? ? end
? ? end
? ? %計算dai=||qj-qi+qri-qrj||σ
? ? da=zeros(n,n);
? ? for i=1:n
? ? ? ? for j=1:n
? ? ? ? ? ? da(i,j)=(1/s)*[sqrt(1+s*(d(i,j)^2))-1];
? ? ? ? end
? ? end
? ? %計算fya(da)
? ? fya=zeros(n,n);
? ? ph=zeros(n,n);
? ? for i=1:n
? ? ? ? for j=1:n
? ? ? ? ? ? z1=da(i,j)/ra;
? ? ? ? ? ? if z1<h & z1>=0 ? ? ?
? ? ? ? ? ? ? ? ?ph(i,j)=1;
? ? ? ? ? ? elseif z1<=1|z1>=h
? ? ? ? ? ? ? ? ?ph(i,j)=0.5*(1+cos(pi*((z1-h)/(1-h))));
? ? ? ? ? ? else
? ? ? ? ? ? ? ? ?ph(i,j)=0;
? ? ? ? ? ? end
? ? ? ? ? ? z2=da(i,j)-dwa;
? ? ? ? ? ? c=(b-a)/sqrt(4*a*b);
? ? ? ? ? ? fy(i,j)=0.5*((a+b)*((z2+c)/sqrt(1+(z2+c)^2))+(a-b));
? ? ? ? ? ? fya(i,j)=ph(i,j)*fy(i,j)*A(i,j);
? ? ? ? end
? ? end
? ? %-----------------求智能體的位置影響------------------
? ? %求u11=fya*N(i,j)
? ? u11=zeros(n,n,2);
? ? for i=1:n
? ? ? ? for j=1:n
? ? ? ? ? ? u11(i,j,1)=fya(i,j)*N(i,j,1);
? ? ? ? ? ? u11(i,j,2)=fya(i,j)*N(i,j,2);
? ? ? ? end
? ? end
? ? u1=zeros(2,n);
? ? for i=1:n
? ? ? ? for j=1:n
? ? ? ? ? ? u1(1,i)=u1(1,i)+u11(i,j,1);
? ? ? ? ? ? u1(2,i)=u1(2,i)+u11(i,j,2);
? ? ? ? end
? ? end
? ? %----------------求智能體的速度影響----------------------
? ? %求u22=aij*(pj-pi-prj+pri)
? ? u22=[n,n,2];
? ? for i=1:n
? ? ? ? for j=1:n
? ? ? ? ? ? u22(i,j,1)=A(i,j)*(p(1,j)-p(1,i)-pr(1,i)+pr(1,i));
? ? ? ? ? ? u22(i,j,2)=A(i,j)*(p(2,j)-p(2,i)-pr(2,i)+pr(2,i));
? ? ? ? end
? ? end
? ? %u2為反饋2
? ? u2=zeros(2,n);
? ? for i=1:n
? ? ? ? for j=1:n
? ? ? ? ? ? u2(1,i)= u22(i,j,1)+ u2(1,i);
? ? ? ? ? ? u2(2,i)= u22(i,j,2)+ u2(2,i);
? ? ? ? end
? ? end
? ? %-----------------求領導者的影響------------------
? ? u3=zeros(2,n);
? ? for i=1:5
? ? ? ? u3(1,i)=-c1*(q(1,i)-qr1(1,1))-c2*(p(1,i)-pr1(1,1));
? ? ? ? u3(2,i)=-c1*(q(2,i)-qr1(2,1))-c2*(p(2,i)-pr1(2,1));
? ? end
? ? for i=6:10
? ? ? ? u3(1,i)=-c1*(q(1,i)-qr2(1,1))-c2*(p(1,i)-pr2(1,1));
? ? ? ? u3(2,i)=-c1*(q(2,i)-qr2(2,1))-c2*(p(2,i)-pr2(2,1));
? ? end
? ? %-----------------求加速度u---------------------------
? ? %----各智能體在計算時加入其領導智能體的加速度反饋ur------
? ? u=zeros(2,n);
? ? for i=1:2
? ? ? ? for j=1:5
? ? ? ? ? u(i,j)=u1(i,j)+u2(i,j)+u3(i,j)+ur1(i,1);
? ? ? ? end
? ? end
? ? for i=1:2
? ? ? ? for j=6:10
? ? ? ? ? u(i,j)=u1(i,j)+u2(i,j)+u3(i,j)+ur2(i,1);
? ? ? ? end
? ? end
? ? %----------------進行下一步運算--------------
? ? %-------------智能體離散計算------------
? ? for i=1:2
? ? ? ? for j=1:n
? ? ? ? ? ? q(i,j)=q(i,j)+step*p(i,j);
? ? ? ? ? ? p(i,j)=p(i,j)+step*u(i,j);
? ? ? ? end
? ? end
? ? %------------虛擬領導者離散計算------------
? ? for i=1:2
? ? ? ? qr1(i,1)=qr1(i,1)+step*pr1(i,1);
? ? ? ? pr1(i,1)=pr1(i,1)+step*ur1(i,1);
? ? end
? ? for i=1:2
? ? ? ? qr2(i,1)=qr2(i,1)+step*pr2(i,1);
? ? ? ? pr2(i,1)=pr2(i,1)+step*ur2(i,1);
? ? end
end
%---------------------循環結束,繪圖------------------------
%---------------------智能體初始時刻狀態--------------------
figure(1);
plot(qq(1,:,1),qq(2,:,1),'o');
hold on;
quiver(qq(1,:,1),qq(2,:,1),pp(1,:,1),pp(2,:,1),'Color','red');
for i=1:n
? ? for j=1:n
? ? ? ? if sqrt((qq(1,i,1)-qq(1,j,1))^2+(qq(2,i,1)-qq(2,j,1))^2)<=r
? ? ? ? ? ? line([qq(1,i,1),qq(1,j,1)],[qq(2,i,1),qq(2,j,1)]);?
? ? ? ? end
? ? end
end
%-------------------智能體最終時刻狀態---------------
figure(2);
plot(qq(1,:,loop),qq(2,:,loop),'o');
hold on;
quiver(qq(1,:,loop),qq(2,:,loop),pp(1,:,loop),pp(2,:,loop),'Color','red');
for i=1:n
? ? for j=1:n
? ? ? ? if sqrt((qq(1,i,loop)-qq(1,j,loop))^2+(qq(2,i,loop)-qq(2,j,loop))^2)<=r
? ? ? ? ? ? line([qq(1,i,loop),qq(1,j,loop)],[qq(2,i,loop),qq(2,j,loop)]);?
? ? ? ? end
? ? end
end
%--------------------智能體t時刻--------------------------------
%------將下面注釋段復制到工作窗,給t賦值,顯示步數為t時的狀態------
% figure(1);
% plot(qq(1,:,t),qq(2,:,t),'o');
% hold on;
% quiver(qq(1,:,t),qq(2,:,t),pp(1,:,t),pp(2,:,t),'Color','red');
% for i=1:n
% ? ? for j=1:n
% ? ? ? ? if sqrt((qq(1,i,t)-qq(1,j,t))^2+(qq(2,i,t)-qq(2,j,t))^2)<=r
% ? ? ? ? ? ? line([qq(1,i,t),qq(1,j,t)],[qq(2,i,t),qq(2,j,t)]);?
% ? ? ? ? end
% ? ? end
% end
%------------智能體速度方向跟隨情況---------------------------
%-----------畫領導者方向----------------
figure(3);
mdqr=zeros(1,loop);
for i=1:loop
mdqr(1,i)=sqrt((ppr1(1,i))^2+(ppr1(2,i))^2);
csqr(1,i)=ppr1(1,i)/mdqr(1,i);
end
plot(1:loop,csqr(1,1:loop),'color','red')
hold on
mdqr=zeros(1,loop);
for i=1:loop
mdqr(1,i)=sqrt((ppr2(1,i))^2+(ppr2(2,i))^2);
csqr(1,i)=ppr2(1,i)/mdqr(1,i);
end
plot(1:loop,csqr(1,1:loop),'color','yellow')
hold on
%-----------畫一般智能體---------------
for i=1:n
? ? for j=1:loop
? ? ? ? mdq(i,j)=sqrt((pp(1,i,j))^2+(pp(2,i,j))^2);
? ? ? ? csq(i,j)=pp(1,i,j)/mdq(i,j);
? ? end
end
for i=1:10
plot(1:loop,csq(i,1:loop))
hold on
end
?
?D124
總結
以上是生活随笔為你收集整理的多领导者改进算法的MATLAB仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4.Verilog 基础语法
- 下一篇: 求带便函数权值的最短路径