五个智能体系统模型的Matlab仿真与详细代码注释
多智能体系统模型仿真 五个智能体系统模型 matlab代码 代码有详细注释

无人机编队掠过城市上空执行救援任务,水下机器人集群悄无声息地绘制海底地形图——这些酷炫场景背后,都藏着多智能体系统协同控制的秘密。今天咱们用Matlab手搓五个经典模型,看看这些铁疙瘩是怎么"商量着"干活的。

1. 一致性协议(Consensus Protocol)
% 五节点环形拓扑一致性仿真
dt = 0.1; % 时间步长
L = [2 -1 0 0 -1; % 环形结构的拉普拉斯矩阵
-1 2 -1 0 0;
0 -1 2 -1 0;
0 0 -1 2 -1;
-1 0 0 -1 2];
x = [10; 5; 0; -5; -10]; % 初始状态
for k = 1:50
dx = -L * x; % 核心共识方程
x = x + dx * dt;
plot(x, 'o-'); ylim([-15 15]);
pause(0.1);
end
这段代码最骚的地方在于拉普拉斯矩阵L的设计,它就像智能体之间的对讲机网络。每个智能体只和邻居交换信息,但经过几十次迭代后,所有状态值都会收敛到同一个数值。试试把初始状态改成随机数,收敛过程会出现漂亮的波纹效应。

2. 领导者-跟随者编队
% 1个领导者+4个跟随者编队控制
leader_path = @(t) [t; 0.5*sin(t)]; % 领导者运动轨迹
followers_x = [2 4 6 8; % 初始位置
1 1 1 1];
for t = 0:0.1:10
% 领导者位置
L_pos = leader_path(t);
% 跟随者根据相对位置更新
for i = 1:4
desired_offset = [i*2; 0]; % 期望相对位置
neighbors_info = ... % 这里接入邻居位置信息
followers_x(:,i) = followers_x(:,i) + 0.3*(L_pos - followers_x(:,i) + desired_offset);
end
% 绘制实时位置
plot(L_pos(1), L_pos(2), 'rs', followers_x(1,:), followers_x(2,:), 'bo');
axis([0 10 -3 3]); pause(0.05);
end
这个模型里领导者像头雁一样带节奏,跟随者既要保持队形又要紧跟老大。代码中0.3这个增益系数很关键,调大了容易震荡,调小了反应迟钝——这就是控制工程里的艺术所在。

3. 蜂拥控制(Flocking)
% Boids模型实现群体聚集
num_agents = 5;
pos = rand(2,num_agents)*10; % 随机初始位置
vel = rand(2,num_agents)*2-1; % 随机初始速度
for frame = 1:100
new_vel = zeros(size(vel));
for i = 1:num_agents
% 速度匹配:计算邻居平均速度
neighbors = find(vecnorm(pos - pos(:,i)) < 3); % 感知半径3米
avg_vel = mean(vel(:,neighbors),2);
% 聚集力:向群体质心移动
cohesion = mean(pos(:,neighbors),2) - pos(:,i);
% 分离力:避免碰撞
too_close = find(vecnorm(pos - pos(:,i)) < 1);
separation = -sum(pos(:,too_close) - pos(:,i),2);
new_vel(:,i) = vel(:,i) + 0.2*avg_vel + 0.1*cohesion + 0.3*separation;
end
vel = new_vel;
pos = pos + vel*0.1;
quiver(pos(1,:),pos(2,:),vel(1,:),vel(2,:)); axis([0 10 0 10]);
pause(0.05);
end
这个模型把生物群集行为数学化了,三个核心规则:速度对齐、聚集、分离。注意看分离力的计算,当智能体距离小于1米时会触发排斥力,就像地铁里陌生人靠太近时的微妙调整。

4. 分布式优化
% 分布式梯度下降求解协同定位问题
x_true = [3; 7]; % 真实目标位置
sensor_pos = rand(2,5)*10; % 传感器随机部署
% 每个传感器只能测量与目标的距离
measurements = vecnorm(sensor_pos - x_true) + randn(1,5)*0.1; % 带噪声的测量
x_est = rand(2,5)*10; % 每个智能体维护一个估计值
for iter = 1:50
for i = 1:5
% 本地梯度计算
grad = 2*(x_est(:,i) - sensor_pos(:,i))*(norm(x_est(:,i)-sensor_pos(:,i)) - measurements(i));
% 与邻居交换估计值
neighbors = [mod(i-2,5)+1, i, mod(i,5)+1]; % 环形通信
avg_est = mean(x_est(:,neighbors),2);
x_est(:,i) = x_est(:,i) - 0.1*grad + 0.2*(avg_est - x_est(:,i));
end
end
这个分布式估计问题就像一群盲人摸象,每个传感器只能获取局部信息。通过邻居间的数据交换,最终所有估计值会收敛到真实位置附近。代码中的0.1和0.2是学习率和共识率,调整这两个参数能看到收敛速度的明显变化。

5. 竞争协作模型
% 资源竞争下的协作博弈
resources = [8, 5, 3]; % 三种资源总量
agent_strategy = rand(5,3); % 每个智能体的资源获取策略
agent_strategy = agent_strategy ./ sum(agent_strategy,2); % 归一化
for round = 1:20
% 计算资源占用率
total_demand = sum(agent_strategy);
utilization = min(1, total_demand ./ resources);
% 更新策略(兼顾自身利益和群体公平)
for i = 1:5
payoff = agent_strategy(i,:) .* utilization;
avg_payoff = mean(payoff);
% 强化高回报策略,同时考虑邻居策略
neighbors_strategy = agent_strategy(mod(i-1:i+1,5)+1,:);
social_influence = mean(neighbors_strategy);
agent_strategy(i,:) = 0.8*payoff + 0.2*social_influence;
agent_strategy(i,:) = agent_strategy(i,:)/sum(agent_strategy(i,:));
end
% 绘制策略分布
bar(agent_strategy'); pause(0.2);
end
这个模型展现了智能体在自私与利他之间的平衡。代码中0.8和0.2的权重就像人性中的贪婪与道德博弈。运行时会看到策略矩阵逐渐形成对角线优势——智能体自发地差异化竞争,避免所有人都挤占同一种资源。

这些模型代码虽然精简,但已经揭示了多智能体系统的核心逻辑:局部交互产生全局秩序。下次看到蚂蚁搬家或者无人机表演时,你大概能猜到它们脑子里的控制算法在跑什么了。试着修改代码中的通信拓扑或控制参数,可能会发现一些反直觉的现象——比如增加共识率反而导致系统震荡,这就是分布式系统的迷人之处。

更多推荐
所有评论(0)