赞
踩
对于论文中的实验图进行复现和分析,本文中提到的论文应用环境以及代码均来自论文《Spectrum Sharing in Vehicular Networks Based on Multi-Agent Reinforcement Learning》,应用场景分析
我看蛮多人跟我要实验原图的,我把我复现的原图放到这里面了,有需就取,我设置的不需要积分
在写这一部分的时候,我还没有跑完MARL的模型,用的是包含在项目里的作者已经训练好的模型,这里分析的实现结果也是基于作者训练好的模型基础上的分析,作者训练好的模型有本论文中的MARL的模型,也有用作对比的SARL的模型,对比如下
这里让我注意的有两方面
横坐标是V2V的负载大小,也就是在一个时限之内V2V需要传输的包的大小,纵坐标是对于某一小段时间的所有子信道的信道容量进行求和,之后在时限(100ms)内进行平均,再对多次实验取平均
(- - - - - - -)表示的是在完全没有V2V传输的时候V2I的信道容量之和,是可以进行观测的上限之一,它在此的表示为不管怎么分配频谱资源和功率,都不会比这个容量更多
(▾- -▾- -▾)表示每次都选择能让V2V传输速率最大的链路进行分配,利用对传输环境的建模,在每一步都一个一个尝试,寻找可以让V2V信道容量最大的分配方案,根据尝试出的这个让V2V信道容量最大的方法去实施,没有实际意义,因为是站在上帝视角去寻找最优,而现实应用场景中不会存在上帝视角,这是一种理想化的情况。做个类比,相当于你去买彩票,你把所有彩票全刮了,找到了一个奖金最大的彩票,然后一个响指,时间倒流了,你回到了买彩票前,你找到了那个你找到的奖金最大的彩票,但是还没刮开,你拿着它去找老板结账,说我买它,然后当着众人的面刮开惊艳全场ಠ_ಠ(做梦素材增加了)
(●—●—●)表示MARL多代理强化学习模型,在集中进行训练模型之后,分布式的让每个V2V代理运行这个模型,此时他们就不会互相知道对方的选择,训练的时候使用固定的数据包大小(2*1060Bytes),但是在测试的时候会改变数据包的大小,可以明显看到他很接近刚才提到的最大V2V的性能上限,并且比后面要说的两种方法优很多
(◆—◆—◆)表示SARL单代理强化学习模型,每个时刻只有一个V2V代理根据本地获得的信息和训练的DQN更新动作(信道和功率的选择),而其他代理动作不变。所有V2V代理使用的是相同的模型,同一个DQN,但是执行的时候是分布式的,也就是执行的时候每个V2V代理人手一个DQN,只不过他们相同,这个DQN不会考虑别人的选择。并且每时刻仍然只更新一个V2V代理,宏观看,貌似只有一个DQN在工作,不存在同时有两个及以上的DQN同时工作,注意每时刻只更新一个代理的行为。MARL与之不同的点在于MARL会考虑别人的选择。
(x—x—x)表示随机选择的一种算法下限,也就是不做任何决策,随便选择信道随便选择功率
除了没有V2V传输的情况(- - - - - -)不会受到V2V载荷大小的影响,其他信道分配方法都会使分配给V2I的信道容量随着V2V数据包的增大而减少。数据包的大小不会影响某一次分配给V2V的信道容量大小,但是会影响在一个慢衰落(100ms)里分配给V2V通信链路的时长,会对V2I链路造成更长时间的干扰吗,所以数值的减少是由取平均值造成的,也就是因为一段时间的总和少了,一取平均就少了。
可是为什么这里说V2V的信道容量增加会影响V2I的信道容量?在我的另一篇博客有提到,这里再讲明一下
首先要知道对于无线信道,不可能和有线信道一样,我想发送给谁,就只有那个人收到我的信息,对于无线信号的发送,简化一点,就是一个天线的尖尖发送一个球面的信号,是向各个方向都发送信号,这样总有一个方向能传送出我的消息,所以就会面临一个问题,有的人想接收我的消息,但是有的不想,那么对于想接受我的信号的人来说,我的信号就是有用的信息,对于不想接收我的信号的人来说,我的信号就是噪声,对于发送信号的情况就会像下图一样,其中实线是V2V通信,虚线是V2I通信,加粗的线是车辆打算发送的对象
上面是从发射车辆的角度观察的,下面看一下接收信号方对于信号的反应
从标红的信号看,同样是一辆车发送的相同的信号,对于V2V和V2I来讲,就是信息和噪声的区别,所以如果一个信号的功率增加,对于两种通信就是信息增加和噪声增加的区别,进而对两种通信的信道容量影响就是一个增加一个减少,如下图
在分析完这张图之后我的疑惑也来了,首先就是不清楚什么原因导致SARL的性能差这么多,我猜测可能是模型的原因,还有种猜测可能是我电脑性能原因,这看我什么时候有时间在找找原因吧
还有一个疑惑更明显,就是随机种子问题,发现这么问题首先就是我发现不管我运行多少次,生成的性能的数值都是不变的,可是明明应用场景里会有那么多不确定因素,比如所有车辆的初始位置,初始速度,到达岔路口的随即转弯,这都会影响慢衰落,还有服从瑞利分布的快衰落,这些都是随机的,怎么会多次执行数一点都不变,连小数都不变,震惊到了我,我就开始DeBug,然后就发现了一个毫不起眼到让我数次看源码都忽略掉的一句话np.random.seed(1234)
,在py文件开头,掌管全局,在训练模型和测试模型性能的代码里都有,这句话会导致什么结果呢,就是如果代码里有这句话ind = np.random.randint(0, 6)
,按道理来说是会产生一个0~5的随机数字,但是一旦确定了随机种子,那么这句代码无论运行多少次,ind只会等于同一个数字,也就是3(这是因为随机种子是1234,换个随机种子可能是别的数字),同理,会影响车的随机位置,随机速度等等烂七八糟一堆随机,那就说明源码的测试没有做到真正的随机啊。
我试着注释掉这句话,也就是让随机成为真正的随机,这样导致的结果就是最终的性能非常不稳定,以V2V数据包为5*1060Bytes为例,固定随机种子,测试时会产生和训练模型时相同的场景,结果如下
但是如果注释掉这句话,那么车辆产生的位置等就会随机,场景就会不同,这样运行的结果,也就是最终的性能变得非常不稳定,有好有坏,甚至还出现了MARL的性能不如SARL的现象,不知有没有大佬可以解答一下,或者可能就要等我有时间研究一下了。
这张图同样是使用论文作者训练好的模型进行测试的结果,还要有个题外话,这个MARL模型,我的电脑是3060显卡,训练7天整大概2500次迭代,而剩下的500次我感觉还需要5天,窒息。
下面是我测试出的性能图,与论文给出的性能相比,和图3是一个问题,就是SARL的效果没有那么优,甚至在数据包比较大的时候性能还不及随机选择的性能。对于论文提出的新的模型,MARL的性能我大概对比了一下,基本一致。
V2V传输成功率的计算方法如下所示,在不可抗力因素(衰落)决定了总衰落的情况下,每条链路的衰减和增益可以确定,模型决定的是功率的选择和信道的选择,在选择功率之后,每条链路的传输功率就能确定,之后根据所有链路的信道选择情况可以计算信噪比,这样每条信道上给到每个链路的信道容量就可以计算,这里的信道容量也是传输速率,所以决定了剩余传输需求减少的速率,因为这个减少的速率就会决定在时限结束时能否及时传输完成任务。
随着V2V有效载荷大小的增加,除了性能上限集中式maxV2V可以在整个测试中实现100%的分组交付,其他所有三种分布式算法的传输成功率都会下降,而其中MARL性能最接近性能上限如果V2V有效载荷增大,则意味着V2V的传输时间变长,可能导致在时间限制内无法传输完成所有的数据,进而导致传输成功率降低
论文原图如下
我的复现
趋势基本一样,为什么这么一样,原因我上面应该提到了,作者设置了随机种子,所以运行的随机过程是不变的,所以运行出来的过程和作者是一样的。
这个图表明随着训练的持续,每次迭代的累计奖励也在增加,证明了训练算法的有效性
什么是有效性?
问题来了,为什么观察有效性,不单纯的观察loss函数的收敛呢,一般模型训练不都是观察loss函数吗?
loss函数论文里没有画出,我也画了一下(每个颜色的线表示一个代理个体的loss函数)
在多代理强化学习中,loss函数的逐渐趋于0可能意味着以下几种情况之一:
1.多代理系统已经成功地学习了任务:这意味着多代理系统已经通过学习一组有效的策略来解决任务,从而最小化了损失函数。这是理想的情况,因为它表明多代理系统已经成功地实现了任务。
2.损失函数可能存在问题:有时,损失函数可能不是一个好的衡量多代理系统性能的指标。例如,如果多代理系统被训练来协作完成一个任务,那么即使每个代理的个体性能非常好,但如果它们不能有效地协作,那么损失函数可能仍然会趋向于零。在这种情况下,需要使用其他性能度量来评估多代理系统的表现。
也就是要评估多代理系统的性能,除了个体代理的个体性能之外,还需要考虑它们的协作能力和整体性能。
上面的实验图4中是宏观的总览全局的结果,围观来看,各个链路是如何传输完自己的任务的,以及相互之间的影响,可以通过实验图6来观察,这张图里有两个子图,分别表示MARL和随机分配下各个链路每时刻V2V占有的信道容量。作者在进行实验时规定传输数据包大小为2120字节的数据,因此在实验过程中设置初始V2V载荷量为2120*8
所有V2V链路在时间限制(100ms)内剩余V2V有效载荷的变化
对于MARL而言,Link4早早的交付完成了任务,其他三条链路交付完成时间大致相同
对于随机基线而言,Link1和Link4在早期交付完成了所有有效载荷,时限后期Link3也交付完成,但是Link2最终没有交付完成
作者在论文中表示,这个场景是进行选择的,但是我没有找到这个场景,对于100次测试进行了观察,其中MARL的效果图情况如下
其中选择了几个比较相似的效果图方法看如下
随机基线的效果如下
我这里也选择了一个长得像的
但其实我的选择是不对的,应该MARL和随机基线选择的场景是同一个场景,但是奈何我实在找不到这种场景
正如上面所说,图4和图6是有联系的,是宏观和围观的联系,图4中的失败率中的失败案例就如同图6(b)中的Link2情况一样,因为不合适的信道和功率分配的等因素影响,没有在时限之内完成需要交付的数据包
论文原图
我的复现图,同样因为没有具体的场景,所以找了个RAND场景下长得差不多的,不过同样场景下MARL就没那么像了
作者对于论文中的图的过程讲解大概如下:MARL的各个链路相互协同,Link1初始保持低速,在所有链路基本传完的时候高速传输;Link2和Link3交替传输;Link4在初始用非常高的速度传输使其不再在后期对其他链路产生干扰。
Link2和Link3速率一直不高可能是因为噪声干扰较大,因此Link1和Link4有对这两个链路进行让步的行为。
随机基线方法无法保护受到噪声干扰较大的Link2和Link3,导致这两个链路的传输速度非常低,可能无法在时限内完成数据包的传输,导致传输成功率低。
分析及结论如下:如果使用随机基线的方法,从所有链路开始传输,到所有链路传输结束,持续时间长,更容易导致传输成功率低
不考虑噪声干扰
不考虑保护受噪声干扰的链路
可能会造成对链路的恶性竞争
所以,所提出的基于多代理强化学习的方法学习去利用某些信道条件良好的V2V链路的信道,同时为信道条件差的链路提供保护。因此有效载荷的成功率显著提高。
我的观察是什么,先给出下面两个图,是100种场景下的两种方案的各个链路情况
我观察的大概是什么,就是虽然只是观察的前30ms的传输情况,但是可以很明显的观察到MARL普遍比较早就结束了传输,虽然选择的功率幅度都差不多,但是为什么MARL结束的早呢,我的猜测,因为选的信道大概率不同,所以信噪比高,没那么多干扰,所以功率都用来传输数据了,而RAND的功率大概率都用来对抗噪声了,相应的信噪比低所以传输速率并不高。
我看有蛮多人跟我要画图代码的,我代码写的比较丑陋,我一部分使用python画的,一部分用matlab画的,代码部分放在下面了
这里用的output.txt文件里的内容是我自己手笨敲进去的,在Environment_marl_test.py里面修改class Environ类
里面的self.demand_size
大小就可以了,从int((4 * 190 + 300) * 8 * 1)
一直修改到int((4 * 190 + 300) * 8 * 6)
,就是修改传送数据包的大小,文件中第一行到第五行分别是MARL、SARL、随机基线、两个性能上限的V2I速率,后面几行是V2V成功率,顺序可见下面代码
import matplotlib.pyplot as plt def picture34(): sum_V2IRate_marl = [] sum_V2IRate_sarl = [] sum_V2IRate_rand = [] sum_V2IRate_dpra = [] sum_V2IRate_upra = [] total_V2Vsuccess_marl = [] total_V2Vsuccess_sarl = [] total_V2Vsuccess_rand = [] total_V2Vsuccess_dpra = [] file = open('output.txt', 'r') file_data = file.readlines() rownum = 0 for row in file_data: tmp_list = row.split(',') # 切分行 tmp_list.pop() # tmp_list[-1] = tmp_list[-1].replace('\n') for i in range(len(tmp_list)): if(rownum == 0): sum_V2IRate_marl.append(float(tmp_list[i])) if(rownum == 1): sum_V2IRate_sarl.append(float(tmp_list[i])) if(rownum == 2): sum_V2IRate_rand.append(float(tmp_list[i])) if(rownum == 3): sum_V2IRate_dpra.append(float(tmp_list[i])) if (rownum == 4): sum_V2IRate_upra.append(float(tmp_list[i])) if (rownum == 5): total_V2Vsuccess_marl.append(float(tmp_list[i])) if (rownum == 6): total_V2Vsuccess_sarl.append(float(tmp_list[i])) if (rownum == 7): total_V2Vsuccess_rand.append(float(tmp_list[i])) if (rownum == 8): total_V2Vsuccess_dpra.append(float(tmp_list[i])) rownum += 1 # 画图 x = range(1,7) plt.plot(x, sum_V2IRate_marl, c='red', marker='o') plt.plot(x, sum_V2IRate_sarl, c='blue', marker='d') plt.plot(x, sum_V2IRate_rand, c='black', marker='x') plt.plot(x, sum_V2IRate_dpra, c='black', linestyle='--', marker='v') plt.plot(x, sum_V2IRate_upra, c='black', linestyle='--') plt.show() x = range(1,7) plt.plot(x, total_V2Vsuccess_marl, c='red', marker='o') plt.plot(x, total_V2Vsuccess_sarl, c='blue', marker='d') plt.plot(x, total_V2Vsuccess_rand, c='black', marker='x') plt.plot(x, total_V2Vsuccess_dpra, c='black', linestyle='--', marker='v') plt.show() picture34()
load('C:\Users\marl_model\reward.mat')
pic = reshape(reward, 100, 3000);
pic = sum(pic, 1);
x = 1 : 1 : 3000;
plot(x, pic);
grid on;
% 图6 V2V剩余载荷 % load('C:\Users\marl_model\demand_marl.mat') % MARL相关 % p1 = demand_marl(:,:,1); % p2 = demand_marl(:,:,2); % p3 = demand_marl(:,:,3); % p4 = demand_marl(:,:,4); % for i = 1 : 1 : 100 % x11 = p1(i,:)./8; % x22 = p2(i,:)./8; % x33 = p3(i,:)./8; % x44 = p4(i,:)./8; % % x = 0: 1: 100; % % subplot(10,10,i);plot(x,x11,'-diamond',x,x22,'r-square',x,x33,'-x',x,x44,'m-o');title('MARL 1-100'); % grid on; % % end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % for i = 1 : 1 : 25 % x11 = p1(i,:)./8; % x22 = p2(i,:)./8; % x33 = p3(i,:)./8; % x44 = p4(i,:)./8; % % x = 0: 1: 100; % % subplot(5,5,i);plot(x,x11,'-diamond',x,x22,'r-square',x,x33,'-x',x,x44,'m-o');title('MARL 1-25'); % grid on; % % end % % for i = 26 : 1 : 50 % x11 = p1(i,:)./8; % x22 = p2(i,:)./8; % x33 = p3(i,:)./8; % x44 = p4(i,:)./8; % % x = 0: 1: 100; % % subplot(5,5,i-25);plot(x,x11,'-diamond',x,x22,'r-square',x,x33,'-x',x,x44,'m-o');title('MARL 26-50'); % grid on; % % end % % for i = 51 : 1 : 75 % x11 = p1(i,:)./8; % x22 = p2(i,:)./8; % x33 = p3(i,:)./8; % x44 = p4(i,:)./8; % % x = 0: 1: 100; % % subplot(5,5,i-50);plot(x,x11,'-diamond',x,x22,'r-square',x,x33,'-x',x,x44,'m-o');title('MARL 51-75'); % grid on; % % end % % for i = 76: 1 : 100 % x11 = p1(i,:)./8; % x22 = p2(i,:)./8; % x33 = p3(i,:)./8; % x44 = p4(i,:)./8; % % x = 0: 1: 100; % % subplot(5,5,i-75);plot(x,x11,'-diamond',x,x22,'r-square',x,x33,'-x',x,x44,'m-o');title('MARL 75-100'); % grid on; % % end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % i = 36; % x11 = p1(i,:)./8; % x22 = p2(i,:)./8; % x33 = p3(i,:)./8; % x44 = p4(i,:)./8; % % x = 0: 1: 100; % % subplot(2,2,1);plot(x,x11,'-diamond',x,x22,'r-square',x,x33,'-x',x,x44,'m-o');title('MARL 36'); % grid on; % % i = 53; % x11 = p1(i,:)./8; % x22 = p2(i,:)./8; % x33 = p3(i,:)./8; % x44 = p4(i,:)./8; % % x = 0: 1: 100; % % subplot(2,2,2);plot(x,x11,'-diamond',x,x22,'r-square',x,x33,'-x',x,x44,'m-o');title('MARL 53'); % grid on; % % i = 62; % x11 = p1(i,:)./8; % x22 = p2(i,:)./8; % x33 = p3(i,:)./8; % x44 = p4(i,:)./8; % % x = 0: 1: 100; % % subplot(2,2,3);plot(x,x11,'-diamond',x,x22,'r-square',x,x33,'-x',x,x44,'m-o');title('MARL 62'); % grid on; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % RAND相关 % load('C:\Users\marl_model\demand_rand.mat') % q1 = demand_rand(:,:,1); % q2 = demand_rand(:,:,2); % q3 = demand_rand(:,:,3); % q4 = demand_rand(:,:,4); % for i = 1 : 1 : 100 % y11 = q1(i,:)./8; % y22 = q2(i,:)./8; % y33 = q3(i,:)./8; % y44 = q4(i,:)./8; % % y = 0: 1: 100; % % subplot(10,10,i);plot(y,y11,'-diamond',y,y22,'r-square',y,y33,'-x',y,y44,'m-o');title('RAND 1-100'); % grid on; % % end %%%%%%%%%%%%%%%%%%%%%%%% % i = 36; % i= 6; % y11 = q1(i,:)./8; % y22 = q2(i,:)./8; % y33 = q3(i,:)./8; % y44 = q4(i,:)./8; % % y = 0: 1: 100; % subplot(2,2,1);plot(y,y11,'-diamond',y,y22,'r-square',y,y33,'-x',y,y44,'m-o');title('RAND 6'); % grid on; % % i = 53; % y11 = q1(i,:)./8; % y22 = q2(i,:)./8; % y33 = q3(i,:)./8; % y44 = q4(i,:)./8; % % y = 0: 1: 100; % subplot(2,2,2);plot(y,y11,'-diamond',y,y22,'r-square',y,y33,'-x',y,y44,'m-o');title('RAND 53'); % grid on; % % i = 62; % y11 = q1(i,:)./8; % y22 = q2(i,:)./8; % y33 = q3(i,:)./8; % y44 = q4(i,:)./8; % % y = 0: 1: 100; % subplot(2,2,3);plot(y,y11,'-diamond',y,y22,'r-square',y,y33,'-x',y,y44,'m-o');title('RAND 62'); % grid on; %
% 图7 MARL % load('C:\Users\marl_model\rate_marl.mat') % % v1 = rate_marl(:,:,1); % v2 = rate_marl(:,:,2); % v3 = rate_marl(:,:,3); % v4 = rate_marl(:,:,4); % for i = 1 : 1 : 100 % r11 = v1(i,1:30); % r22 = v2(i,1:30); % r33 = v3(i,1:30); % r44 = v4(i,1:30); % % x = 1: 1: 30; % % subplot(10,10,i);plot(x,r11,'-diamond',x,r22,'r-square',x,r33,'-x',x,r44,'m-o');title('MARL 1-100'); % grid on; % % end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % i = 1; % r11 = v1(i,1:30); % r22 = v2(i,1:30); % r33 = v3(i,1:30); % r44 = v4(i,1:30); % % x = 1: 1: 30; % % subplot(2,2,1);plot(x,r11,'-diamond',x,r22,'r-square',x,r33,'-x',x,r44,'m-o');title('MARL 1'); % grid on; % % % i = 8; % r11 = v1(i,1:30); % r22 = v2(i,1:30); % r33 = v3(i,1:30); % r44 = v4(i,1:30); % % x = 1: 1: 30; % % subplot(2,2,2);plot(x,r11,'-diamond',x,r22,'r-square',x,r33,'-x',x,r44,'m-o');title('MARL 8'); % grid on; % % i = 9; % r11 = v1(i,1:30); % r22 = v2(i,1:30); % r33 = v3(i,1:30); % r44 = v4(i,1:30); % % x = 1: 1: 30; % % subplot(2,2,3);plot(x,r11,'-diamond',x,r22,'r-square',x,r33,'-x',x,r44,'m-o');title('MARL 9'); % grid on; % % % i = 10; % r11 = v1(i,1:30); % r22 = v2(i,1:30); % r33 = v3(i,1:30); % r44 = v4(i,1:30); % % x = 1: 1: 30; % % subplot(2,2,4);plot(x,r11,'-diamond',x,r22,'r-square',x,r33,'-x',x,r44,'m-o');title('MARL 10'); % grid on; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % RAND % load('C:\Users\marl_model\rate_rand.mat') v1 = rate_rand(:,:,1); v2 = rate_rand(:,:,2); v3 = rate_rand(:,:,3); v4 = rate_rand(:,:,4); % % for i = 1 : 1 : 100 % r11 = v1(i,1:30)./1000; % r22 = v2(i,1:30)./1000; % r33 = v3(i,1:30)./1000; % r44 = v4(i,1:30)./1000; % % x = 1: 1: 30; % % subplot(10,10,i);plot(x,r11,'-diamond',x,r22,'r-square',x,r33,'-x',x,r44,'m-o');title('RAND 1-100'); % grid on; % % end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% i = 8; r11 = v1(i,1:30); r22 = v2(i,1:30); r33 = v3(i,1:30); r44 = v4(i,1:30); x = 1: 1: 30; subplot(2,2,1);plot(x,r11,'-diamond',x,r22,'r-square',x,r33,'-x',x,r44,'m-o');title('RAND 8'); grid on; i = 9; r11 = v1(i,1:30); r22 = v2(i,1:30); r33 = v3(i,1:30); r44 = v4(i,1:30); x = 1: 1: 30; subplot(2,2,2);plot(x,r11,'-diamond',x,r22,'r-square',x,r33,'-x',x,r44,'m-o');title('RAND 9'); grid on;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。