Advertisement

Applications of Deep Reinforcement Learning in UAV Netw

阅读量:

作者:禅与计算机程序设计艺术

1.简介

随着无人机在近距离空中互联网中的部署日益增加, 该领域的管理系统面临越来越复杂的挑战. 从提高可靠度和有效性两个维度出发, 可采取多项措施以增强系统性能.

  • 边缘节点检测 : 基于各个无人机的特性以及当前环境状况实现定位与预测目标。

数据预处理 : 将采集到的数据融合与去噪后生成高质量的训练样本集用于模型训练及参数优化过程

  • 通信管理 : 在无人机之间有效地分配信息资源,实现多任务协作。

  • 资源利用效率管理 : 基于科学合理分配策略与方向性引导控制机制,在无人机网络中实现资源共享与优化配置。

传统网络管理方法存在诸多限制性问题。例如,在无人机运行环境中具有较高的复杂性使得传统的网络管理方法难以实现有效的适应和优化过程。此外由于无人机分布范围广袤导致传统网络管理系统在处理海量时空数据时显得力不从心因此必须借助先进的人工智能技术特别是机器学习方法才能实现有效的优化配置。近年来在机器学习领域中对深度强化学习的研究获得了广泛关注这种新型算法具备强大的算法能力并能够有效解决各类复杂问题特别是在面对高度动态和实时性强的任务需求时表现尤为突出。因此研究者们近年来致力于将深度强化学习技术应用于无人机网络管理系统以期取得更好的应用效果

在无人机网络管理领域中存在一些关键性的问题亟待研究者深入探讨。例如,在无人机网络体系中构建健壮性、智能化和高效性的体系管理方案?如何优化无人机设备识别与定位追踪机制?这些问题均属于值得深入探究的研究课题。

在此处,本文的作者旨在系统地阐述与无人机网络管理相关的深度强化学习技术,并通过实际案例来展示其应用方法。文章将涵盖以下六个主要部分:首先介绍无人机网络管理的基本概念和特点;然后深入探讨深度强化学习的基本原理和算法;接着对无人机网络管理中具体应用场景进行分析;随后探讨深度强化学习在该领域中的实际应用案例;再进一步分析其优缺点及其影响;最后总结全文并展望未来研究方向。

  1. 背景介绍
  2. 基本概念术语说明
  3. 核心算法原理及其操作步骤详述...
  4. 具体代码实现及功能解析
  5. 预期发展动向及技术瓶颈探讨
  6. 常见问题及应对策略解答

2.基本概念术语说明

首先介绍一下深度强化学习的基本概念和术语。

2.1 深度强化学习

深度强化学习算法(Deep reinforcement learning algorithm),简称为DRL(Deep Reinforcement Learning),是一种基于Q-learning等值函数进行逼近的技术。其基本概念是通过被用来构建深层次的神经网络结构来学习环境中的状态-动作价值函数Q,并以此实现对最优策略的选择。

与其他强化学习方法相比,深度强化学习具有以下的特点:

  • 模型具备环境状态转移关系的学习能力,在复杂的行为序列中展现出强大的建模能力;
    • 通过并行计算与异构计算平台进行训练,在GPU或FPGA的帮助下显著加快了训练速度;
    • 基于强化学习中的样本集合方法进行特征提取,在无需人工特征设计的情况下提升了自动学习效率;
    • 该方法特别适用于实时反馈的学习场景,在无需重新采集数据的前提下自适应调整策略。

2.2 Q-Learning算法

可被视为最早期的深度强化学习方法之一。其本质上是一种基于递归形式的贝尔曼方程的改进型模型构建方法。其核心思路在于构建一个状态-动作价值矩阵(通常记为Q),其中每个元素代表在特定状态下采取不同动作所获得的预期回报值。通过结合当前状态下的Q矩阵以及即时反馈信息进行迭代更新,在此过程中,系统的价值函数能够逐步逼近最优解。

2.3 强化学习

强化学习(Reinforcement Learning, RL)作为机器学习的一个关键领域,在其框架下设计了一种动态反馈机制。该机制的核心在于让智能体(agent)与环境进行持续互动,并根据积累的长期奖励来优化自身的决策过程。在这一过程中,“典型”的应用场景通常建立在一个特定环境中,在这个环境中,“智能体”(agent)会根据自身的感知和目标导向行为进行一系列操作以探索最优策略。“在这种情况下”,实现的目标就是使系统能够最大化地积累正面反馈或最小化负面损失

2.4 有限状态与动作空间

