一阶二阶多智能体一致性控制的Matlab程序

一阶二阶多智能体一致性控制介绍及Matlab程序

本文的详细代码在https://github.com/Say-Hello2y/MultiAgentSystem中可找到


前言:多智能体控制的应用

智能体本是人工智能领域的概念,控制领域的智能体一般指具有一定的 动力学和运动学特性且能同周围环境及其他个体交换信息的实体。在过去的十几 年里,多智能体系统 (multi-agent systems, MAS) 的协同控制问题受到了国际控制界越来越多的关注。多智能体系统的建模起源于群居动物,如昆虫,鱼群,鸟 群等 。这些群居动物能够共同完成一些单个个体很难完成的任务。
自然界的协同控制

图1. 自然界的协同控制

一致性是多智能体控制的一个基本目标,许多多智能体任务都可转换为特殊的一致性控制任务。下面给出多智能体一致性任务分类:
多智能体一致性问题的分类
图2. 多智能体一致性分类

一、基础知识:图论与代数

1.图论介绍

图论(graph theory),是组合数学分支,和其他数学分支,如群论、矩阵论、拓扑学有着密切关系。图是图论的主要研究对象。图是由若干给定的顶点及连接两顶点的边所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系。顶点用于代表事物,连接两顶点的边则用于表示两个事物间具有这种关系。
在多智能体研究领域,通常假定智能体之间通过通信网络或者传感器网络交换信息,采用有向图(Directed graphs)或无向图(Undirected graphs)来描述智能体之间的信息交换。无向图是指连接之间是没有方向的,即若节点A与节点B有连接,则意味着A可以和B通信,B也可以和A通信,而若为有向图,A,B之间的通信关系并不是一致的,即A可以和B通信不能推出B可以和A通信。

2.图的Laplacian矩阵

在介绍图的Laplacian矩阵之前,先引入图的邻接矩阵(Adjacency matrix)的概念,无向图的邻接矩阵计算方法是每条边为对应的单元加上1,而每个自环加上2。这样让某一节点的度数可以通过邻接矩阵的对应行或者列求和得到。如下图所示
在这里插入图片描述

图3. 无向图的邻接矩阵

有向图的邻接矩阵一般是不对称的。可以有如下定义:
定义一:定义有向图的邻接矩阵中的某个元素 A i j A_{ij} Aij代表:
1.从i指向j的边的数目

2.从j指向i的边的数目

第一种定义广泛用于图论和社会网络分析(如:社会学、政治学、经济学、心理学)。
第二种更加常见于其他应用学科(如:动态系统、物理、网络学),这些学科有时用邻接矩阵A表示图上的线性动力, 这里使用第二种定义。给大家举个栗子,见下面的草图
shiyitu
图4. 有向图的例子

采用第二种定义,则
A = [ 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 ] (1) A=\left[ \begin{matrix} 0 & 0 & 0 &0 &0&1 \\ 1 & 0 & 0 &0 &0&0 \\ 0 & 1& 0 &0 &0&0\\ 1 & 0 & 1 &0 &0&0\\ 0 & 0 & 0 &1 &0&0\\ 0 & 0 & 1 &0 &1&0\\ \end{matrix} \right] \tag{1} A=010100001000000101000010000001100000(1)
以2,3节点为例, A 32 A_{32} A32代表矩阵第三行第二列,具体意义为象征第3个智能体与第2个智能体之间的通信关系,采用邻接矩阵的第二种定义则由于2节点到3节点有一条有向线段故 A 32 = 1 A_{32}=1 A32=1,而4节点没有指向3节点故 A 34 = 0 A_{34}=0 A34=0
定义二:图的入度矩阵D,入度矩阵是一个对角矩阵,对角线元素为终点在这个节点的边的条数,采用第二种定义的话,有向图的入度矩阵对角线元素就为邻接矩阵对应行和
D = [ 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0 2 ] (2) D=\left[ \begin{matrix} 1& 0 & 0 &0 &0&0 \\ 0 & 1 & 0 &0 &0&0 \\ 0 &0& 1 &0 &0&0\\ 0 & 0 & 0&2 &0&0\\ 0 & 0 & 0 &0 &1&0\\ 0 & 0 & 0 &0 &0&2\\ \end{matrix} \right] \tag{2} D=100000010000001000000200000010000002(2)
定义三:图的laplacian矩阵: L = D − A L=D-A L=DA,由定义可知laplacian矩阵行和为0
L = [ 1 0 0 0 0 − 1 − 1 1 0 0 0 0 0 − 1 1 0 0 0 − 1 0 − 1 2 0 0 0 0 0 − 1 1 0 0 0 − 1 0 − 1 2 ] (3) L=\left[ \begin{matrix} 1& 0 & 0 &0 &0&-1 \\ -1 & 1 & 0 &0 &0&0 \\ 0 &-1& 1 &0 &0&0\\ -1 & 0 & -1&2 &0&0\\ 0 & 0 & 0 &-1 &1&0\\ 0 & 0 & -1 &0 &-1&2\\ \end{matrix} \right] \tag{3} L=110100011000001101000210000011100002(3)
关于图论方面就介绍到这里,下面介绍如何根据图的Laplacian矩阵设计多智能体一致性控制器。

