DROO论文笔记

推荐文章DROO源码及论文学习

读论文《Deep Reinforcement Learning for Online Computation Offloading in Wireless Powered Mobile-Edge Computing Networks》的笔记

论文地址:用于无线移动边缘计算网络在线计算卸载的深度强化学习

论文代码地址:DROO源码

目录

一、Introduction

二、System Model 

三、Local Computing Mode

四、Problem Formulation 

五、THE DROO ALGORITHM 

Algorithm Overview

保序量化的代码 :

之前的方法:KNN

Offloading Policy Update

​Adaptive Setting of K

Convergence Performance

​Impact of Updating Intervals Δ

​Computation Rate Performance


一、Introduction

旨在解决无线供电的MEC网络中根据时变的无线信道条件优化地调整任务卸载无线资源分配,需要快速求解困难的组合优化问题,传统数值优化方法难以实现。

采用binary卸载策略,即无线设备(WD)的每个计算任务要么在本地执行,要么完全卸载到MEC服务器。提出基于深度强化学习的在线卸载(DROO),将原始优化问题分解为卸载决策子问题和资源分配子问题,设计保序量化卸载动作生成,消除传统数值优化方法的复杂性,通过动态自适应程序进一步降低计算复杂性。 

二、System Model 

三、Local Computing Mode

四、Problem Formulation 

 

五、THE DROO ALGORITHM 

整体框架代码: 

    N = 10                     #用户数量
    n = 30000                     # 时间帧数量
    K = N                   # 初始化 K = N
    decoder_mode = 'OP'    # 量化模式,可以是 'OP' (Order-preserving) 或 'KNN'
    Memory = 1024          # 内存结构的容量
    Delta = 32             # 自适应 K 的更新间隔
    print('#user = %d, #channel=%d, K=%d, decoder = %s, Memory = %d, Delta = %d'%(N,n,K,decoder_mode, Memory, Delta))
    # 数据加载和处理
    channel = sio.loadmat('./data/data_%d' %N)['input_h']#(30000, 10)->30000条N个信道增益
    rate = sio.loadmat('./data/data_%d' %N)['output_obj'] # 这个速率只用于绘图,不用于训练 DROO
    # 将信道值放大,以便更好地训练(这是深度学习中的常用技巧)
    channel = channel * 1000000
    # generate the train and test data sample index
    # 将数据分为 80:20
    # training data are randomly sampled with duplication if n > total data size
    split_idx = int(.8 * len(channel))
    num_test = min(len(channel) - split_idx, n - int(.8 * n)) # training data size

