欢迎大家来到IT世界,在知识的湖畔探索吧!
多智能体系统(multi-agent system,MAS) 是一种全新的分布式计算技术。自20 世纪70年代出现以来得到迅速发展,已经成为一种进行复杂系统分析与模拟的思想方法与工具。
多智能体系统协同控制算法起源于计算机领域关于分布式计算的研究,后由于数学家们的强势加盟,控制领域的研究一度占领高地。随着人工智能的发展,以多智能体强化学习为代表作的计算机领域专家又重回巅峰。
名词解释
一个多智能体系统(multi-agent system,缩写M.A.S.),是由在一个环境中交互的多个智能体组成的计算系统。多智能体系统也能被用在解决分离的智能体以及单层系统难以解决的问题。智能可以由一些方法,函数,过程,搜索算法或加强学习来实现。尽管存在相当大的重叠,然而一个多智能体系统并不总是一个基于智能体的模型(ABM)表现一致。ABM的目标是寻找遵循简单规则的智能体(这些智能体不需要体现出太强的“智慧”)集体行为的解释,通常在自然系统又或者解决具体的工程问题。ABM的术语经常在学术界被运用,而MAS的术语经常在工程技术中运用。多主体系统的研究课题可以给予一个合适的视角去观察网络贸易,灾害应对以及社会结构建模。
实际应用
多智能体系统已经在各种实际领域应用。
由多智能体构成的智能分布式交通信号控制系统已经在城市复杂路网拥堵地区使用显著提高通行效率,降低等待时间,并减少尾气排放。
多智能体系统的特点
MAS中每个智能体具有独立性和自主性。
MAS支持分布式应用,具有良好的模块性。
MAS按面向对象的方法构造多层次、多元化的智能体。
MAS是一个协调式的系统,也是一个集成系统。
在MAS中,智能体之间相互通讯,彼此协调,并行地求解问题,提高了问题求解效率。
同一个MAS中各个智能体可以是异构的。
在MAS中,不同领域的专家系统、同一领域不同的专家系统可以协作求解单一专家系统难以解决的问题。
多智能体系统的基本类型
BDI模型:
是一个概念和逻辑上的理论模型,是研究Agent理性和推理机制的基础。
协商模型:
Agent的协作行为一般通过协商而产生。合同网协议就是协商模型的典型代表,主要解决任务分配、资源冲突和知识冲突等问题。
协作规划模型:
用于制订其协调一致的问题规划。
自协调模型:
随环境变化自适应地调整行为。
多智能体系统的体系结构
网络结构:
Agent之间都是直接通信的,通信和状态知识都是固定的。
联盟结构:
若干相距较近的Agent通过一个叫做协助者的Agent来进行交互,而远程Agent之间的交互和消息发送是由局部Agent群体的协助者Agent协作完成的。
黑板结构:
黑板结构中的局部Agent把信息存放在可存取的黑板上,实现局部数据共享。
原文链接:https://blog.csdn.net/weixin_/article/details/
撇开复杂的论文,我们先来看两个简单例子,理解一下分布式一致性算法。
例1、分蛋糕问题(集中式)。小多、小智、小能、小体四个人合买了一块20斤大蛋糕。小智作为智商担当负责分蛋糕,鸡贼的他切的蛋糕有的多有的少,自己拿了8斤,给女朋友小体6斤,分了小能4斤,小多拿的最少,只有2斤。小多和小能肯定不愿意,花同样的钱,出同样的力,凭什么自己分到的蛋糕少了?于是他们要求平均分。请问应该怎么分?
这问题也太简单了,一共20斤,4个人,一人称5斤不就完事了。但要注意,这是一种集中式控制方案。我们需要知道:①蛋糕总数是20斤;②一共有4个人。然后每个人的分的蛋糕=20/4=5斤。
例2、分蛋糕问题(分布式)。小多、小智、小能、小体四个人合买了一块蛋糕,老板给的时候随意切了几下。各自回家后,小多发现自己只有2斤,小智有8斤,小能有4斤,小体有6斤。现在的情况是:①他们都不知道大蛋糕一共有几斤;②他们都是交了相同的钱,但是不知道一共有几个人合买;③他们都只和自己的邻居交流,交流方式如下图,且已经发现彼此数量不一样,小多很生气。问:如何在现有的交流方式下,实现蛋糕的平均分配?
显然,由于不知道蛋糕总量和总人数,无法用简单的除法得到每个应该分配的蛋糕数。对于每个agent,已知条件是:自己和邻居的蛋糕数量。有没有一种算法能够在这样的情况下,实现蛋糕均分呢?
我们可以这样做:①每隔一段时间T,让每个agent都把自己的蛋糕量和邻居的蛋糕数相加,求平均值。②如果平均值小于自己当前蛋糕量,则将多余的量放到公共平台上,让其他agent去取;如果平均值大于当前蛋糕量,则从公共平台上去取其他agent放上去的蛋糕。
不断重复①②步骤,直到每个agent的蛋糕量不再变化,则每个agent此时的蛋糕应该就是总量的平均值。
我们用数据来看一下上述迭代过程:
简单起见,我们在Excel中进行迭代过程。初始值记为第0步,根据前述Agent之间的交流方式可知,每个Agent下一步的值,都是上一步自身值与邻居值的平均值。完成第1步的公式输入后,直接往下拉,生成15步迭代。
从图中可以看出,经过几次迭代后,每个人手里的蛋糕已经接近平均值5斤了。
可见,通过这种分布式的分蛋糕方式,也能实现我们平均分配蛋糕的目的。并且注意到,每个Agent都不知道系统的整体信息,我们其实是在用“局部信息”获取“整体信息”。
也可以在matlab中,进行编程。
clear;clc N = 15; t=1:N; X1 = zeros(4,N); X1(1,1) = 2; X1(2,1) = 8; X1(3,1) = 4; X1(4,1) = 6; for k = 2:N X1(1,k) = (X1(1,k-1)+X1(2,k-1)+X1(4,k-1))/3; X1(2,k) = (X1(1,k-1)+X1(2,k-1)+X1(3,k-1))/3; X1(3,k) = (X1(2,k-1)+X1(3,k-1)+X1(4,k-1))/3; X1(4,k) = (X1(3,k-1)+X1(4,k-1)+X1(1,k-1))/3; end plot(t,X1(1,:),t,X1(2,:),t,X1(3,:),t,X1(4,:))
欢迎大家来到IT世界,在知识的湖畔探索吧!
迭代过程如下图所示。
我们再来看一个多智能体协同(这里指集聚现象,flocking)的例子。
看动物世界的时候,我们观察到这些小可爱们能够神奇的聚集在一起,向某个特定的方向前进,彼此之间还不碰撞。这就启发学者提出了三条规则:①保持距离:避免邻居之间的冲突;②保持联系:避免邻居之间过于疏远;③同心同德:所有人步调一致,向一个目标进发。
简单起见,这里只考虑前两条规则。看看我们如何把“世界观:保持距离、保持联系”变成“方法论:代码”。
例3、若即若离问题。小多、小智、小能和小体四个人,一起从家里出发去学校。他们的家庭地址虽然不同,但是都要走同一条路,因此相约结伴而行。一方面他们是好朋友,一旦彼此之间的距离太远了,比如超过10米了,就要相互靠近;另一方面每个人都有自己的舒适圈,一旦彼此之间的距离太近了,比如小于0.5米了,就要相互散开一点。已知4个人的家庭地址(二维坐标)、舒适圈(0.5米)、吸引圈(10米),问:如何设计分布式控制策略,使他们最终能够保持所有人都舒适的距离一起上学?并用图形展示。
我们可以这样做:每隔一段时间T,让每个人都以10米为半径,看看里面有没有邻居。如果有邻居,判断一下他们有没有越界(距离小于0.5米),离越界的朋友远一点(离开的方向为直线后退,后退的长度为两个人之间的距离乘以系数c),离疏远的朋友近一点(接近的方向为直线靠近,靠近的长度为两个之间的距离乘以系数d)。
不断重复这个过程,直到每个人之间的距离在保持一定的范围内,则四个人都在比较舒适的距离上了。
从上图中可以看出,经过一段时间的迭代后,四个人的位置处于一个比较舒适的距离上了:大于0.5,且在0.5附近。d12代表agent 1(小多)与agent 2(小智)之间的距离。
分蛋糕问题是一个典型的分布式一致性算法的例子,在控制领域中,通常可用于无线传感器网络状态估计等例子.
若即若离问题是一个典型的分布式协同算法的例子,在控制领域中,通常可用于无人机编队、机器人编队等问题。
我们再来回看一下分蛋糕问题。如果四个人之间的交流方式变成单向的,还能实现平均分配么?
答案是:可以。
那如果交流方式改成链式的呢?还能收敛到平均值么
答案是:四个人的蛋糕量会收敛到相同值,但是不是平均值。
可见,分布式一致性算法的实现与多智能体之间的交流方式密切相关。
前面的例子中,我们从文字描述出发,进行了代码编程,并实现控制目标,从文学向科学跨进了一步,但是这还不够。我们给出的策略还是不够数学,不够严谨。
从下篇教程开始,将会开始涉及大量的数学概念,从而把多智能体一致性算法建立在严密的数学推导之上。
若即若离问题详细代码:
欢迎大家来到IT世界,在知识的湖畔探索吧!%% close all clear;clc; N = 500; %迭代步数 t = 1:N; X1 = zeros(4,2,N); D = 5; X1(1,:,1) = ceil(rand(1,2)*10); % 产生随机位置 X1(2,:,1) = ceil(rand(1,2)*10); X1(3,:,1) = floor(rand(1,2)*10); X1(4,:,1) = floor(rand(1,2)*10); % X1(1,:,1) = [1 5]; % 给定固定位置 % X1(2,:,1) = [2 6]; % X1(3,:,1) = [4 1]; % X1(4,:,1) = [6 3]; d_reject = 0.5; % 舒适圈 d_connect = 10; % 吸引圈 k_connect = 0.01; % 吸引系数 k_reject = 0.03; % 排斥系数 d11 = zeros(1,N); % agent之间的距离, ① d12 = d21; ② 也可以写出大矩阵形式,节省代码行数。 d12 = zeros(1,N); d13 = zeros(1,N); d14 = zeros(1,N); d21 = zeros(1,N); d22 = zeros(1,N); d23 = zeros(1,N); d24 = zeros(1,N); d31 = zeros(1,N); d32 = zeros(1,N); d33 = zeros(1,N); d34 = zeros(1,N); d41 = zeros(1,N); d42 = zeros(1,N); d43 = zeros(1,N); d44 = zeros(1,N); for k = 2:N % 开始迭代 % 首先计算出 彼此之间的距离 写代码 是从上帝视角来看的,所以有全局信息, % 但是对于每一个agent来说,他只有邻居的信息。 d11(k) = 0; d12(k) = sqrt( (X1(1,1,k-1) - X1(2,1,k-1))^2 + (X1(1,2,k-1) - X1(2,2,k-1))^2 ); d13(k) = sqrt( (X1(1,1,k-1) - X1(3,1,k-1))^2 + (X1(1,2,k-1) - X1(3,2,k-1))^2 ); d14(k) = sqrt( (X1(1,1,k-1) - X1(4,1,k-1))^2 + (X1(1,2,k-1) - X1(4,2,k-1))^2 ); d21(k) = d12(k); d22(k) = 0; d23(k) = sqrt( (X1(2,1,k-1) - X1(3,1,k-1))^2 + (X1(2,2,k-1) - X1(3,2,k-1))^2 ); d24(k) = sqrt( (X1(2,1,k-1) - X1(4,1,k-1))^2 + (X1(2,2,k-1) - X1(4,2,k-1))^2 ); d31(k) = d13(k); d32(k) = d23(k); d33(k) = 0; d34(k) = sqrt( (X1(3,1,k-1) - X1(4,1,k-1))^2 + (X1(3,2,k-1) - X1(4,2,k-1))^2 ); d41(k) = d14(k); d42(k) = d24(k); d43(k) = d34(k); d44(k) = 0; % 第1个agent X1(1,:,k) = X1(1,:,k-1); neighbor1_reject = find( [d11(k) d12(k) d13(k) d14(k)] <= d_reject ); % 找到越界邻居 num_reject = length(neighbor1_reject); % 越界邻居的数目 if num_reject >1 % 与自己的距离肯定小于0,但是不属于越界 for m = 1 : num_reject % 注意 “-”代表的后退 X1(1,:,k) = X1(1,:,k) - k_reject * ( X1(neighbor1_reject(m),:,k-1) - X1(1,:,k-1)); end end % 找到各自的未越界的邻居 neighbor1_connect = find( ([d11(k) d12(k) d13(k) d14(k)] <= d_connect) & ([d11(k) d12(k) d13(k) d14(k)] > d_reject) ); num_connect = length(neighbor1_connect); if num_connect >0 for m = 1 : num_connect % 注意“+”代表的靠近 X1(1,:,k) = X1(1,:,k) + k_connect * ( X1(neighbor1_connect(m),:,k-1) - X1(1,:,k-1)); end end % 第2个agent X1(2,:,k) = X1(2,:,k-1); neighbor2_reject = find( [d21(k) d22(k) d23(k) d24(k)] <= d_reject ); num_reject = length(neighbor2_reject); if num_reject >1 for m = 1 : num_reject X1(2,:,k) = X1(2,:,k) - k_reject * ( X1(neighbor2_reject(m),:,k-1) - X1(2,:,k-1)); end end neighbor2_connect = find( ([d21(k) d22(k) d23(k) d24(k)] <= d_connect) & ([d21(k) d22(k) d23(k) d24(k)] > d_reject) ); num_connect = length(neighbor2_connect); if num_connect >0 for m = 1 : num_connect X1(2,:,k) = X1(2,:,k) + k_connect * ( X1(neighbor2_connect(m),:,k-1) - X1(2,:,k-1)); end end % 第3个agent X1(3,:,k) = X1(3,:,k-1); neighbor3_reject = find( [d31(k) d32(k) d33(k) d34(k)] <= d_reject ); num_reject = length(neighbor3_reject); if num_reject >1 for m = 1 : num_reject X1(3,:,k) = X1(3,:,k) - k_reject * ( X1(neighbor3_reject(m),:,k-1) - X1(3,:,k-1)); end end % 找到各自的邻居 neighbor3_connect = find( ([d31(k) d32(k) d33(k) d34(k)] <= d_connect) & ([d31(k) d32(k) d33(k) d34(k)] > d_reject) ); num_connect = length(neighbor3_connect); if num_connect >0 for m = 1 : num_connect X1(3,:,k) = X1(3,:,k) + k_connect * ( X1(neighbor3_connect(m),:,k-1) - X1(3,:,k-1)); end end % 第4个agent X1(4,:,k) = X1(4,:,k-1); neighbor4_reject = find( [d41(k) d42(k) d43(k) d44(k)] <= d_reject ); num_reject = length(neighbor4_reject); if num_reject >1 for m = 1 : num_reject X1(4,:,k) = X1(4,:,k) - k_reject * ( X1(neighbor4_reject(m),:,k-1) - X1(4,:,k-1)); end end % 找到各自的邻居 neighbor4_connect = find( ([d41(k) d42(k) d43(k) d44(k)] <= d_connect) & ([d41(k) d42(k) d43(k) d44(k)] > d_reject) ); num_connect = length(neighbor4_connect); if num_connect >0 for m = 1 : num_connect X1(4,:,k) = X1(4,:,k) + k_connect * ( X1(neighbor4_connect(m),:,k-1) - X1(4,:,k-1)); end end end %% figure hf = gcf; hf.Color= [1 1 1]; % 控制图形的整体颜色。(scope中被默认为灰黑色,此处修改为白色) hp1 = plot3(t,reshape(X1(1,1,:),1,N),reshape(X1(1,2,:),1,N)); % 新建第一条曲线句柄 hp1.Color = 'g'; % 设置曲线颜色 hp1.LineStyle = '-'; % - -- -. : 设置曲线线型 hp1.LineWidth = 2; % 设置曲线 线宽 hold on hp1 = plot3(t,reshape(X1(2,1,:),1,N),reshape(X1(2,2,:),1,N)); % 新建第一条曲线句柄 hp1.Color = 'b'; % 设置曲线颜色 hp1.LineStyle = '-'; % - -- -. : 设置曲线线型 hp1.LineWidth = 2; % 设置曲线 线宽 hold on hp1 = plot3(t,reshape(X1(3,1,:),1,N),reshape(X1(3,2,:),1,N)); % 新建第一条曲线句柄 hp1.Color = 'c'; % 设置曲线颜色 hp1.LineStyle = '-'; % - -- -. : 设置曲线线型 hp1.LineWidth = 2; % 设置曲线 线宽 hold on hp1 = plot3(t,reshape(X1(4,1,:),1,N),reshape(X1(4,2,:),1,N)); % 新建第一条曲线句柄 hp1.Color = 'm'; % 设置曲线颜色 hp1.LineStyle = '-'; % - -- -. : 设置曲线线型 hp1.LineWidth = 2; % 设置曲线 线宽 ht = title(''); % 获取当前标题句柄 ht.Interpreter = 'tex'; % 解释器。若没有公式,默认即可。 若有公式,可设置为 'latex'。 ht.String = '保持距离、保持联系'; % 标题内容。若解释器设置为'latex',则可输入公式,如 '$A_{i}^{2}#39; ht.Color = [0 0 0]; % 标题颜色 ht.FontName = 'Helvetica'; % 字体 ht.FontSize = 12; % 字体大小 ht.FontWeight = 'bold'; % 字体宽度 ha = gca; % 获取当前图形的坐标轴句柄 ha.LineWidth = 1.000; % 设置 坐标轴线宽 ha.FontWeight = 'bold'; % 设置字体的宽度, bold (粗体)或 normal(正常) ha.GridLineStyle = '--'; ha.FontSize = 12; % 字体大小 ha.XMinorGrid = 'off'; % 这里设置的是 细的网格,也可以设置粗网格:ha.XGrid = 'on'; ha.YMinorGrid = 'off'; ha.XGrid = 'on'; % 这里设置的是 细的网格,也可以设置粗网格:ha.XGrid = 'on'; ha.YGrid = 'on'; ha.Box = 'off'; % 取消 框线 , 有些论文要求不要框 hXL = xlabel('t'); % 获取横坐标句柄 % hXL.Interpreter = 'latex'; % 同title; hXL.Interpreter = 'tex'; % 同title; hXL.String = '迭代步数'; hXL.Color = [0 0 0]; hXL.FontName = 'Helvetica'; hXL.FontSize = 12; hXL.FontWeight = 'bold'; hYL = ylabel('y'); % hYL.Interpreter = 'latex'; hYL.Interpreter = 'tex'; hYL.String = '横坐标分量'; hYL.Color = [0 0 0]; hYL.FontName = 'Helvetica'; hYL.FontSize = 12; hYL.FontWeight = 'bold'; hYL.Rotation = 0; hYL = zlabel('y'); % hYL.Interpreter = 'latex'; hYL.Interpreter = 'tex'; hYL.String = '纵坐标分量'; hYL.Color = [0 0 0]; hYL.FontName = 'Helvetica'; hYL.FontSize = 12; hYL.FontWeight = 'bold'; hYL.Rotation = 90; legend('小多','小智','小能','小体') %% figure hf = gcf; hf.Color= [1 1 1]; % 控制图形的整体颜色。(scope中被默认为灰黑色,此处修改为白色) hp1 = plot(t(2:end),d12(2:end)); % 新建第一条曲线句柄 hp1.Color = 'g'; % 设置曲线颜色 hp1.LineStyle = '-'; % - -- -. : 设置曲线线型 hp1.LineWidth = 2; % 设置曲线 线宽 hold on hp1 = plot(t(2:end),d13(2:end)); % 新建第一条曲线句柄 hp1.Color = 'b'; % 设置曲线颜色 hp1.LineStyle = '-'; % - -- -. : 设置曲线线型 hp1.LineWidth = 2; % 设置曲线 线宽 hold on hp1 = plot(t(2:end),d14(2:end)); % 新建第一条曲线句柄 hp1.Color = 'c'; % 设置曲线颜色 hp1.LineStyle = '-'; % - -- -. : 设置曲线线型 hp1.LineWidth = 2; % 设置曲线 线宽 hold on hp1 = plot(t(2:end),d23(2:end)); % 新建第一条曲线句柄 hp1.Color = 'm'; % 设置曲线颜色 hp1.LineStyle = '-'; % - -- -. : 设置曲线线型 hp1.LineWidth = 2; % 设置曲线 线宽 hold on hp1 = plot(t(2:end),d24(2:end)); % 新建第一条曲线句柄 hp1.Color = 'y'; % 设置曲线颜色 hp1.LineStyle = '-'; % - -- -. : 设置曲线线型 hp1.LineWidth = 2; % 设置曲线 线宽 hold on hp1 = plot(t(2:end),d34(2:end)); % 新建第一条曲线句柄 hp1.Color = 'k'; % 设置曲线颜色 hp1.LineStyle = '-'; % - -- -. : 设置曲线线型 hp1.LineWidth = 2; % 设置曲线 线宽 ht = title(''); % 获取当前标题句柄 ht.Interpreter = 'tex'; % 解释器。若没有公式,默认即可。 若有公式,可设置为 'latex'。 ht.String = 'Agent 之间的距离'; % 标题内容。若解释器设置为'latex',则可输入公式,如 '$A_{i}^{2}#39; ht.Color = [0 0 0]; % 标题颜色 ht.FontName = 'Helvetica'; % 字体 ht.FontSize = 12; % 字体大小 ht.FontWeight = 'bold'; % 字体宽度 ha = gca; % 获取当前图形的坐标轴句柄 ha.LineWidth = 1.000; % 设置 坐标轴线宽 ha.FontWeight = 'bold'; % 设置字体的宽度, bold (粗体)或 normal(正常) ha.GridLineStyle = '--'; ha.FontSize = 12; % 字体大小 ha.XMinorGrid = 'off'; % 这里设置的是 细的网格,也可以设置粗网格:ha.XGrid = 'on'; ha.YMinorGrid = 'off'; ha.XGrid = 'on'; % 这里设置的是 细的网格,也可以设置粗网格:ha.XGrid = 'on'; ha.YGrid = 'on'; ha.Box = 'off'; % 取消 框线 , 有些论文要求不要框 hXL = xlabel('t'); % 获取横坐标句柄 % hXL.Interpreter = 'latex'; % 同title; hXL.Interpreter = 'tex'; % 同title; hXL.String = '迭代步数'; hXL.Color = [0 0 0]; hXL.FontName = 'Helvetica'; hXL.FontSize = 12; hXL.FontWeight = 'bold'; hYL = ylabel('y'); % hYL.Interpreter = 'latex'; hYL.Interpreter = 'tex'; hYL.String = '距离'; hYL.Color = [0 0 0]; hYL.FontName = 'Helvetica'; hYL.FontSize = 12; hYL.FontWeight = 'bold'; hYL.Rotation = 0; legend('d12','d13','d14','d23','d24','d34')
编辑于 2021-05-31 22:01
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/89024.html