多智能体一致性仿真 简单的多智能体一致性性仿真图,包多智能体一致性仿真 简单的多智能体一致性性仿真图
多智能体一致性仿真 简单的多智能体一致性性仿真图,包多智能体一致性仿真 简单的多智能体一致性性仿真图,包含状态轨迹图和控制输入图。 程序简单,所以便宜,但是有注释,都能看懂,适合初学者。 状态轨迹图和控制输入图。 程序简单,所以便宜,但是有注释,都能看懂,适合初学者
最近在折腾多智能体协同控制,发现基础的一致性算法虽然简单,但用来理解群体行为特别直观。今天就拿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秒后四个智能体的位置收敛到同一值(初始位置的平均值),而控制量则逐渐衰减到零。这说明系统达到了静态一致状态。
几个值得注意的细节:
- 步长dt不宜过大,否则会出现数值不稳定
- 邻接矩阵的对称性保证了收敛速度
- 初始位置的平均值即为系统平衡点
- 控制输入曲线呈现指数衰减特征
改个初始位置试试?比如把x0设成[20; -15; 30; -8],会发现收敛时间变长但最终仍趋于一致。这说明算法的鲁棒性——只要通信拓扑连通,初始状态不影响最终收敛性。
对于想深入研究的同学,可以尝试:
- 调整通信拓扑(比如去掉一条边)
- 加入时延或噪声
- 改用二阶动力学模型
这些扩展都会带来新的有趣现象,但那个就是后话了。今天的代码已经打包放在GitHub,复制粘贴就能跑,评论区等你们交作业~