# 初始化DNN
    mem = MemoryDNN(net = [N, 120, 80, N],
                    learning_rate = 0.01,
                    training_interval=10,
                    batch_size=128,
                    memory_size=Memory
                    )

    rate_his = []
    rate_his_ratio = []
    mode_his = []
    k_idx_his = []#索引
    K_his = []
    for i in range(n):
        if i % (n//10) == 0:
           print("%0.1f"%(i/n))#打印进度
        if i> 0 and i % Delta == 0:
            # index counts from 0
            if Delta > 1:#每 Delta 个时间步更新 K
                max_k = max(k_idx_his[-Delta:-1]) +1;#最近 Delta 个时间步内的最优K索引
            else:
                max_k = k_idx_his[-1] +1;
            K = min(max_k +1, N)#K 不超过 N

        if i < n - num_test:#训练阶段
            # training
            i_idx = i % split_idx# 训练数据索引
        else:
            #测试阶段
            i_idx = i - n + num_test + split_idx# 测试数据索引

        h = channel[i_idx,:]#选择当前时间步的信道数据 h

        # the action selection must be either 'OP' or 'KNN'保序量化 K个卸载决策
        m_list = mem.decode(h, K, decoder_mode)
# 每个卸载决策的总传输速率 r_list
        r_list = []
        for m in m_list:
            r_list.append(bisection(h/1000000, m)[0])

        #将最大传输速率的卸载决策存储在经验回放中
        mem.encode(h, m_list[np.argmax(r_list)])
        # the main code for DROO training ends here

        # the following codes store some interested metrics for illustrations
        # memorize the largest reward
        rate_his.append(np.max(r_list))#最大传输速率
        rate_his_ratio.append(rate_his[-1] / rate[i_idx][0])#最大传输速率与真实传输速率的比值
        # record the index of largest reward
        k_idx_his.append(np.argmax(r_list))#最大传输速率的对应的在K个卸载决策中的索引(排名)
        # record K in case of adaptive K
        K_his.append(K)#本次的K
        mode_his.append(m_list[np.argmax(r_list)])#记录最大传输速率的卸载决策

Algorithm Overview

Offloading Action Generation 

根据输入的无线信道增益 h 生成 k 个二元卸载决策 保序量化orKNN

def decode(self, h, k = 1, mode = 'OP'):
        h = torch.Tensor(h[np.newaxis, :])#(10,)->torch.Size([1, 10])
        self.model.eval()
        m_pred = self.model(h)#先用DNN输出一个连续卸载决策
        m_pred = m_pred.detach().numpy()
        # 再用这个连续决策生成 k 个二元卸载决策
        if mode is 'OP':#保序量化
            return self.knm(m_pred[0], k)
        elif mode is 'KNN':#KNN
            return self.knn(m_pred[0], k)
        else:
            print("The action selection must be 'OP' or 'KNN'")
保序量化的代码 :

输入m:DNN网络输出的N个relaxed卸载动作(0-1之间连续)

如:[0.99010485 0.62969816 0.4329 0.4087384  0.7058292  0.4560974 0.49688646 0.452399   0.20186329 0.21191679]

shape为N:(10,)

def knm(self, m, k = 1):
        # return k order-preserving binary actions
        m_list = []
        # generate the first binary offloading decision with respect to equation (8)
        m_list.append(1*(m>0.5))#生成第一个二元卸载决策

        if k > 1:
            # generate the remaining K-1 binary offloading decisions with respect to equation (9)
            m_abs = abs(m-0.5)#首先计算 m 中每个元素与 0.5 的绝对差值
            idx_list = np.argsort(m_abs)[:k-1]#对绝对差值进行排序,并获取前 k-1 个最小差值的索引
            for i in range(k-1):
                if m[idx_list[i]] >0.5:
                    # set the \hat{x}_{t,(k-1)} to 0
                    m_list.append(1*(m - m[idx_list[i]] > 0))
                else:
                    # set the \hat{x}_{t,(k-1)} to 1
                    m_list.append(1*(m - m[idx_list[i]] >= 0))

        return m_list

输出m_list:K个保序量化后的动作

如:[array([1, 1, 0, 0, 1, 0, 0, 0, 0, 0]), array([1, 1, 0, 0, 1, 0, 1, 0, 0, 0]), array([1, 1, 0, 0, 1, 1, 1, 0, 0, 0]), array([1, 1, 0, 0, 1, 1, 1, 1, 0, 0]), array([1, 1, 1, 0, 1, 1, 1, 1, 0, 0]), array([1, 1, 1, 1, 1, 1, 1, 1, 0, 0]), array([1, 0, 0, 0, 1, 0, 0, 0, 0, 0]), array([1, 0, 0, 0, 0, 0, 0, 0, 0, 0]), array([1, 1, 1, 1, 1, 1, 1, 1, 0, 1]), array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])] 

之前的方法:KNN

最近邻二元动作 knn 计算输入向量 m 与所有可能的二元卸载决策之间的距离,找与输入向量最相似的 k 个二元决策

    def knn(self, m, k = 1):
        # list all 2^N binary offloading actions
        if len(self.enumerate_actions) is 0:
            import itertools#笛卡尔积 所有可能的二元组合
            self.enumerate_actions = np.array(list(map(list, itertools.product([0, 1], repeat=self.net[0]))))

        # the 2-norm 计算与输入向量 m 的距离
        sqd = ((self.enumerate_actions - m)**2).sum(1)#输入向量 m 与所有可能决策向量的欧氏距离的平方
        idx = np.argsort(sqd)#距离最小的 k 个二元决策
        return self.enumerate_actions[idx[:k]]
Offloading Policy Update

经验回放:使用存储的数据样本训练DNN

Adam算法更新DNN的参数\theta_t

收集足够数量的新数据样本后,每\delta个时间步训练一次DNN

