本文的详细代码在https://github.com/Say-Hello2y/MultiAgentSystem中可找到。
一阶二阶多智能体一致性控制介绍及Matlab程序
智能体本是人工智能领域的概念,控制领域的智能体一般指具有一定的 动力学和运动学特性且能同周围环境及其他个体交换信息的实体。在过去的十几 年里,多智能体系统 (multi-agent systems, MAS) 的协同控制问题受到了国际控制界越来越多的关注。多智能体系统的建模起源于群居动物,如昆虫,鱼群,鸟 群等 。这些群居动物能够共同完成一些单个个体很难完成的任务。
图论(graph theory),是组合数学分支,和其他数学分支,如群论、矩阵论、拓扑学有着密切关系。图是图论的主要研究对象。图是由若干给定的顶点及连接两顶点的边所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系。顶点用于代表事物,连接两顶点的边则用于表示两个事物间具有这种关系。
在多智能体研究领域,通常假定智能体之间通过通信网络或者传感器网络交换信息,采用有向图(Directed graphs)或无向图(Undirected graphs)来描述智能体之间的信息交换。无向图是指连接之间是没有方向的,即若节点A与节点B有连接,则意味着A可以和B通信,B也可以和A通信,而若为有向图,A,B之间的通信关系并不是一致的,即A可以和B通信不能推出B可以和A通信。
在介绍图的Laplacian矩阵之前,先引入图的邻接矩阵(Adjacency matrix)的概念,无向图的邻接矩阵计算方法是每条边为对应的单元加上1,而每个自环加上2。这样让某一节点的度数可以通过邻接矩阵的对应行或者列求和得到。如下图所示

采用第二种定义,则
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=D−A,由定义可知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=⎣⎢⎢⎢⎢⎢⎢⎡1−10−10001−1000001−10−10002−1000001−1−100002⎦⎥⎥⎥⎥⎥⎥⎤(3)
关于图论方面就介绍到这里,下面介绍如何根据图的Laplacian矩阵设计多智能体一致性控制器。
本文的详细代码在https://github.com/Say-Hello2y/MultiAgentSystem中可找到。
多智能体一致性的概念,对一阶系统而言就是状态趋于一致,即在
t
→
∞
t\rightarrow\infty
t→∞时,有
x
i
→
x
j
x_i\rightarrow x_j
xi→xj成立。
最简单的智能体 (如阻尼器) 的动力学可用一阶积分器模型来描述 式中,
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=1∑Naij(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 xi→xj成立。而对于有向图而言, 包含一个有向生成树是智能体网络实现一致的充分必要条件。
该文献还指出,智能体的状态最后趋于一致的终值是由智能体状态的初值和通信拓扑图共同决定的,其终值可表示为
∑
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');
比一阶积分器模型稍复杂一些的智能体动力学模型是二阶积分器模型
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=1∑Naij((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∣μi∣cos(tan−1(−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}
xi→xj→i=1∑Nrixi(0)+ti=1∑Nrivi(0)vi→vj→i=1∑Nrivi(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, 北京理工大学.
当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少
我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
在我的Character模型中,我添加了:字符.rbbefore_savedoself.profile_picture_url=asset_path('icon.png')end但是,对于数据库中已存在的所有角色,它们的profile_picture_url为nil。因此,我想进入控制台并遍历所有这些并进行设置。在我试过的控制台中:Character.find_eachdo|c|c.profile_picture_url=asset_path('icon.png')end但这给出了错误:NoMethodError:undefinedmethod`asset_path'formain:O
当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question
我正在尝试将$stdout设置为临时写入一个文件,然后返回到一个文件。test.rb:old_stdout=$stdout$stdout.reopen("mytestfile.out",'w+')puts"thisgoesinmytestfile"$stdout=old_stdoutputs"thisshouldbeontheconsole"$stdout.reopen("mytestfile1.out",'w+')puts"thisgoesinmytestfile1:"$stdout=old_stdoutputs"thisshouldbebackontheconsole"这是输出。r