二、一阶二阶多智能体一致性控制介绍及代码(Matlab)

本文的详细代码在https://github.com/Say-Hello2y/MultiAgentSystem中可找到

1. 一阶智能体

多智能体一致性的概念,对一阶系统而言就是状态趋于一致,即在 t → ∞ t\rightarrow\infty t时,有 x i → x j x_i\rightarrow x_j xixj成立。
最简单的智能体 (如阻尼器) 的动力学可用一阶积分器模型来描述 式中,
x i ˙ ( t ) = u i ( t ) , i = 1 , … , N (4) \dot{x_i}(t)=u_i(t), i=1,\ldots,N \tag{4} xi˙(t)=ui(t),i=1,,N(4)

x i ( t ) ⊂ R p x_i(t)\subset R^p xi(t)Rp为智能体 i 的位置, u i ( t ) ⊂ R p u_i(t)\subset R^p ui(t)Rp为控制输入,N 为智能体的总数。这里假设控制输入可直接控制智能体的速度。Olfati-Saber 和 Murray 在文献中针对一阶积分器智能体网络提出了一种 一致性控制器
u i ( t ) = − ∑ j = 1 N a i j ( x i ( t ) − x j ( t ) ) , i = 1 , … , N (5) u_i(t)=- \sum_{j=1}^N a_{ij}(x_i(t)-x_j(t)),i=1,\ldots,N \tag{5} ui(t)=j=1Naij(xi(t)xj(t)),i=1,,N(5)

式中, a i j a_{ij} aij为邻接矩阵的第 (i, j) 项。Olfati-Saber 指出,对于智能体的通信拓扑 为无向图的情形,只要无向图是连通的,那么,在上式的作用下,一阶积分器智能体网络能够实现一致,即,当 t → ∞ t\rightarrow\infty t时,有 x i → x j x_i\rightarrow x_j xixj成立。而对于有向图而言, 包含一个有向生成树是智能体网络实现一致的充分必要条件。

该文献还指出,智能体的状态最后趋于一致的终值是由智能体状态的初值和通信拓扑图共同决定的,其终值可表示为 ∑ i = 1 N r i x i ( 0 ) \sum_{i=1}^N r_ix_i(0) i=1Nrixi(0)。其中 r = [ r 1 , … , r n ] T r=[r_1,\ldots,r_n]^T r=[r1,,rn]T 为 Laplacian 矩阵与零特征值相关的左特征向量且有 1 N T r = 1 1_N^Tr=1 1NTr=1成立。一致性控制 器可看作是一种负反馈控制。对智能体 i 来说,先把它的状态和它所有邻居的 状态作差,再求和后作负反馈。这种一致性控制器的思想后来被广泛应用于各类智能体网络。
上例的matlab实现一阶多智能体一致代码如下

clear;
close all;
clc;
X0=[1;2;3;4;5;6];%状态初始值
dt=0.01;T=10;%步长与仿真时间
t=0:dt:T;
n=length(t);
x=X0;
A=[0 0 0 0 0 1;1 0 0 0 0 0;0 1 0 0 0 0;1 0 1 0 0 0;0 0 0 1 0 0;0 0 1 0 1 0];%邻接矩阵
D=diag(sum(A,2));%利用Laplacian 行和为0构造D矩阵
L=D-A%利用算法求出Laplacian矩阵
for i=1:n
  u(:,i)=-L*x;
  X(:,i)=x;
  x=dt*u(:,i)+x;
end
%画出状态图与u随时间的图像
figure(1);
plot(t,X)
title('status diagram');
xlabel('time');
ylabel('status');
legend('x1','x2','x3','x4','x5','x6');
figure(2);
plot(t,u)
title('velocity diagram');
xlabel('time');
ylabel('u');
legend('u1','u2','u3','u4','u5','u6');

2.二阶智能体一致性控制(ode45算法)

比一阶积分器模型稍复杂一些的智能体动力学模型是二阶积分器模型
x i ˙ ( t ) = v i ( t ) v i ˙ ( t ) = u i ( t ) (6) \dot{x_i}(t)=v_i(t)\\ \dot{v_i}(t)=u_i(t) \tag{6} xi˙(t)=vi(t)vi˙(t)=ui(t)(6)
式中, x i ( t ) , v i ( t ) ⊂ R p x_i(t),v_i(t)\subset R^p xi(t),vi(t)Rp分别表示智能体 i 的位置和速度向量, u i ( t ) u_i(t) ui(t)仍表示控制输入。这里的二阶常系数微分方程可用来描述经典的牛顿第二定律模型,如自主车。二阶积分器模型假设控制输入可直接控制被控对象的加速度。对由上式描述的多智能体网络,Ren 提出了一种有效的一致性控制器。
u i = − ∑ j = 1 N a i j ( ( x i ( t ) − x j ( t ) ) + γ ( v i ( t ) − v j ( t ) ) ) , i = 1 , … , N (7) u_i=-\sum_{j=1}^Na_{ij}((x_i(t)-x_j(t))+\gamma(v_i(t)-v_j(t))),i=1,\ldots,N\tag{7} ui=j=1Naij((xi(t)xj(t))+γ(vi(t)vj(t))),i=1,,N(7)

式中, γ > 0 \gamma>0 γ>0 为待确定的常数增益。Ren 指出,对于连接的无向通信拓扑而言, 上式可使二阶积分器智能体的位置和速度都渐近趋于一致。但对于有向通信拓扑而言,则需要上式中的增益参数 γ \gamma γ满足条件
γ > max ⁡ ∀ R e ( μ i ) < 0 , I m ( μ i ) > 0 2 ∣ μ i ∣ cos ⁡ ( tan ⁡ − 1 ( I m ( μ i ) − R e ( μ i ) ) ) (8) \gamma>\max_{\forall Re(\mu_i)<0,Im(\mu_i)>0}\sqrt{\frac{2}{\lvert \mu_i \rvert \cos{(\tan^{-1}(\frac{Im(\mu_i)}{-Re(\mu_i)}))}}}\tag{8} γ>Re(μi)<0,Im(μi)>0maxμicos(tan1(Re(μi)Im(μi)))2 (8)