强化学习的核心目标是在设定一个初始状态s_0后,在线性空间中设计一个智能体使其能够依次采取动作序列{a₁, a₂,…, a_t}。该智能体基于环境给予的状态反馈信息f(s_t),能够得到奖励信号r(s_{t+1})并受到奖励信号r(s_{t+1})的激励或惩罚。随后,在每一步操作之后系统会将智能体转移到下一个状态s_{t+1}并赋予相应的奖励信号或惩罚性评价。

在阐述智能体与环境之间的互动关系时,我们采用有限的状态集合S和动作集合A进行建模,其中状态空间S被定义为包含所有可能状态的所有元素构成的集合,而动作空间A则被定义为包含所有可能动作的所有元素构成的集合.通常情况下,这种假设下默认这些变量均为离散型.

2.5 时序差分学习

在时序差分学习中,智能体的行动由一系列状态轨迹构成,在每一个状态轨迹上设定一个动态规划的目标函数,并基于此目标函数来优化策略更新的过程。可被视为蒙特卡罗强化学习的一种扩展方法。

3.核心算法原理和具体操作步骤以及数学公式讲解

深度强化学习算法主要包含四个核心模块:智能体、环境、状态转移模型和价值函数。以下将详细阐述这四大模块的具体内容及其作用机制。

3.1 智能体(Agent)

智能体是一类既能感知环境又能主动采取行动的机器人或物种。它通过与环境的互动持续优化自身能力,并旨在实现长期累积收益的最大化目标。这种实体既可以具备智能化特性又可能随机行动。

3.2 环境(Environment)

The environment constitutes a complete and self-contained system, providing interaction opportunities for the agent. The environment imparts diverse stimuli to the agent and assigns varying rewards at different times. The agent must engage in interactions with its surroundings, learn optimal action selection strategies, and effectively execute these actions to maximize cumulative rewards.

3.3 状态转移模型(Transition Model)

该模型描述了智能体在每一步骤中如何根据当前状态及所采取的动作决定后续状态的变化情况;它建立了一一对应关系将智能体的状态从s_t映射到s_{t+1}。其行为可借助概率来描述也可通过马尔可夫决策过程(MDP)来建模。

3.4 价值函数(Value Function)

在特定状态下s的价值函数被定义为累积奖励的期望值;即当智能体处于状态s时,在选择动作a_t后所获得的所有后续奖励之和被称为其累积奖励;它能够反映出智能体在不同环境中的决策倾向;通常表现为一个标量值;但在深度强化学习中,则可采用向量形式进行表示

3.5 Q-Learning算法流程

该方法以递归形式结合Bellman方程为基础模型。该算法的核心在于构建一个状态转移矩阵用于存储各状态间可能的动作及其对应的价值。其中每个元素代表在特定状态下采取不同动作所获得的预期回报值。同时利用现有的价值函数估计和即时奖励信息进行迭代更新操作以优化价值函数参数直至收敛至最优解的状态空间策略。具体实施步骤可通过下图详细展示

(1)初始化Q函数

在算法开始之前,Q函数的值应该设置为0。

(2)选取当前状态s

按照算法设计的框架下, 智能体基于某种策略选择一个动作a, 从而使Q函数达到最大值. 这一过程之后, 必须确定初始状态s作为系统的起点

(3)执行动作a并获取奖励r和下一个状态s'

智能体执行动作a,环境反馈奖励r和下一个状态s'。

(4)更新Q函数

Q函数的更新有两种情况:

第一种情况是当s和a已出现在Q表中:

第二种情况是当s和a不再Q表中,需要新加入:

\alpha 为学习因子,用来控制Q值的更新幅度,一般取0.1-0.5。

(5)重复步骤(2)至(4),直至收敛。

4.具体代码实例和解释说明

接下来具体讲解如何使用Python语言来构建DQN算法用于调度无人机网络系统。假设在开始训练DQN之前已经完成并收集好了训练数据和测试数据。以下是DQN算法的代码实现:

