📄 agent2.m
字号:
clear all
%实现二维空间下的swarm行为
%预定义
agentnum = 30; %个体数
worldboundary = 10; %最大边界值
neighborhoodsize = 3;%邻居界限
iterate = 0;
%各常数值
wanderConstant = 1.0;
worldCenterConstant = 12.0;
centerConstant = 10.0;
velocityConstant = 5.0;
spacingConstant = 2.0;
maxVelocity = 6.0;
maxAcceleration = 35.0;
cruiseDistance = 0.35;
%初始化
position = 5 + (10-5) * rand(agentnum,2); %记录各agent的位置信息,使x,y在5-10之间取值
velocity = 10 + (20-10) * rand(agentnum,2); %记录各agent的速度信息,决定着agent的位置信息,使x,y在10-20之间取值
acceleration = zeros(agentnum,2); %记录各agent的加速度信息,决定着agent的速度信息
%主循环
while iterate <= 1000 %总的运行次数
%局部变量初始化
aveVelocity = zeros(1,2);
center = zeros(1,2);
%初始化neighborArray,记录符合要求的各agent邻居编号
neighborArray = zeros(agentnum,agentnum);
%与五个常数相对应的五个向量值
wanderUrge = zeros(agentnum,2);
worldCenterUrge = zeros(agentnum,2);
centerUrge = zeros(agentnum,2);
velocityUrge = zeros(agentnum,2);
spacingUrge = zeros(agentnum,2);
x = position(:,1);
y = position(:,2);
plot(x,y,'.')
xlim([min(x)-2 max(x)+1])
ylim([min(y)-2 max(y)+1])
%获取各agent的邻居信息
for i = 1:agentnum
for t = 1:agentnum
%不考虑位置相同的agent
if x(i) ~= x(t) && y(i) ~= y(t)
length = sqrt((x(t)-x(i))^2 + (y(t)-y(i))^2);
%规定区域内并在可视范围中
if length < neighborhoodsize && acos((x(t)-x(i))/length) < 2
%对相应邻居进行标注
neighborArray(i,t) = 1;
end
end
end
end
%计算wanderUrge
wanderUrge = 1 + (2-1) * rand(agentnum,2); %在1-2之间取值
%计算worldCenterUrge
for k = 1:agentnum
if sqrt(x(k)^2 + y(k)^2) > worldboundary
worldCenterUrge(k,1) = worldCenterUrge(k,1) - x(k);
worldCenterUrge(k,2) = worldCenterUrge(k,2) - y(k);
end
end
%计算centerUrge
for n = 1:agentnum
count = 0;
for m = 1:agentnum
if neighborArray(n,m) == 1
%用于记录agent个数
count = count + 1;
center = center + [x(m),y(m)];
end
end
if count ~= 0
center = center/count;
centerUrge(n,:) = center - centerUrge(n,:);
end
end
%计算velocityUrge
for n = 1:agentnum
count = 0;
for m = 1:agentnum
if neighborArray(n,m) == 1
%用于记录agent个数
count = count + 1;
aveVelocity = aveVelocity + velocity(m,:);
end
end
if count ~= 0
aveVelocity = aveVelocity/count;
velocityUrge(n,:) = aveVelocity - velocityUrge(n,:);
end
end
%计算spacingUrge
for n = 1:agentnum
for m = 1:agentnum
if neighborArray(n,m) == 1
toNeighbor = sqrt((x(m)-x(n))^2 + (y(m)-y(n))^2);
if toNeighbor < cruiseDistance
spacingUrge(n,:) = spacingUrge(n,:) + toNeighbor;
end
end
end
end
%单位化向量
for q = 1:agentnum
wanderUrgeL = sqrt(wanderUrge(q,1)^2 + wanderUrge(q,2)^2);
worldCenterUrgeL = sqrt(worldCenterUrge(q,1)^2 + worldCenterUrge(q,2)^2);
centerUrgeL = sqrt(centerUrge(q,1)^2 + centerUrge(q,2)^2);
velocityUrgeL = sqrt(velocityUrge(q,1)^2 + velocityUrge(q,2)^2);
spacingUrgeL = sqrt(spacingUrge(q,1)^2 + spacingUrge(q,2)^2);
if wanderUrgeL ~= 0
wanderUrge(q,:) = wanderUrge(q,:) / wanderUrgeL;
wanderUrge(q,:) = wanderUrge(q,:) * wanderConstant;
end
if worldCenterUrgeL ~= 0
worldCenterUrge(q,:) = worldCenterUrge(q,:) / worldCenterUrgeL;
worldCenterUrge(q,:) = worldCenterUrge(q,:) * wanderConstant;
end
if centerUrgeL ~= 0
centerUrge(q,:) = centerUrge(q,:) / centerUrgeL;
centerUrge(q,:) = centerUrge(q,:) * centerConstant;
end
if velocityUrgeL ~= 0
velocityUrge(q,:) = velocityUrge(q,:)/velocityUrgeL;
velocityUrge(q,:) = velocityUrge(q,:) * velocityConstant;
end
if spacingUrgeL ~= 0
spacingUrge(q,:) = spacingUrge(q,:)/spacingUrgeL;
spacingUrge(q,:) = spacingUrge(q,:) * spacingConstant;
end
end
%计算acceleration = (worldCenterUrge + centerUrge + velocityUrge + spacingUrge + wanderUrge)
for p = 1:agentnum
acceleration(p,:) = worldCenterUrge(p,:) + centerUrge(p,:) + velocityUrge(p,:) + spacingUrge(p,:) + wanderUrge(p,:);
accelerationL = sqrt(acceleration(p,1)^2 + acceleration(p,2)^2);
if accelerationL ~= 0
acceleration(p,:) = acceleration(p,:) / accelerationL;
end
acceleration(p,:) = acceleration(p,:) * maxAcceleration;
end
%记录时间
time = 0.1;
pause(time)
%依据acceleration跟新各agent的速度信息, v=v+a*t.
for t = 1:agentnum
velocity(t,:) = velocity(t,:) + acceleration(t,:) * time;
newvelocity = sqrt(velocity(t,1)^2 + velocity(t,2)^2);
if newvelocity > maxVelocity
velocity(t,:) = (velocity(t,:) / newvelocity) * maxVelocity;
end
end
%依据velocity跟新各agent的位置信息,x=x+v*t.
for v = 1:agentnum
position(v,:) = position(v,:) + velocity(v,:) * time;
end
iterate = iterate+1;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -