├── Figure_1.png ├── MASfirst_order.m ├── MASsecond_order.m ├── README.md ├── first_order_agent.py └── mas2_ode45.m /Figure_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Say-Hello2y/MultiAgentSystem/a7c6106245ae1575d1be5da1b76ed7c81d6e51c9/Figure_1.png -------------------------------------------------------------------------------- /MASfirst_order.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Say-Hello2y/MultiAgentSystem/a7c6106245ae1575d1be5da1b76ed7c81d6e51c9/MASfirst_order.m -------------------------------------------------------------------------------- /MASsecond_order.m: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Say-Hello2y/MultiAgentSystem/a7c6106245ae1575d1be5da1b76ed7c81d6e51c9/MASsecond_order.m -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MultiAgentSystem 2 | 针对基本的一阶二阶多智能体控制,给出了基本的Matlab仿真 3 | 4 | 对于二阶多智能体给出了两种方法实现 5 | 6 | 1.mas2_ode45.m使用matlab自带的ode45解法求解微分方程,精度更高 7 | 8 | 2.MASsecond_order.m使用欧拉法求解微分方程,精度一般 9 | 10 | (新增)增加了在一阶多智能体的情况下,当每个智能体的状态是二维(多维)时状态趋于一致的python代码。 11 | 12 | -------------------------------------------------------------------------------- /first_order_agent.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | from mpl_toolkits.mplot3d import Axes3D 4 | 5 | X0 = np.arange(1,13).reshape(6,2) 6 | 7 | print(X0) 8 | 9 | x=X0 10 | A = np.array([[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]]) #邻接矩阵 11 | # print(A) 12 | D=np.diag(A.sum(axis=1))#利用Laplacian 行和为0构造D矩阵 13 | # print(D) 14 | L=D-A #利用算法求出Laplacian矩阵 15 | dt = 0.01 16 | T = 10 17 | t = np.arange(0,T/dt)*dt 18 | #print(t.size) 19 | u = np.zeros((t.size,6,2)) 20 | X = np.zeros((t.size,6,2)) 21 | for i in range(t.size): 22 | #print(np.dot(-L,x)) 23 | u[i,:,:]=np.dot(-L,x) 24 | X[i,:,:]=x 25 | x=dt*u[i,:,:]+x 26 | 27 | # 画图 28 | fig=plt.figure() 29 | ax1 = Axes3D(fig) 30 | 31 | for i in range(6): 32 | ax1.plot3D(t,X[:,i,0],X[:,i,1]) #绘制空间曲线 33 | 34 | #图例 35 | ax1.set_xlabel("Time Axis") 36 | ax1.set_ylabel("x[0] Axis") 37 | ax1.set_zlabel("x[1] Axis") 38 | ax1.set_title("二维状态向量一致性") 39 | plt.show() 40 | -------------------------------------------------------------------------------- /mas2_ode45.m: -------------------------------------------------------------------------------- 1 | clear; 2 | close all; 3 | clc; 4 | X0=[1;2;3;4]; 5 | V0=[1;2;3;4]; 6 | gamma=1; 7 | A=[0 1 0 1;1 0 1 0;0 1 0 1;1 0 1 0];%邻接矩阵 8 | D=diag(sum(A,2));%利用Laplacian 行和为0构造D矩阵 9 | L=D-A;%利用定义求出Laplacian矩阵 10 | u0=-(L*X0+gamma*L*V0);%u0初值 11 | options = odeset('MaxStep', 1e-2, 'RelTol',1e-2,'AbsTol',1e-4); 12 | [t,y] = ode45(@odefun,[0 15],[X0;V0;u0],options); 13 | X=y(:,1:4); 14 | V=y(:,5:8); 15 | u=y(:,9:12); 16 | %画图部分 17 | figure(1); 18 | plot(t,X) 19 | title('status diagram'); 20 | xlabel('time'); 21 | ylabel('status'); 22 | figure(2); 23 | plot(t,V) 24 | title('velocity diagram'); 25 | xlabel('time'); 26 | ylabel('velocity'); 27 | figure(3) 28 | plot(t,u) 29 | title('acc diagram'); 30 | xlabel('time'); 31 | ylabel('u'); 32 | %函数部分 33 | function dydt = odefun(t,y) 34 | dydt = zeros(12,1);% 指定dydt为微分方程变量的导数,dydt代表(x1,x2,x3,x4,v1,v2,v3,v4,u1,u2,u3,u4)^T的导数,y代表 35 | % (x1,x2,x3,x4,v1,v2,v3,v4,u1,u2,u3,u4)^T ,x代表位置,v代表速度,u代表控制变量即加速度 36 | A=[0 1 0 1;1 0 1 0;0 1 0 1;1 0 1 0];%邻接矩阵 37 | D=diag(sum(A,2));%利用Laplacian 行和为0构造D矩阵 38 | L=D-A;%利用算法求出Laplacian矩阵 39 | gamma=1; 40 | dydt(1:4)=y(5:8);% 41 | dydt(5:8)=y(9:12);%-(L*y(1:4)+gamma*L*y(5:8)); 42 | dydt(9:12)=-(L*y(5:8)+gamma*L*y(9:12)); 43 | end 44 | 45 | --------------------------------------------------------------------------------