复制代码
    import numpy as np
    import random
    
    
    class DQN:
    def __init__(self):
        self.state_dim = None   # 状态维度
        self.action_dim = None  # 动作维度
    
        self.lr = 0.01          # 学习率
        self.discount_factor = 0.99    # 折扣因子
    
        self.epsilon = 1.0      # 贪婪度
        self.epsilon_min = 0.01     # 最小贪婪度
        self.epsilon_decay = 0.999  # 贪婪度衰减率
    
        self.memory = []        # 记忆库
    
    def build_model(self, input_shape, output_shape):
        """创建模型"""
        from tensorflow.keras import layers, models
        inputs = layers.Input(input_shape, name='inputs')
        x = layers.Dense(32, activation='relu')(inputs)
        outputs = layers.Dense(output_shape, activation='linear')(x)
        model = models.Model(inputs=[inputs], outputs=[outputs])
        model.compile(optimizer='adam', loss='mse')
        return model
    
    def remember(self, state, action, reward, next_state, done):
        """记忆"""
        self.memory.append((state, action, reward, next_state, done))
    
    def act(self, state):
        """执行动作"""
        if np.random.rand() <= self.epsilon:
            return random.randint(0, self.action_dim - 1)
        else:
            q_values = self.model.predict(np.array([state]))[0]
            return np.argmax(q_values)
    
    def replay(self, batch_size):
        """重放记忆库"""
        minibatch = random.sample(self.memory, batch_size)
        states, actions, rewards, next_states, dones = zip(*minibatch)
        states = np.array(states).reshape((-1,) + self.state_dim) / 255.0
        next_states = np.array(next_states).reshape((-1,) + self.state_dim) / 255.0
        targets = [reward + self.discount_factor *
                    np.amax(self.target_model.predict(ns)[0]) * int(not done) for
                    reward, ns, done in zip(rewards, next_states, dones)]
        targets = np.array(targets).reshape(-1, 1)
    
        actions = np.array([[i == j for i in range(self.action_dim)]
                             for j in actions]).astype('float32')
        actions = np.squeeze(actions)
        self.model.fit(states, actions, epochs=1, verbose=0,
                       callbacks=[self.update_target_weights()])
    
        if self.epsilon > self.epsilon_min:
            self.epsilon *= self.epsilon_decay
    
    def update_target_weights(self):
        """更新目标模型权重"""
        weights = self.model.get_weights()
        target_weights = self.target_model.get_weights()
        for i in range(len(target_weights)):
            target_weights[i] = weights[i]
        self.target_model.set_weights(target_weights)
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

首先,先导入所需的包和模块,如numpy、tensorflow等。

复制代码
    import numpy as np
    from collections import deque
    import gym
    
      
      
    
    代码解读

然后,创建一个DQN类的对象。

复制代码
    class DQN:
    
    
    代码解读

init()函数中,设置DQN类的超参数。

复制代码
    def __init__(self):
        self.state_dim = None   # 状态维度
        self.action_dim = None  # 动作维度
    
        self.lr = 0.01          # 学习率
        self.discount_factor = 0.99    # 折扣因子
    
        self.epsilon = 1.0      # 贪婪度
        self.epsilon_min = 0.01     # 最小贪婪度
        self.epsilon_decay = 0.999  # 贪婪度衰减率
    
        self.memory = deque(maxlen=100000)        # 记忆库
    
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

在build_model()函数内部中创建了一个全连接网络架构,在输入层指定node数量为state_dim,在输出层设置node数量为action_dim,并在中间隐藏层设置了32个node

复制代码
    def build_model(self, input_shape, output_shape):
        """创建模型"""
        from tensorflow.keras import layers, models
        inputs = layers.Input(input_shape, name='inputs')
        x = layers.Dense(32, activation='relu')(inputs)
        outputs = layers.Dense(output_shape, activation='linear')(x)
        model = models.Model(inputs=[inputs], outputs=[outputs])
        model.compile(optimizer='adam', loss='mse')
        return model
    
      
      
      
      
      
      
      
      
    
    代码解读

在remember()函数中,将训练数据添加到记忆库中。

复制代码
    def remember(self, state, action, reward, next_state, done):
        """记忆"""
        self.memory.append((state, action, reward, next_state, done))
    
      
      
    
    代码解读

在act函数体内,在满足条件的情况下,在可选动作中随机选取该动作;反之,则选取当前Q值最高的动作。

复制代码
    def act(self, state):
        """执行动作"""
        if np.random.rand() <= self.epsilon:
            return random.randint(0, self.action_dim - 1)
        else:
            q_values = self.model.predict(np.array([state]))[0]
            return np.argmax(q_values)
    
      
      
      
      
      
      
    
    代码解读

在replay()的过程中,系统会从记忆库中随机抽取一批训练数据,并将该网络用于训练过程;同时通过比较机制更新目标网络的权重参数。

复制代码
    def replay(self, batch_size):
        """重放记忆库"""
        minibatch = random.sample(self.memory, batch_size)
        states, actions, rewards, next_states, dones = zip(*minibatch)
        states = np.array(states).reshape((-1,) + self.state_dim) / 255.0
        next_states = np.array(next_states).reshape((-1,) + self.state_dim) / 255.0
        targets = [reward + self.discount_factor *
                    np.amax(self.target_model.predict(ns)[0]) * int(not done) for
                    reward, ns, done in zip(rewards, next_states, dones)]
        targets = np.array(targets).reshape(-1, 1)
    
        actions = np.array([[i == j for i in range(self.action_dim)]
                             for j in actions]).astype('float32')
        actions = np.squeeze(actions)
        self.model.fit(states, actions, epochs=1, verbose=0,
                       callbacks=[self.update_target_weights()])
    
        if self.epsilon > self.epsilon_min:
            self.epsilon *= self.epsilon_decay
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

