⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 agent2.m

📁 基于boids模型的多参数swarm仿真
💻 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 + -