python实现多智能体一致性_基于多智能体强化学习的车联网频谱共享技术

c577239e252e28d6b66201feddc7258a.png

Published in: IEEE JOURNAL ON SELECTED AREAS IN COMMUNICATIONS, VOL. 37, NO. 10, OCTOBER 2019

Authors: Le Liang, Member, IEEE, Hao Ye , Student Member, IEEE, and Geoffrey Ye Li, Fellow, IEEE

原文链接:https://ieeexplore.ieee.org/abstract/document/8792382

摘要:

本文研究了基于多智能体强化学习的车辆网络的频谱共享问题,其中车辆对车辆(V2V)链路复用了车辆对基础设施(V2I)链路占用的频谱。在高机动性的车辆环境中,快速的信道变化妨碍了在基站收集精确的瞬时信道状态信息以进行集中资源管理的可能性。针对这一问题,我们将资源共享建模为一个多智能体强化学习问题,然后使用基于指纹的深度q -network方法来解决该问题,该方法适用于分布式实现。每个V2V链路充当一个智能体,与通信环境进行集中交互,接收独特的观测结果,同时获得共同的奖励,并通过使用获得的经验更新q -network来学习改进频谱和功率分配。我们证明,在适当的奖励设计和训练机制下,多个V2V智能体成功地学会了分布式协作,同时提高了V2I链路的总容量和V2V链路的有效载荷交付率。

引言

  • 背景意义

车载通信,通常被称为车对车(V2X)通信,旨在从道路安全、交通效率、无所不在的互联网接入[1]、[2]等各个方面改造互联车辆和智能交通服务。最近,第三代伙伴计划(3GPP)一直在寻求在长期演进(LTE)和未来的5G蜂窝网络[3]-[5]中支持V2X服务。电信和汽车行业成立了跨行业联盟,如5G汽车协会(5GAA),以推动移动V2X技术的开发、测试和部署。

本文考虑了车辆网络中的频谱接入设计问题,该网络通常包括车辆-基础设施(V2I)和车辆-车辆(V2V)连接。如图1所示,V2I链路将每辆车连接到基站(BS)或BS型路侧单元(RSU),而V2V链路则提供相邻车辆之间的直接通信。

  • 本文贡献

在本文中,我们考虑高机动车辆网络中的频谱共享问题,其中多个V2V链路试图共享被V2I链路占用的频谱。为了支持车辆网络中不同的服务需求,我们设计了V2V频谱和功率分配方案,同时最大限度地提高V2I链路的容量,用于高带宽内容传输,同时提高V2V链路的有效载荷传输可靠性,用于周期性的安全关键信息共享。这项工作的主要贡献概括如下:

我们将多个V2V链路的频谱接入建模为一个多智能体问题,并利用多智能体RL[29]、[30]的最新进展,开发了一种分布式频谱和功率分配算法,同时提高了V2I和V2V链路的性能。

我们为V2V链路的周期性安全消息共享提供可靠性保障的直接处理,在消息生成周期内,针对小尺度信道衰落,调整V2V频谱子带选择和功率控制。

我们表明,通过适当的奖励设计和培训机制,V2V发射机可以从与通信环境的交互中学习,并找出一个聪明的策略,以分布式的方式相互协作,从而基于本地信息优化系统性能

系统模型:

3b6901979cbc1ac39335c9655d12c914.png
图1 车联网结构示意图

考虑图1所示的基于蜂窝的车辆通信网络,该网络具有M个V2I和K个V2V链路,同时支持移动高数据速率娱乐和高级驾驶服务的可靠的定期安全消息共享,V2I链路利用蜂窝(Uu)接口将M辆车连接到BS以获得高数据速率的服务,而K个V2V链路通过局域D2D通信的旁连(PC5)接口定期传播生成的安全信息,假设所有发射接收机均只配备一个天线,V2I和V2V链路集合分别可以表示为:

650f01c0a04da5db7e9332f4d9708f0d.png

421722e0dea43031094afe321e29f4a4.png