式中, μ i \mu_i μi为矩阵 − L -L L的第 i 个特征值。从这里可以看出,有向图下智能体实现 一致比无向图更加困难。同样,有向图需至少包含一个有向生成树。若智能体网络的位置和速度能趋于一致,则它们的终值由下式给出
x i → x j → ∑ i = 1 N r i x i ( 0 ) + t ∑ i = 1 N r i v i ( 0 ) v i → v j → ∑ i = 1 N r i v i ( 0 ) (9) x_i \rightarrow x_j \rightarrow \sum_{i=1}^Nr_ix_i(0)+t\sum_{i=1}^Nr_iv_i(0)\\ v_i\rightarrow v_j\rightarrow\sum_{i=1}^Nr_iv_i(0)\tag{9} xixji=1Nrixi(0)+ti=1Nrivi(0)vivji=1Nrivi(0)(9)
给定邻接矩阵(无向图)
A = [ 0 1 0 1 1 0 1 0 0 1 0 1 1 0 1 0 ] (1) A=\left[ \begin{matrix} 0 & 1 & 0 &1 \\ 1 & 0 & 1 &0 \\ 0 & 1& 0 &1 \\ 1 & 0 & 1 &0 \\ \end{matrix} \right] \tag{1} A=0101101001011010(1)
初始速度和初始状态一致 v , x = [ 1 , 2 , 3 , 4 ] T \mathbf{v,x}=[1 ,2, 3 ,4]^T v,x=[1,2,3,4]T,则使用ode45(ode45为一种微分方程解法,ode45表示采用四阶-五阶Runge-Kutta算法,它用4阶方法提供候选解,5阶方法控制误差,是一种自适应步长(变步长)的常微分方程数值解法,其整体截断误差为(Δx)^5。解决的是Nonstiff(非刚性)常微分方程。
求解微分方程的二阶智能体一致性代码为

clear;
close all;
clc;
X0=[1;2;3;4];
V0=[1;2;3;4];
gamma=1;
A=[0 1 0 1;1 0 1 0;0 1 0 1;1 0 1 0];%邻接矩阵
D=diag(sum(A,2));%利用Laplacian 行和为0构造D矩阵
L=D-A;%利用定义求出Laplacian矩阵
u0=-(L*X0+gamma*L*V0);%u0初值
options = odeset('MaxStep', 1e-2, 'RelTol',1e-2,'AbsTol',1e-4);
[t,y] = ode45(@odefun,[0 15],[X0;V0;u0],options);
X=y(:,1:4);
V=y(:,5:8);
u=y(:,9:12);
%画图部分
figure(1);
plot(t,X)
title('status diagram');
xlabel('time');
ylabel('status');
figure(2);
plot(t,V)
title('velocity diagram');
xlabel('time');
ylabel('velocity');
figure(3)
plot(t,u)
title('acc diagram');
xlabel('time');
ylabel('u');
%函数部分
function dydt = odefun(t,y)
dydt = zeros(12,1);% 指定dydt为微分方程变量的导数,dydt代表(x1,x2,x3,x4,v1,v2,v3,v4,u1,u2,u3,u4)^T的导数,y代表
% (x1,x2,x3,x4,v1,v2,v3,v4,u1,u2,u3,u4)^T ,x代表位置,v代表速度,u代表控制变量即加速度
A=[0 1 0 1;1 0 1 0;0 1 0 1;1 0 1 0];%邻接矩阵
D=diag(sum(A,2));%利用Laplacian 行和为0构造D矩阵
L=D-A;%利用算法求出Laplacian矩阵
gamma=1;
dydt(1:4)=y(5:8);%
dydt(5:8)=y(9:12);%-(L*y(1:4)+gamma*L*y(5:8));
dydt(9:12)=-(L*y(5:8)+gamma*L*y(9:12));
end


参考文献

[1.]Seyboth, G.S., D.V. Dimarogonas, and K.H. Johansson, Event-based broadcasting for multi-agent average consensus. Automatica, 2013. 49(1).
[2.]冯元珍, 多智能体系统一致性问题综述. 长江大学学报(自然科学版), 2011. 8(03): p. 84-87+9.
[3.]龙晓军, 多智能体系统的有限时间一致性跟踪. 2015, 大连海事大学.
[4.]佘莹莹, 多智能体系统一致性若干问题的研究. 2010, 华中科技大学.
[5.]王国锋, 多智能体系统的一致性问题研究. 2017, 东北大学.
[6.]杨大鹏, 多智能体系统的事件驱动一致性控制与多 Lagrangian 系统的分布式 协同. 2015, 北京理工大学.

  • 47
    点赞
  • 397
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 由于您没有提供任何事件或数据,我无法提供完整的代码。但是,下面是一个示例卡尔曼滤波器和事件模型的matlab代码,您可以将其用作参考。 % 定义卡尔曼滤波器 A = [1 0.1; 0 1]; B = [0.005; 0.1]; C = [1 0]; D = 0; Q = [0.1 0; 0 0.1]; R = 0.1; x0 = [0; 0]; P0 = [1 0; 0 1]; kf = kalman(A, B, C, D, Q, R, x0, P0); % 定义事件模型 eventModel = @(x) x(1)^2 + x(2)^2 - 1; % 处理数据并触发事件 t = 0:0.1:10; x = zeros(2, length(t)); y = zeros(1, length(t)); for i = 1:length(t) % 更新状态 u = sin(t(i)); [x(:, i), ~, ~] = kf.filter(u); % 计算观测值并检查事件 y(i) = C * x(:, i) + sqrt(R) * randn(); if eventModel(x(:, i)) > 0 % 触发事件 disp('Event triggered!'); % 更新卡尔曼滤波器状态和协方差矩阵 [x(:, i), kf.P] = kf.update(y(i)); end end % 绘制结果 subplot(2, 1, 1); plot(t, x(1, :), 'b-', t, x(2, :), 'r-'); xlabel('时间'); ylabel('状态'); legend('x1', 'x2'); subplot(2, 1, 2); plot(t, y, 'k-', t, eventModel(x), 'r--'); xlabel('时间'); ylabel('观测值和事件模型'); legend('观测值', '事件模型'); ### 回答2: 事件触发卡尔曼一致性是一种状态估计方法,其主要目的是通过只在系统动力学存在显著变化的时候进行状态估计,以节省计算资源和提高估计精度。 在进行事件触发卡尔曼一致性估计时,首先需要建立系统的状态空间模型和观测模型。然后,利用卡尔曼滤波器进行状态估计。卡尔曼滤波器根据系统模型和观测结果,不断更新状态估计值,以逼近真实状态。 事件触发卡尔曼一致性中的事件触发机制是指根据预设的触发条件,判断是否进行状态估计。触发条件通常基于系统的动力学特性和估计误差的变化。当触发条件满足时,执行状态估计;否则,跳过状态估计步骤。 在MATLAB中,可以通过编写相关代码实现事件触发卡尔曼一致性估计。具体步骤如下: 1. 根据系统的状态空间模型和观测模型,构建卡尔曼滤波器对象,设置滤波器参数。 2. 设置事件触发条件,例如可以通过计算状态估计误差的变化率或者残差的方差判断是否满足触发条件。 3. 进行状态估计循环。在每个时间步中,首先判断是否满足事件触发条件。如果满足,则执行状态估计步骤;否则,跳过状态估计步骤。 4. 在状态估计步骤中,调用卡尔曼滤波器的滤波函数,输入当前的观测结果和控制输入,得到更新后的状态估计值和协方差矩阵。 5. 根据具体应用需求,进行结果输出或者进一步处理。 需要注意的是,事件触发卡尔曼一致性的代码实现会根据具体的系统模型和触发条件而有所差异。因此,以上述步骤为大纲,在实际编写代码时需要根据具体情况进行适当修改和扩展。 ### 回答3: 卡尔曼一致性是指估计器的状态协方差矩阵和度量矩阵之间的关系。在卡尔曼滤波中,通过观测和预测值的比较,可以利用卡尔曼一致性判断滤波结果的有效性。以下是一个简单的用MATLAB编写的卡尔曼一致性判断的代码示例: ```matlab function KalmanConsistency() % 生成模拟数据 dt = 0.1; % 时间步长 t = 0:dt:10; % 时间序列 N = numel(t); % 时间序列长度 x_true = sin(t); % 真实状态值 x_meas = x_true + randn(size(t)); % 观测值,添加高斯噪声 % 初始化卡尔曼滤波参数 x_0 = 0; % 初始状态估计值 P_0 = 1; % 初始状态协方差矩阵 Q = 0.01; % 状态过程噪声方差 R = 1; % 观测噪声方差 x_est = x_0; % 初始状态估计值 P_est = P_0; % 初始状态协方差矩阵 % 计算卡尔曼滤波结果 for k = 1:N % 预测步骤 x_pred = x_est; P_pred = P_est + Q; % 更新步骤 K = P_pred / (P_pred + R); x_est = x_pred + K * (x_meas(k) - x_pred); P_est = (1 - K) * P_pred; % 计算卡尔曼一致性指标 S = P_pred + R; Consistency(k) = (x_meas(k) - x_pred)^2 / S; end % 绘制结果 figure; plot(t, x_true, 'b', 'LineWidth', 2); hold on; plot(t, x_meas, 'r', 'LineWidth', 1); plot(t, x_est, 'g', 'LineWidth', 1); xlabel('时间'); ylabel('状态值'); legend('真实状态', '观测值', '卡尔曼估计'); title('卡尔曼滤波结果'); figure; plot(t, Consistency, 'LineWidth', 1); xlabel('时间'); ylabel('卡尔曼一致性指标'); title('卡尔曼滤波一致性'); end ``` 在该代码中,首先生成了一个简单的模拟数据,其中包含了一个正弦波形的真实状态值以及在观测值中添加了高斯噪声。然后,通过初始化卡尔曼滤波参数,并且在每个时间步骤中进行预测和更新步骤,计算出卡尔曼滤波的状态估计值和协方差矩阵。 同时,在每个时间步骤中还计算了卡尔曼一致性指标,用来衡量滤波结果的有效性。最后,通过绘图展示了卡尔曼滤波的结果和一致性指标。 以上就是用MATLAB编写的一个简单的卡尔曼一致性判断的代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值