多智能体一致性仿真 简单的多智能体一致性性仿真图,包多智能体一致性仿真 简单的多智能体一致性性仿真图,包含状态轨迹图和控制输入图。 程序简单,所以便宜,但是有注释,都能看懂,适合初学者。 状态轨迹图和控制输入图。 程序简单,所以便宜,但是有注释,都能看懂,适合初学者

最近在折腾多智能体协同控制,发现基础的一致性算法虽然简单,但用来理解群体行为特别直观。今天就拿MATLAB撸个极简版的一阶多智能体仿真,咱们边看代码边聊实现细节。

先上核心模型:四个小车通过通信拓扑交换位置信息,目标是让它们的位置趋于一致。这里用最经典的一阶积分器模型:

% 邻接矩阵(环形拓扑)
A = [0 1 0 1;
     1 0 1 0;
     0 1 0 1;
     1 0 1 0]; 

% 初始位置               
x0 = [10; -5; 3; 8];  

dt = 0.1;  % 时间步长
t_total = 5;  % 总时长
steps = t_total/dt;

这段代码定义了个环形通信网络(每个智能体连接左右两个邻居)。初始位置故意设得比较分散,方便观察收敛过程。时间参数设置上,0.1秒的步长兼顾了精度和计算效率。

控制输入的计算才是重头戏,这里采用标准的一致性协议:

u = zeros(4,1);  % 初始化控制输入
x_history = x0;  % 记录轨迹
u_history = [];  % 记录控制量

for k = 1:steps
    % 计算每个智能体的控制量
    for i = 1:4
        neighbors = find(A(i,:));  % 找出邻居
        u(i) = sum( x(neighbors) - x(i) );  % 一致性协议
    end
    
    % 状态更新(一阶积分器)
    x = x + u*dt;  
    
    % 保存数据
    x_history = [x_history, x];
    u_history = [u_history, u];
end

控制量计算部分体现了分布式特性——每个智能体只获取邻居的位置信息。注意这里用了双层循环,外层是时间步,内层遍历所有智能体。实际工程中可能会用矩阵运算优化,但为了可读性保留循环结构。

多智能体一致性仿真 简单的多智能体一致性性仿真图,包多智能体一致性仿真 简单的多智能体一致性性仿真图,包含状态轨迹图和控制输入图。 程序简单,所以便宜,但是有注释,都能看懂,适合初学者。 状态轨迹图和控制输入图。 程序简单,所以便宜,但是有注释,都能看懂,适合初学者

绘图部分用subplot展示状态和控制量的变化:

figure(1)
subplot(2,1,1)
plot(0:dt:t_total, x_history)
title('位置状态收敛过程')
xlabel('时间/s')

subplot(2,1,2)
plot(0:dt:t_total-dt, u_history) 
title('控制输入变化')
xlabel('时间/s')

运行后可以看到,大约3秒后四个智能体的位置收敛到同一值(初始位置的平均值),而控制量则逐渐衰减到零。这说明系统达到了静态一致状态。

几个值得注意的细节:

  1. 步长dt不宜过大,否则会出现数值不稳定
  2. 邻接矩阵的对称性保证了收敛速度
  3. 初始位置的平均值即为系统平衡点
  4. 控制输入曲线呈现指数衰减特征

改个初始位置试试?比如把x0设成[20; -15; 30; -8],会发现收敛时间变长但最终仍趋于一致。这说明算法的鲁棒性——只要通信拓扑连通,初始状态不影响最终收敛性。

对于想深入研究的同学,可以尝试:

  • 调整通信拓扑(比如去掉一条边)
  • 加入时延或噪声
  • 改用二阶动力学模型

这些扩展都会带来新的有趣现象,但那个就是后话了。今天的代码已经打包放在GitHub,复制粘贴就能跑,评论区等你们交作业~

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