我们关注定义在蜂窝V2X架构中的模式4,其中车辆有一个无线电资源池,它们可以自主选择用于V2V通信[5]。如果有必要的干扰管理设计,这些资源池可以与蜂窝V2I接口的资源池重叠,以更好地利用频谱,本文对此进行了研究。我们进一步假设M个V2I链路(考虑上行链路)已经预先分配了具有固定传输功率的正交频谱子带,即第m个V2I链路占用第m个子带。因此,主要的挑战是为V2V链路设计一个有效的频谱共享方案,使V2I和V2V链路在高机动性的车辆环境下以最小的信令开销实现各自的目标。

在一个相干时间周期内,第k个V2V链路在第m个子带(被第m个V2I链路占用)上的信道功率增益如下:

6a03ecfba8cc1ca96f56ec01040ca7fa.png

其中

为频率相关的小尺度衰落功率分量,并假设服从单位均值的指数分布,而

表示大尺度衰落,包括路径衰落和阴影效应,并认为是与频率无关的。同样可以定义第

个V2V链路对第

个V2V链路在第
个子带上的干扰
,第m个V2V对基站的干扰链路
,第m个V2I与基站的通信链路
,以及第m个V2I链路对第k个V2V的干扰链路

第m个V2I链路和第k个V2V链路上接收到的信噪比(SINRs)分别表示为

145fbae8a141b131abf47a888d02780b.png

d23e1f592c7194734ef4662654746cb1.png

其中

9c4c7061400bd99c1e87344720cbd212.png

为衰减干扰功率。

为二进制频带分配指示变量,取值为1时代表第k个V2V链路占用第m个子带,取值为0时代表不占用。

进而可以计算出两种链路各自的信道容量:

b5850e2e85f18d4bf06cd28b6a1c2c83.png

37cc4c24973e3c6f98562012a87697b2.png

V2I链路被设计用来传输高数据率的信息,如娱乐服务等,因此优化目标可以定义为:

0492e8529a9c90bcc1098c9b7af2b8c3.png

同时,V2V链路主要负责可靠地传播对安全至关重要的信息,这些信息定期生成,其频率根据先进驾驶服务的车辆移动性而异,我们在时间预算为T的范围内,对传输大小为B的数据包的传输速率这一需求进行了数学建模:

1ecc577a36cbb856bf35974360d75159.png

因此,本文中研究的资源配置问题可以描述为:寻找合理的频带分配指示变量取值和V2V链路的功率,来最大化V2I链路总容量和公式(7)中的包交付率。在下一节中,我们将利用多智能体RL的最新发现来开发一种用于V2V频谱访问的分布式算法。

基于多智能体RL的资源配置

在图1所示的资源共享场景中,多个V2V链路试图访问V2I链路占用的有限频谱,这可以建模为一个多智能体RL问题。每个V2V链路充当一个智能体,并与未知的通信环境进行交互,以获得经验,然后用于指导自己的策略设计。多个V2V智能体根据自身对环境状态的观察,集体探索环境并细化频谱分配和功率控制策略。虽然资源共享问题可能看起来是一个竞争游戏,但为了全局网络性能的考虑,我们通过对所有智能体使用相同的奖励将其转变为一个完全合作的游戏。

所提出的基于多中心的方法分为两个阶段,学习和实施阶段。我们关注集中学习和分布式实现的设置。这意味着在学习阶段,每个单独的V2V智能体可以很容易地访问系统性能导向的奖励,然后这些智能体通过更新其深度Q-network (DQN)来调整其行为,使之朝着最优策略的方向发展。在实施阶段,每个V2V 智能体接收到环境的局部观测,然后根据其训练好的DQN在与小尺度信道衰落相同的时间尺度上选择一个动作。下面详细描述了基于多智能体RL的资源共享设计的关键元素。

  • 状态和观测空间

观测定义为传输数据包大小、时间预算,干扰以及各类链路的功率增益,即:

f936c493430dd19d4d94eb2ea64eb03e.png

其中

0d5bb008caaf74f530a9f32c9fac6f97.png

然而,在多智能体场景中,因为每个智能体都会面临一个非稳定的环境,而其他智能体也在学习调整自己的行为。而DQN成功的关键——经验重放也使得这个问题变得更加严重,因为采样的经验不再反映当前的动态,从而破坏了学习的稳定性。为了解决这个问题,我们采用了在[30]中开发的基于指纹的方法。其思想是,虽然一个智能体的行为价值函数是不稳定的,其他智能体会随着时间的推移而改变其行为,但它可以根据其他智能体的策略而变得稳定。这意味着我们可以通过估计其他智能体的策略来扩展每个智能体的观察空间,从而避免非平稳性。在[30]中作者提出了简单的低维指纹方法,用于跟踪其他智能体的策略更改轨迹。这种方法是可行的,因为动作价值函数的非平稳性是由其他智能体的策略随时间的变化而产生的,而不是策略本身。另外研究指出训练回合数e以及

中的
与策略的改变具有比较强的相关性,因此,将这两个参数也纳入观测范围之内,即:

5e74abf1045a2885d837d21d073aa506.png
  • 动作空间

车辆链路的资源共享设计归结为V2V链路的频谱子带选择和传输功率控制,一共有M个频谱子带,另外,将功率控制设置了四个等级,也就是[23, 10, 5, -100]dBm。

  • 奖励设计

对应于第一个目标,我们简单地将所有V2I链路地瞬时总容量包括在奖励函数之内。而对应于第二个目标,我们将与V2V链路有关地奖励定义为有效传输速率,直到所有的数据传输完成,奖励变为定值β,即:

c3c3ea87d5002f5de8226c9c8fc08a35.png

β的设计体现了我们对于权衡推动朝向终极目标的奖励和学习效率之间的权衡的思考。对于纯目标导向的考虑,我们只是将每一步的奖励设置为0,直到V2V有效载荷被交付,超过这一点,奖励设置为1。然而,我们的调优经验表明,这样的设计将阻碍学习过程,因为在每一回合的开始,智能体几乎无法学习任何有用的东西,因为在这一段时间内,它总是得到0的奖励。然后我们将一些先验知识输入到奖励中,即,更高的V2V传输速率应该有助于提高V2V有效载荷的传输速率。因此,我们提出了(10)中描述的奖励设计来融合这两种极端的奖励设计。最终设计的奖励定义为两部分奖励的加权和,可以表示为:

09a7d1fde9a0be557f45ce65315e38db.png
  • 算法设计

采用集中训练,分布式实行的思路,算法伪代码如图2所示

c11aee236b481969c98eb2979b9006ae.png
图2 算法伪代码

仿真与评估:

  • 参数设置

每个V2V 智能体的DQN由3个全连接的隐含层组成,分别包含500,250和120个神经元。采用ReLU激活函数和RMSProp优化器[37], 学习率设为0.001。训练回合数设为3000次,探索概率在前2400回合里从1逐渐减为0.02,并在之后的回合里保持固定,值得注意的是,我们在几个训练片段中固定了大规模衰落,并让小规模衰落在每一步中变化,这样学习算法可以更好地获取潜在的衰落动态,从而帮助稳定训练。其余参数设置如下表所示:

a71002dffc7ea5582f4694011ef941cd.png
  • 仿真结果分析

图3给出了不同算法下V2I链路总容量随V2V载荷大小的变化的曲线,可以看到,所有的算法下的V2I总容量均随着载荷的增大而有所下降文章,这是由于载荷越大,那么数据包交付时间会增长,另外可能也需要更高的发射功率,因此对V2I链路产生更大的干扰。提出的基于多智能体强化学习算法MARL的性能仅次于Centralized maxV2V策略,后者是只关注V2V链路的任务,而忽略对V2I链路的干扰。这可能是由于V2V链路的包交付率已经被maxV2V集中化大大提高了,而且V2V链路的有效载荷交付完成后,不会对V2I链路产生干扰。这是一个有趣的观察结果,值得进一步研究V2I和V2V链接之间的性能权衡。

0f6a2d36859f0ef1d64ba88d49689bd1.png
图3 不同算法下V2I链路总容量随V2V载荷大小的变化

图4给出了不同算法下V2V链路包交付成功率随V2V载荷大小的变化,由于Centralized maxV2V策略只关注V2V链路任务,因此其数据包始终可以完全成功交付,而文章提出的的性能仍然优于其余两种算法,当载荷大于4×1060bytes时才出现明显下降。

694a645ab3b92258ad80ba0c4cf1e68d.png
图4 不同算法下V2V链路包交付成功率随V2V载荷大小的变化

图5给出了训练过程中累积折扣汇报的变化情况,可以看到,随着训练回合的增长,曲线渐渐趋于收敛,存在小幅震荡,这在强化学习中是正常的,这是因为智能体始终保持一定的探索性,因此可能会探索到不太好的动作,导致回报的下降。

427f79447014d5bd3b8e6fca927773ba.png
图5 训练过程中累积汇报变化情况

图6和图7分别给出了在MARL和随机策略下的剩余载荷和V2V链路传输速率随时间变化情况的对比,从图6中可以看到,采用MARL算法可以很快的完成V2V链路的数据包传输任务,而随机策略则没有办法保证所有的链路的成功交付。从图7中可以看到,采用MARL算法时,不同的链路体现除了互相之间的协作,通过时间上的错峰传输尽可能地减小链路之间的干扰,从而保证系统整体具有最好地性能,而随机策略则无法做到这一点。

8478e30c41bf79c7321b2f4b26b211a6.png
图6 MARL和随机策略下的剩余载荷随时间变化情况

8c4015b5d81e72b6f0d6333399440787.png
图7 MARL和随机策略下的V2V链路传输速率随时间变化情况

结论:

本文针对多V2V链路复用V2I链路频谱的车辆网络,提出了一种基于多智能体RL的分布式资源共享方案。摘要针对多智能体RL问题,提出了一种基于策略指纹的非平稳独立q -学习方法。提出的基于多智能体RL的方法分为集中式训练阶段和分布式实现阶段。我们证明,虽然在每个V2V发射器上进行决策,但通过这种机制,所提出的资源共享方案可以有效地鼓励V2V链路之间的合作,从而提高系统级的性能。未来的工作将包括深入分析和比较基于单智能体和多智能体RL的算法的鲁棒性,以便更好地理解何时需要更新训练好的q -network,以及如何有效地执行这些更新。将提出的基于多智能体RL的资源分配方法扩展到多输入多输出(MIMO)和车载通信的毫米波MIMO场景也是一个值得进一步研究的有趣方向。

个人总结与思考

  1. 本篇文章对多V2V链路复用V2I链路频带地车辆互联网络中的通信资源配置进行了研究,通过合理地调度子频带的占用情况,能够在对重要通信链路干扰最小保证其正常通信的情况下,最大化地提高其他次级任务的成功率。这与多无人机协同通信场景、以及复杂情况下的通信干扰等场景具有很大的相似性,具有借鉴意义,问题解决的重点在于如何估计其他智能体的策略的变化以及如何合理地设计奖赏函数。
  2. 文章给出了很值得借鉴的奖励设计经验以及参数调优经验,奖励的设计应该注意考虑不同任务之间的权衡,并根据任务完成情况进行调整,从而激励学习过程的进行。而参数的调优同样如此,比如针对探索概率,初始时,可以设置较高的值,而随着训练过程的进行,策略不断趋于稳定,那么就可以降低探索概率,有助于策略的收敛。

参考文献

aa96d5302a926e9c7ae4b96f8e297130.png

7993dca8f934902b4941cd06a280de3b.png

106b92f488e045da1d7d13ab4af0f402.png

4c7fbe8b66d6070a7f012aaf871ce2a7.png

原文链接:

https://ieeexplore.ieee.org/document/8761794

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智能强化学习 (Multi-agent Reinforcement Learning, MARL) 是指一个由多个个组成的环境中,每个个都有自己的决策空间,目标是通过与环境的交互,获取最大的累积奖励。MARL 的特点是不同个之间相互影响,一个个的决策将会影响其他个的决策,因此 MARL 的复杂度比单智能强化学习要高。其主要应用于博弈论、自动驾驶、机器人、智能交通等领域。 基于Sarsa的多智能强化学习算法可以通过如下步骤实现: 1. 初始化每个智能的策略,价值函数以及环境模型。 2. 每个智能与环境交互进行学习,按照如下步骤进行: a. 根据当前状态,每个智能选择一个行为。这里使用 $\epsilon$-贪心策略,即以一定概率随机选择行为,以一定概率选择当前最优行为。 b. 执行行为,更新环境状态。 c. 获取奖励,用于更新价值函数。 d. 根据新状态和价值函数更新智能的策略。这里使用Sarsa(state-action-reward-state-action)算法,即使用当前策略选择一个行为,然后观察下一个状态及奖励,利用下一个状态和奖励更新当前价值函数,再根据新的价值函数更新策略。 e. 将状态更新为新状态,继续执行下一个动作。 3. 迭代多次执行以上步骤,直到收敛。 下面是基于Sarsa的多智能强化学习Python代码: ```python import numpy as np import random #定义环境 class Gridworld: def __init__(self, size): self.size = size self.state = np.zeros(2, dtype=np.int32) self.actions = np.array([[0,1],[0,-1],[1,0],[-1,0]]) self.rewards = np.array([[0,-10],[-10,0],[0,-10],[0,-10]]) #判断当前状态是否终止状态 def is_terminal(self, state): if ((state == [0,0]).all() or (state == [self.size-1,self.size-1]).all()): return True else: return False #获取当前状态的所有可选行为 def get_actions(self): return self.actions #更新状态 def update_state(self, action): new_state = self.state + action if new_state[0] < 0 or new_state[0] >= self.size or new_state[1] < 0 or new_state[1] >= self.size: return False else: self.state = new_state return True #获取当前状态的奖励 def get_reward(self): return self.rewards[np.where(np.all(self.actions == self.action, axis=1))[0][0]] #定义智能 class Agent: def __init__(self, id, grid): self.id = id self.grid = grid self.q_table = np.zeros((grid.size, grid.size, 4)) #价值函数 self.epsilion = 0.1 #探索概率 self.alpha = 0.5 #学习率 self.gamma = 0.9 #衰减系数 #根据当前状态选择一个行为 def choose_action(self, state): if random.uniform(0,1) < self.epsilion: action = random.choice(self.grid.get_actions()) else: action = self.greedy_policy(state) return action #根据epsilon-greedy策略选择一个行为 def greedy_policy(self, state): values = self.q_table[state[0], state[1], :] max_value = np.max(values) actions = self.grid.get_actions() candidate_actions = [a for a in actions if values[np.where(np.all(self.grid.actions == a, axis=1))[0][0]] == max_value] return random.choice(candidate_actions) #执行一个周期,包括选择行为、执行行为、更新价值函数和策略 def run_cycle(self, state): self.action = self.choose_action(state) self.grid.update_state(self.action) reward = self.grid.get_reward() next_state = self.grid.state next_action = self.choose_action(next_state) value = self.q_table[state[0], state[1], np.where(np.all(self.grid.actions == self.action, axis=1))[0][0]] next_value = self.q_table[next_state[0], next_state[1], np.where(np.all(self.grid.actions == next_action, axis=1))[0][0]] td_error = reward + self.gamma * next_value - value self.q_table[state[0], state[1], np.where(np.all(self.grid.actions == self.action, axis=1))[0][0]] += self.alpha * td_error self.epsilion *= 0.99 #探索概率指数衰减 #执行多个周期 def run_cycles(self, num_cycles): for i in range(num_cycles): if self.grid.is_terminal(self.grid.state): self.grid.state = np.zeros(2, dtype=np.int32) state = self.grid.state self.run_cycle(state) #定义多智能 class MultiAgent: def __init__(self, num_agents, grid): self.grid = grid self.agents = [Agent(i, grid) for i in range(num_agents)] #执行一个周期,让每个智能分别执行一个周期 def run_cycle(self): for agent in self.agents: if self.grid.is_terminal(self.grid.state): self.grid.state = np.zeros(2, dtype=np.int32) state = self.grid.state agent.run_cycle(state) #执行多个周期 def run_cycles(self, num_cycles): for i in range(num_cycles): self.run_cycle() #设定环境大小和智能数量 size = 4 num_agents = 2 #初始化环境和多智能 grid = Gridworld(size) multi_agent = MultiAgent(num_agents, grid) #执行多个周期 multi_agent.run_cycles(1000) #输出每个智能的价值函数 for agent in multi_agent.agents: print('agent', agent.id) print(agent.q_table) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值