最后,在update_target_weights()函数中,更新目标网络权重。

复制代码
    def update_target_weights(self):
        """更新目标模型权重"""
        weights = self.model.get_weights()
        target_weights = self.target_model.get_weights()
        for i in range(len(target_weights)):
            target_weights[i] = weights[i]
        self.target_model.set_weights(target_weights)
    
      
      
      
      
      
      
    
    代码解读

下面,编写主程序,完成DQN网络的初始化和训练。

复制代码
    if __name__ == '__main__':
    env = gym.make("CartPole-v0")
    agent = DQN()
    
    observation_space = env.observation_space.shape[0]
    action_space = env.action_space.n
    agent.state_dim = observation_space
    agent.action_dim = action_space
    
    agent.model = agent.build_model(agent.state_dim, agent.action_dim)
    agent.target_model = agent.build_model(agent.state_dim, agent.action_dim)
    agent.update_target_weights()
    
    total_score = []
    score_avg = 0
    scores = []
    num_episodes = 500
    
    for episode in range(num_episodes):
        cur_state = env.reset()
        cur_state = cur_state.reshape((1, observation_space)).astype('float32')
    
        score = 0
        while True:
            action = agent.act(cur_state)
            next_state, reward, done, _ = env.step(action)
    
            next_state = next_state.reshape((1, observation_space)).astype('float32')
            agent.remember(cur_state, action, reward, next_state, done)
    
            cur_state = next_state
    
            score += reward
    
            if len(agent.memory) >= 128:
                agent.replay(128)
    
            if done:
                break
        total_score.append(score)
        score_avg = sum(total_score[-10:]) / float(len(total_score[-10:]))
    
        print('\rEpisode {}/{} | Score {:.2f} | Avg Score {:.2f}'.format(episode+1, num_episodes, score, score_avg), end='')
    
    plt.plot(scores)
    plt.show()
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

在当前环境中,在随后运用 gym 库创建 CartPole-v0 游戏环境;接着生成一个 DQN 类的对象实例

复制代码
    env = gym.make("CartPole-v0")
    agent = DQN()
    
      
    
    代码解读

然后,创建一个DQN类的对象。

复制代码
    observation_space = env.observation_space.shape[0]
    action_space = env.action_space.n
    agent.state_dim = observation_space
    agent.action_dim = action_space
    
    agent.model = agent.build_model(agent.state_dim, agent.action_dim)
    agent.target_model = agent.build_model(agent.state_dim, agent.action_dim)
    agent.update_target_weights()
    
      
      
      
      
      
      
      
    
    代码解读

observation_space对应着状态维度这一概念,而action_space则对应着动作维度这一概念。在算法框架中构建两个全连接神经网络模型,并分别作为model和target_model进行使用。其中一个是评估当前策略的模型(称为target_model),另一个则是用于改进该策略的模型(称为model)。

复制代码
    total_score = []
    score_avg = 0
    scores = []
    num_episodes = 500
    
    for episode in range(num_episodes):
        cur_state = env.reset()
        cur_state = cur_state.reshape((1, observation_space)).astype('float32')
    
        score = 0
        while True:
            action = agent.act(cur_state)
            next_state, reward, done, _ = env.step(action)
    
            next_state = next_state.reshape((1, observation_space)).astype('float32')
            agent.remember(cur_state, action, reward, next_state, done)
    
            cur_state = next_state
    
            score += reward
    
            if len(agent.memory) >= 128:
                agent.replay(128)
    
            if done:
                break
        total_score.append(score)
        score_avg = sum(total_score[-10:]) / float(len(total_score[-10:]))
    
        print('\rEpisode {}/{} | Score {:.2f} | Avg Score {:.2f}'.format(episode+1, num_episodes, score, score_avg), end='')
    
    plt.plot(scores)
    plt.show()
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解读

在主程序中采用for循环结构进行DQN模型的训练;每一个回合 episode 都会通过随机方式选取初始状态,并在这一过程中持续进行学习;当训练任务完成时,在每个 episode 的完成后生成并展示分数变化曲线;随后对 DQN 模型的表现水平进行评估。

全部评论 (0)

还没有任何评论哟~