DNN迭代地从最佳状态动作对(𝐡𝑡,𝐱𝑡中学习,随着时间的推移生成更好的卸载决策输出

在有限内存空间约束的情况下,DNN仅从最新(且更精细)的卸载策略生成的最新数据样本中学习

Adaptive Setting of K

Convergence Performance

 Impact of Updating Intervals Δ
Computation Rate Performance

对于代码中optimization.py

方法是直接用的《Computation Rate Maximization for Wireless Powered Mobile-Edge Computing with Binary Computation Offloading》中提出的

包括先使用二分法找到最优的参数 v之后使用CD法优化模式选择,即固定其他通道的决策,仅改变当前通道的决策状态,对于每个通道,将其决策状态进行切换(0 变为 1,1 变为 0),计算相应的系统性能

论文地址具有二进制计算卸载的无线移动边缘计算的计算速率最大化,已标好代码中公式与论文中对应关系

# 二分搜索算法求解拉格朗日方程,先假定计算模式选择,然后优化传输时间分配
#线性搜索函数,需要两个输入,一个是信道矩阵,另一个是卸载动作,关于每个无线设备,除了W参数,其他的默认是同质的(我对代码的理解)。  
def bisection(h, M, weights=[]):
    # the bisection algorithm proposed by Suzhi BI
    # average time to find the optimal: 0.012535839796066284 s
 
    # parameters and equations
    o=100
    #是处理一位原始数据所需的周期数
    p=3
    #AP功率
    u=0.7
    #能量收集效率
    eta1=((u*p)**(1.0/3))/o
    #一个固定参数,不用理解
    ki=10**-26   
    #能量效率系数,跟计算机能耗相关的
    eta2=u*p/10**-10
    B=2*10**6
    #带宽
    Vu=1.1
    #Vu是原始数据(卸载数据)经过加密后的数据(原有数据在传输时进行额外添加)大小比原始数据的倍数
    epsilon=B/(Vu*np.log(2))
    x = [] # a =x[0], and tau_j = a[1:],时间分配矩阵
    
    M0=np.where(M==0)[0]#本地
    #为零或者1的索引
    M1=np.where(M==1)[0]#卸载
    
    hi=np.array([h[i] for i in M0])
    #本地、卸载设备对应的信道
    hj=np.array([h[i] for i in M1])
    
#  h:信道信息数组,包含了每个通道的信道增益
    if len(weights) == 0:
        # default weights [1, 1.5, 1, 1.5, 1, 1.5, ...]
        weights = [1.5 if i%2==1 else 1 for i in range(len(M))]
        
    wi=np.array([weights[M0[i]] for i in range(len(M0))])
    wj=np.array([weights[M1[i]] for i in range(len(M1))])
    #w是每个WD的权重
    
    
    def sum_rate(x):#总传输速率 式11a x第一项是a,后面是每个设备的tau
        sum1=sum(wi*eta1*(hi/ki)**(1.0/3)*x[0]**(1.0/3))
        sum2=0
        for i in range(len(M1)):
            sum2+=wj[i]*epsilon*x[i+1]*np.log(1+eta2*hj[i]**2*x[0]/x[i+1])
        return sum1+sum2
 
    def phi(v, j):#式17
        return 1/(-1-1/(lambertw(-1/(np.exp( 1 + v/wj[j]/epsilon))).real))
 
    def p1(v):#式18
        p1 = 0
        for j in range(len(M1)):
            p1 += hj[j]**2 * phi(v, j)
 
        return 1/(1 + p1 * eta2)
 
    def Q(v):#二分法 找到最优的参数 v
        sum1 = sum(wi*eta1*(hi/ki)**(1.0/3))*p1(v)**(-2/3)/3
        #local计算
        sum2 = 0
        for j in range(len(M1)):
            sum2 += wj[j]*hj[j]**2/(1 + 1/phi(v,j))
        #计算卸载
        return sum1 + sum2*epsilon*eta2 - v
        #这里来自公式19
 
    def tau(v, j):#式16
        return eta2*hj[j]**2*p1(v)*phi(v,j)
 
    # bisection starts here
    # 找到一个参数 v,使得函数 Q(v) 的值等于 0
    delta = 0.005 #二分法的精度
    UB = 999999999#初始的上界
    LB = 0#初始的下界
    while UB - LB > delta:
        v = (float(UB) + LB)/2
        if Q(v) > 0:
            LB = v
        else:
            UB = v
#  如果 Q(v) 的值大于 0,则将下界更新为当前的 v 值;否则,将上界更新为当前的 v 值
    x.append(p1(v))#p1(v)是a x第一项

    for j in range(len(M1)):
        x.append(tau(v, j))
       #计算每个WD的tau x后边是每个设备的tau
 
    return sum_rate(x), x[0], x[1:]#总传输速率和时间分配向量 x 中的各个元素
 
 
#然后使用坐标下降Coordinate DescentCD法来优化模式选择
def cd_method(h):
    N = len(h)#通道数量
    M0 = np.random.randint(2,size = N)#初始通道状态
    gain0,a,Tj= bisection(h,M0)#初始状态下的计算速率,a 和 Tj
    g_list = []
    M_list = []
    while True:
        # 固定其他通道的决策,仅改变当前通道的决策状态。
        # 对于每个通道,将其决策状态进行切换(0 变为 1,1 变为 0),计算相应的系统性能。
        for j in range(0,N):#对每一个通道 j 进行操作
            M = np.copy(M0)
            M[j] = (M[j]+1)%2#切换通道 j 的状态(0变为1,1变为0)
            gain,a,Tj= bisection(h,M)#调整后的计算速率、时间分配
            g_list.append(gain)
            M_list.append(M)
        g_max = max(g_list)
        if g_max > gain0:#寻找最优解
            gain0 = g_max
            M0 = M_list[g_list.index(g_max)]#更新最卸载策略
        else:
            break
    return gain0, M0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/798419.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AG32 的MCU与FPGA的主频可以达到568MHz吗

Customers: AG32/ AGRV2K 这个芯片主频和定时器最高速度是多少&#xff1f;用户期望 CPLD计时器功能0.1ns以下。 AGM RE: CPLD做不到 0.1ns的速率&#xff0c;这个需要10G以上的时钟。 那AGRV2K最高多少MHz呢&#xff1f; 一般200MHZ比较容易实现。 进一步说明&#xff1…

Vulnhub靶场DC-3-2练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. joomla漏洞查找2. SQL注入漏洞3. 破解hash4. 上传一句话木马5. 蚁剑连接shell6. 反弹shell7. 提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-3-2.zip 介绍&#…

51单片机5(GPIO简介)

一、序言&#xff1a;不论学习什么单片机&#xff0c;最简单的外设莫过于I口的高低电平的操作&#xff0c;接下来&#xff0c;我们将给大家介绍一下如何在创建好的工程模板上面&#xff0c;通过控制51单片机的GPIO来使我们的开发板上的LED来点亮。 二、51单片机GPIO介绍&#…

数据结构初阶(C语言)-复杂度的介绍

在学习顺序表之前&#xff0c;我们需要先了解下什么是复杂度&#xff1a; 一&#xff0c;复杂度的概念 我们在进行代码的写作时&#xff0c;通常需要用到许多算法&#xff0c;而这些算法又有优劣之分&#xff0c;区分算法的优劣则是通过算法的时间复杂度和空间复杂度来决定。 …

python 怎样生成窗体

通过import tkinter导入Tkinter模块&#xff0c;没有这句下面的都不成立了。 wintkinter.Tk()&#xff0c;这句是创建windows的窗口对象&#xff0c;注意后面的Tk&#xff0c;大小写。 win.title("窗口")&#xff0c;这段是设置窗口上的标题。 另外窗口的大小你可以通…

Linux命令更新-Vim 编辑器

简介 Vim 是 Linux 系统中常用的文本编辑器&#xff0c;功能强大、可扩展性强&#xff0c;支持多种编辑模式和操作命令&#xff0c;被广泛应用于程序开发、系统管理等领域。 1. Vim 命令模式 Vim 启动后默认进入命令模式&#xff0c;此时键盘输入的命令将用于控制编辑器本身&…

云计算【第一阶段(31)】PXE高效批量网络装机

一、系统安装 1.1、系统装机的三种引导方式 1. 硬盘 2. 光驱&#xff08; u 盘&#xff09; 3. 网络启动 pxe 1.2、系统安装过程 加载boot loader Boot Loader 是在操作系统内核运行之前运行的一段小程序。通过这段小程序&#xff0c;我们可以初始化硬件设备、建立内存空间的映…

解决mysql,Navicat for MySQL,IntelliJ IDEA之间中文乱码

使用软件版本 jdk-8u171-windows-x64 ideaIU-2021.1.3 mysql-essential-5.0.87-win32 navicat8_mysql_cs 这个问题我调试了好久&#xff0c;网上的方法基本上都试过了&#xff0c;终于是解决了。 三个地方结果都不一样。 方法一 首先大家可以尝试下面这种方法&#xff1a…

无人驾驶大热,新能源汽车智能化中的算网支持

来源新华社&#xff1a;百度“萝卜快跑”全无人驾驶汽车行驶在路上 当前&#xff0c;新能源汽车产业数智化已成为全球汽车产业数字化转型的焦点。一方面&#xff0c;随着人工智能、大数据、云计算等技术的深度融合&#xff0c;新能源汽车在自动驾驶、智能互联、能源管理等方面…

【自动驾驶汽车通讯协议】UART通信详解:理解串行数据传输的基石

文章目录 0. 前言1. 同步通讯与异步通讯1.1 同步通信1.2 异步通信 2. UART的数据格式3. 工作原理3.1 波特率和比特率3.2 UART的关键特性 4. UART在自动驾驶汽车中的典型应用4.1 UART特性4.2应用示例 5. 结语 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自…

STM32MP135裸机编程:BOOT跳转到APP前关闭所有中断、清除所有中断挂起标志操作方法

0 前言 一般来说&#xff0c;MCU/SOC的BOOT在跳转到APP前都需要进行环境清理的操作&#xff0c;其中必须进行的一项操作便是关闭所有中断、清除所有中断挂起标志。本文介绍基于STM32MP135裸机编程下关闭所有中断、清除所有中断挂起标志的操作方法。 1 操作方法 STM32MP135裸…

关于Kafka Topic分区和Replication分配的策略

文章目录 1. Topic多分区2. 理想的策略3. 实际的策略4. 如何自定义策略 1. Topic多分区 如图&#xff0c;是一个多分区Topic在Kafka集群中可能得分配情况。 P0-RL代表分区0&#xff0c;Leader副本。 这个Topic是3分区2副本的配置。分区尽量均匀分在不同的Broker上&#xff0c…

怎么减少pdf的MB,怎么减少pdf的大小

在数字化时代&#xff0c;pdf文件因其格式稳定、跨平台兼容性强等特点而广受欢迎。然而&#xff0c;随着内容的丰富&#xff0c;pdf文件的大小也日益增大&#xff0c;给文件传输和存储带来了不少困扰。本文将为你介绍多种减小pdf文件大小的方法&#xff0c;帮助你轻松应对这一问…

【ChatGPT】深入解析Prompt提示词及如何高效使用ChatGPT

一、Prompt提示词是什么&#xff1f; 1.1 Prompt的定义 Prompt是人工智能领域中的一个关键概念&#xff0c;尤其在自然语言处理&#xff08;NLP&#xff09;和生成型AI模型中。简而言之&#xff0c;prompt是一段文本或指令&#xff0c;用于引导或启动AI模型的特定响应或操作。…

成为CMake砖家(2): macOS创建CMake本地文档的app

大家好&#xff0c;我是白鱼。 使用 CMake 的小伙伴&#xff0c; 有的是在 Windows 上&#xff0c; 还有的是在 macOS 上。之前咱们讲了 windows 上查看 cmake 本地 html 文档的方式&#xff0c; 这篇讲讲 macOS 上查看 cmake 本地 html 文档的方法。 1. 问题描述 当使用 CMa…

C1W1.LAB.Preprocessing+Word frequencies+Logistic_regression_model

理论课&#xff1a;C1W1.Sentiment Analysis with Logistic Regression 文章目录 预处理导入包Twitter dataset简介查看原始文本处理原始文本处理超链接、Twitter 标记和样式分词去除标点和停用词词干处理 process_tweet() 词频构建与可视化导入包加载数据集字典字典实例添加或…

什么是im即时通讯?WorkPlus im即时通讯私有化部署安全可控

IM即时通讯是Instant Messaging的缩写&#xff0c;指的是一种实时的、即时的电子信息交流方式&#xff0c;也被称为即时通讯。它通过互联网和移动通信网络&#xff0c;使用户能够及时交换文本消息、语音通话、视频通话、文件共享等信息。而WorkPlus im即时通讯私有化部署则提供…

PostgreSQL日志文件配置,记录所有操作记录

为了更详细的记录PostgreSQL 的运行日志&#xff0c;我们一般需要修改PostgreSQL 默认的配置文件&#xff0c;这里整理了一些常用的配置 修改配置文件 打开 PostgreSQL 配置文件 postgresql.conf。该文件通常位于 PostgreSQL 安装目录下的 data 文件夹中。 找到并修改以下配…

Zabbix6.0使用自带模板(Redis by Zabbix agent 2)监控Redis数据库

注意&#xff1a;Zabbix6.0使用Redis by Zabbix agent 2 模板可直接监控Redis数据。 1、添加Redis账号密码信息(如果Redis没有设置密码可省略此步骤) vim zabbix_agent2.confPlugins.Redis.Sessions.redis.Uritcp://redis.huayunworld.com:6379 Plugins.Redis.Sessions.redis…

机器学习和人工智能对金融行业的影响——案例分析

作者主页: 知孤云出岫 目录 引言机器学习和人工智能在金融行业的应用1. 风险管理信用评分风险预测 2. 交易高频交易量化交易 3. 客户服务聊天机器人个性化推荐 4. 反欺诈检测 机器学习和人工智能带来的变革1. 提高效率2. 降低成本3. 提升客户体验 未来发展趋势1. 更智能的风控系…