资讯动态

DRL-Routing:深度强化学习SDN路由算法拆解与复现

发布时间:2026/10/5 10:34:53 来源:尧图企业网站定制
简介这是一篇2021年发表于《上海师范大学学报自然科学版》的学术论文PDF作者丁怀宝聚焦深度强化学习在软件定义网络SDN中的应用。文档面向SDN研究者、网络工程专业学生以及对智能路由算法感兴趣的读者提出一种DRL-Routing路由算法通过较全面的网络状态表示、一对多路由配置和可调节往返路径吞吐量的奖励函数缓解传统OSPF、LL等算法难以应对动态流量分布的问题属于流量工程与机器学习交叉领域的参考文献。资源包总计1个文件PDF格式大小约1.36MB内容包含论文摘要、引言、强化学习模型、DRL-Routing总体架构与实验仿真等完整章节可直接阅读引用。文中还介绍了OpenFlow网络发现、网络监控模块NMM和动作转换器模块ATM等关键实现并通过仿真数据显示该算法能获得更高奖励提升网络吞吐量降低时延与丢包率。目前已有652人浏览下载适合作为学术调研、课题设计或智能网络优化方向的学习资料。1. 深度强化学习路由算法为什么我要读这篇 2021 年的论文做 SDN 流量工程的人大概率都遇到过这种尴尬传统路由协议在网络拓扑稳定的情况下表现尚可一旦流量模型变了OSPF 的链路权重和 LL 的最小负载策略都像瞎子摸象只能靠局部信息做贪心决策。这篇《一种基于深度强化学习的SDN路由算法》把 DRL-Routing 算法完整地走了一遍——从状态怎么定义、动作怎么转换成 OpenFlow 流表、奖励函数怎么调到 Mininet Ryu 环境下的实验对比。它不是纯理论而是给出了一整套可以在自己的仿真环境里复现的框架。适合正在做 SDN 流量工程、深度强化学习路由方向毕业设计或课题研究的从业者你可以拿它当算法基线也可以直接照它的状态定义和奖励函数改自己的方案。论文的核心结论其实很直接经过训练的 DRL 智能体在 Fat-tree、NSFNet、ARPANet 三种拓扑上都拿到了比 OSPF 和 LL 更高的奖励文件传输时间大幅缩短。这篇博文就拆解它的建模思路、实现流程和那些论文里没写透但复现时一定会踩的坑。2. 从 OSPF 到 DRL-Routing状态、动作、奖励三元组怎么落到 SDN 上要理解 DRL-Routing先得回到强化学习的基本模型。智能体在状态 S_t 执行动作 A_t环境迁移到 S_{t1} 并返回奖励 R_{t1}目标是在整个决策序列里拿到累计奖励最大。这个框架迁移到 SDN 里关键问题就变成三个什么是状态、什么是动作、奖励怎么设计。2.1 状态向量 S [f1, f2, ..., f8]把网络切片成 DQN 能吃的输入论文把状态集定义成了八个分量本质上是把一段时间 Δt 内的网络信息压缩成一个固定维度的向量。复现时最容易出错的是分量之间的单位和量纲不统一直接拼成数组丢给神经网络训练大概率不收敛。f1 是链路容量率集c_ij bt(e_ij) / max(bt(e_ij))也就是每条链路的带宽占用率做了归一化取值落在 [0, 1] 附近。f2 是链路吞吐率 x_ij D(e_ij) / (bt(e_ij) × Δt)其中 D(e_ij) 是 Δt 内从交换机 i 经链路 e_ij 发到交换机 j 的数据总量。注意这里和 f1 的区别f1 是带宽被占用的比例f2 是实际传输效率。f3 是链路延迟集延迟这个量在 Mininet 仿真里很好拿但放到真实网络里需要从 LLDP 或主动探测协议里算单位建议统一成毫秒再做归一化。f4 是链路状态值链路在 Δt 内工作则 s_ij 1否则为 0。f5 是链路信任级别论文里初始化为中值复现时可以用 0.5。f6 和 f7 分别是往返链路方向上交换机吞吐率的平均值f8 是链路经过交换机的概率集。提示状态向量的每个分量都是时间窗口 Δt 内的聚合统计量不是瞬时值。这意味着你的网络监控模块要按固定周期采样并计算滑动平均而不是每次动作后立刻抓一次数据。2.2 动作集 A一对多配置才是这个算法的核心设计动作集 A {a_i}, 1 ≤ i ≤ h其中 a_i 是源交换机到所有目标交换机及其反向路径的集合。这句话读起来有点绕实际意思是智能体每次选择一个动作不是给单个流指定一条路径而是同时给一批流或一整张路径矩阵下发路由规则。论文称之为一对多的网络配置。这样做的好处很实际如果每个流都单独让控制器算一次动作、下发一次流表控制器就成了瓶颈这在 SDN 架构里叫可伸缩性问题。DRL-Routing 把动作粒度从逐流提升到逐源节点到全部目标节点的路径集合动作空间被压缩训练和推理的负载都降下来了。复现时要注意动作转换器模块需要把智能体输出的动作索引映射成具体的路径列表再通过 OpenFlow 消息批量写入交换机的流表。论文里特别提到路径更新时由路径上最后一台交换机向第一台交换机发送消息删除旧路径在交换机中的相应规则。这个删旧规则的动作如果时序不对会出现一段时间的路由黑洞后面避坑章会专门讲。2.3 奖励函数 r r1 r2吞吐率与延迟的加权博弈奖励函数是强化学习算法里最玄学的部分。论文给的公式是 r r1 r2r1 是吞吐率部分r2 是延迟部分。r1 又拆成 r1 φ × r_u1 (1 - φ) × r_d1分别表示源交换机到目标交换机方向、以及反向的吞吐率。φ ∈ [0, 1] 是影响因子φ 1 时只优化源到目标方向的吞吐率。这个设计的巧妙之处在于它把往返路径的吞吐率都塞进了奖励智能体学习时不会只优化单方向避免出现“去程跑满、回程拥塞”的偏科行为。复现时建议 φ 先用 0.5让双向权重一致跑通后再改成 0.7 或 0.3 观察行为差异。延迟部分 r2 论文没给具体表达式只说奖励值越高代表越多延迟较少的数据包能传输到目标交换机。我一般会自己实现为 r2 -avg_delay / max_delay把平均延迟归一化后取负这样延迟越大惩罚越重和吞吐率部分的方向一致。奖励函数每个分量的数值范围必须控制好否则神经网络对梯度的感知会被某个分量主导。3. DRL-Routing 算法实现PDA 函数、经验缓存和 Dueling DQN 的配合论文把算法流程拆成了 15 个步骤核心思路是接收拓扑、构造动作集、初始化缓存、用 NMM 计算初始状态、然后每个 Δt 时间窗口内重复“采样状态 - 选动作 - 下发流表 - 算奖励 - 存经验 - 抽样学习”。这一段看起来像普通的 DQN 流程但有几个细节决定了复现效果。3.1 算法主流程的步骤拆解步骤 1 智能体接收初始网络拓扑 G(ν, ε)这个拓扑一般由 OpenFlow 网络发现应用通过 LLDP 报文扫描得到。步骤 2 调用 PDA 函数构造动作集PDA 在论文里没有展开全称但从上下文看是路径发现与动作生成模块作用是把拓扑 G 中可行的源-目标路径枚举出来形成动作空间。步骤 3 和步骤 4 初始化经验缓存步骤 5 把每条链路的信任级别设为一个中值我一般设为 0.5。步骤 7 调用 NMM 计算初始状态然后就进入主循环每隔 Δt 时间智能体基于当前状态选动作ATM 把动作转换成 OpenFlow 消息更新交换机流表NMM 再收集新的网络信息计算下一时刻状态和奖励把 (S_t, A_t, R_t, S_{t1}) 存进缓存并从缓存里抽一批样本做梯度更新。# DRL-Routing 训练主循环的核心骨架 def drl_routing_train(env, agent, delta_t1.0, max_episodes500): # env 封装了 Mininet/Ryu 的接口 G env.get_topology() # 步骤 1: 获取拓扑 action_set build_action_set(G) # 步骤 2: PDA 函数构造动作集 replay_buffer ReplayBuffer(capacity20000) # 步骤 3-4: 初始化经验缓存 link_trust init_link_trust(G, mid0.5) # 步骤 5: 信任级别设为中值 # 步骤 7: 调用 NMM 计算初始状态 state env.nmm.collect_state(G, delta_t) for episode in range(max_episodes): total_reward 0 for t in range(env.max_steps_per_episode): action agent.select_action(state, action_set) # 智能体选动作 next_state, reward env.step(action, delta_t) # ATM 下发流表并采集反馈 replay_buffer.push((state, action, reward, next_state)) # 从缓存抽样学习 if len(replay_buffer) BATCH_SIZE: batch replay_buffer.sample(BATCH_SIZE) agent.update(batch) state next_state total_reward reward # 每个 episode 结束可以重置网络流量模型 env.reset_traffic()代码的逻辑说明外层循环控制训练轮数内层循环是 Δt 时间窗口内的交互过程。build_action_set对应 PDA 函数它返回的动作集在整个训练过程中可以固定也可以每隔若干轮根据拓扑变化重建。env.step内部完成两件事——把动作转成 OpenFlow 流表消息下发以及等待 Δt 时间后用 NMM 采集下一状态。参数上最需要注意的是BATCH_SIZE和replay_buffer的容量论文实验用的是带优先级抽样的缓存容量太小会导致样本多样性不足动作价值估计偏差大。3.2 Dueling DQN 与优先级抽样为什么不是普通 DQN论文引用了带优先级抽样的竞争型网络架构也就是 Dueling DQN 加 Prioritized Experience Replay。Dueling 结构把 Q 值拆成状态价值 V(s) 和优势函数 A(s, a)在路由这种“部分状态下所有动作收益都差不多”的场景里学习效率更高。优先级抽样则让更新幅度大的历史样本更容易被抽到加快收敛。复现时不必从零实现用现有的强化学习库搭一个 Dueling DQN 网络即可优先级抽样可以先用随机抽样跑通确认整个链路没问题后再加上。训练稳定性上目标网络同步周期设置为每 2000 步同步一次比较稳妥太频繁会引入波动。3.3 时间窗口 Δt 的选择论文给出的答案是 1 秒论文在算法执行部分明确说通过经验驱动的方式尝试不同的 Δt 取值当 Δt 1 s 时算法在所有度量上提供了最好的性能。这个取值是有道理的Δt 太大状态信息过于平滑智能体对流量突变的反应滞后Δt 太小状态波动剧烈训练不收敛而且控制器频繁下发流表开销压不住。仿真环境里 Δt 1 s 是稳妥起点但如果你的网络规模更大或者链路延迟本身在几十毫秒量级可以把 Δt 适当放大到 2-5 s以状态过渡平缓为优先级。4. 仿真实验与指标对比DRL-Routing 到底赢在哪里论文的实验部分使用的是 Mininet 建虚拟网络、Ryu 做 OpenFlow 控制器、Iperf 生成流量跑了 Fat-tree、NSFNet、ARPANet 三种拓扑。这套组合在今天看依然是最容易复现的方案。实验对比了 DRL-Routing 与 OSPF、LL 三种算法指标有三个奖励之和、平均文件传输时间、平均利用率。4.1 仿真环境的搭建顺序Mininet 负责在网络命名空间里模拟主机、交换机和链路Ryu 实现控制器逻辑Iperf 在主机之间打流生成 TCP/UDP 流量。搭建顺序我建议是先用 Mininet 脚本启动拓扑确认交换机之间 LLDP 链路发现正常再让 Ryu 应用接入最后用 Iperf 产生背景流量。DRL-Routing 应用分为网络监控模块和动作转换器模块NMM 从 Ryu 控制器查询端口统计信息和 LLDP 延迟数据ATM 根据智能体动作生成 OFPT_FLOW_MOD 消息。这里一个常见做法是用 Ryu 的 REST 接口暴露统计数据外部训练脚本通过 HTTP 拉取曲线比写进 Ryu 应用里再实时调试要清晰。4.2 三组实验数据的表格解读下面的表是论文表 1 的整理版。看数据要抓住三点。第一奖励之和的差异在 ARPANet 拓扑上DRL-Routing 拿到 80.37OSPF 只有 45.02LL 只有 31.50差距接近一倍。强化学习奖励不是带宽的直接映射但这个差距反映了智能体找到了让更多时延敏感数据包成功到达目的地的路径组合。第二平均文件传输时间在 NSFNet 上40 GB 文件 DRL-Routing 用 22.68 s而 OSPF 要 56.70 sLL 要 48.00 s。注意这里传输的是固定大小文件时间越短说明路径上有效吞吐越高拥塞和重传越少。第三平均利用率在 NSFNet 上 DRL-Routing 达到 0.44OSPF 和 LL 只有 0.23 和 0.27。利用率高不是坏事它表示网络带宽被更充分地用起来了这正是流量工程的目标。网络拓扑算法奖励之和平均文件传输时间/s平均利用率Fat-treeDRL-Routing488.1079.200.25Fat-treeOSPF344.89200.340.13Fat-treeLL429.79151.200.15NSFNetDRL-Routing107.3722.680.44NSFNetOSPF95.9356.700.23NSFNetLL67.2848.000.27ARPANetDRL-Routing80.3714.400.48ARPANetOSPF45.0229.700.43ARPANetLL31.5029.700.434.3 为什么 OSPF 和 LL 打不过 DRL-Routing论文里的归因是 OSPF 和 LL 都基于贪婪方法不适用于流量不断变化的网络。这句话值得展开OSPF 的路由计算本质上是基于链路权重跑 Dijkstra权重一般是静态配置或根据带宽简单调整流量一旦变化它不会主动重新规划路径。LL 最小负载算法会选当前负载最小的路径但它是局部视角只看到单条链路的负载看不到端到端的吞吐和延迟权衡。DRL-Routing 的优势在于状态向量包含了链路容量率、吞吐率、延迟、链路状态、信任级别以及往返方向的统计信息奖励函数又能让智能体同时优化双向吞吐训练完成后相当于把“什么流量模式配什么路径”的经验固化在了网络参数里。不过要提醒一句训练的智能体迁移到新的拓扑时动作集要重新用 PDA 构造状态向量的维度结构不变但网络参数可能需要在新拓扑上继续微调。5. 复现避坑指南状态、奖励、流表时序和 Mininet 的四个坑论文写得再细实验复现时总会遇到论文没提的问题。下面这四条是我在复现类似算法时踩过或者看别人踩过的坑每一条都是现象、原因、解决三步。5.1 状态向量数值范围不一致导致训练发散先是现象DQN 训练几十轮后 loss 不降反升奖励曲线剧烈震荡。原因是状态向量里 f1 容量率做了归一化f2 吞吐率的分母是 bt(e_ij) × Δt但 f3 延迟拿的是原始毫秒数有的链路延迟几位数有的几十位数数值范围不在一个量级。神经网络对于这种尺度不一致的输入非常敏感梯度更新会被大数值分量主导。解决方法是把延迟、信任级别、概率值全部归一化到 [0, 1] 区间。延迟可以做 min-max 归一化f5 信任级别本身就是 0-1f8 概率集也是 0-1主要问题是 f3 和 f6/f7 的吞吐率平均值。我一般会维护一个滑动窗口的最大最小值再用 (x - min) / (max - min) 做在线归一化保证每个分量数值相对均衡。5.2 奖励函数稀疏和方向不一致先是现象智能体训练了很久路由策略还是接近随机奖励曲线偶尔上升又掉下来。原因是奖励函数里 r1吞吐率和 r2延迟方向没有严格统一。比如吞吐率是越大越好但如果你把延迟也设计成“越大越好”两个目标就打架了。解决方法是把延迟部分做成负向奖励比如 r2 -归一化延迟这样智能体的优化方向就是双向统一的“吞吐率越高、延迟越低”。奖励稀疏的问题在路由场景里很常见尤其当 Δt 较短时一次动作造成的影响在短窗口内不明显奖励值波动大。可以适当拉长 Δt或者把奖励做成多个 Δt 的累积值再反馈给智能体。论文里 Δt 1 s 是实验结果如果你的流量模型跨度大需要重新尝试。5.3 更新路径时先删旧规则再下新规则造成路由黑洞先是现象路径切换过程中出现大包延迟抖动甚至丢包。原因是 ATM 在更新交换机流表时论文原话是“由路径上最后一台交换机将 OpenFlow 消息发送到第一台交换机删除旧路径在交换机中的相应规则”。这个顺序如果严格执行相当于先把整条旧路径拆掉再装新路径中间有一段窗口期交换机不知道该往哪转发。解决方法是修改 ATM 的下发顺序先向新路径上的全部交换机下发新规则匹配到低优先级再删除旧规则匹配到高优先级。这样新旧规则短暂共存新规则优先匹配流量自然切到新路径不会出现黑洞。这个坑在论文里没有细说但实际用 Ryu 调流表时一定会遇到。5.4 Mininet 仿真里 Iperf 的测量偏差先是现象实验跑出来的文件传输时间比论文数据差很多而且重复实验方差大。原因是 Mininet 默认的链路带宽和延迟设置与实际网络差异大Iperf 默认使用 TCP 协议TCP 窗口大小、拥塞控制算法都会影响吞吐测量。解决方法是先校准环境用 iperf3 单独测一条直连链路的基线吞吐确认 Mininet 的链路参数是否符合预期。再就是固定 Iperf 的参数比如-t 30 -i 1 -w 2M否则不同实验之间没有可比性。论文里 40 GB 文件的传输时间在 Mininet 里也走的是虚拟链路如果你发现自己的时间戳偏差特别大先去看交换机端口的队列策略是不是启用了缓存导致延迟被吸收。5.5 经验缓存容量与 Δt 的匹配先是现象训练后期奖励收敛了但策略在新流量模式下表现突然恶化。原因是经验缓存容量太小或者抽样方式对近期样本的偏向不够导致智能体学到的策略只适配训练时的流量分布。解决方法是把缓存容量设得足够大论文用的带优先级抽样本身就比均匀抽样更容易保留有价值的历史样本。复现时建议缓存容量不小于 20000 条经验每条经验是一个四元组 (S_t, A_t, R_t, S_{t1})按 Δt 1 s 计算对应 5 小时以上的网络运行数据。如果你发现策略泛化能力差优先检查缓存容量和抽样比例而不是盲目调学习率。6. 把 DRL-Routing 搬进自己的仿真环境复现骨架与验证技巧论文看懂了、坑也知道在哪了最后一步是把这套算法落成自己的代码。6.1 定义状态提取与动作映射接口按论文的思路最小可复现的骨架需要三个模块拓扑发现、状态采集、动作下发。拓扑发现用 Ryu 的 LLDP 处理函数可以拿到交换机之间的链路信息。状态采集要周期遍历所有链路的端口统计计算 f1 和 f2。动作映射是把动作索引转换成 OpenFlow 流表规则下发这里建议先用一个静态路由表做 baseline确认下发链路没问题后再接入 DRL agent。# 状态提取和动作映射的核心接口 class NetworkMonitor: def collect_state(self, delta_t): # 遍历所有链路 e_ij计算 8 个分量 state [] for link in self.links: bt link.bandwidth_usage(delta_t) # bt(e_ij) d link.total_data(delta_t) # D(e_ij) state.append({ f1_capacity: bt / max(link.bandwidth, 1e-9), f2_throughput: d / (bt * delta_t), f3_delay: self.normalize_delay(link.delay), f4_status: 1 if link.is_active() else 0, f5_trust: self.link_trust[link.id], # f6/f7/f8 按往返方向和概率汇总 }) return flatten_state(state) class ActionTransformer: def apply_action(self, action_idx, action_set): paths action_set[action_idx] # 一对多路径集合 # 先下发新路径低优先级规则 for path in paths: for switch_id, port in path: self._install_low_priority_rule(switch_id, port) # 再删除旧路径高优先级规则 for path in self.old_paths: for switch_id, port in path: self._remove_rule(switch_id, port) self.old_paths paths这个代码的核心是先把状态采集和动作下发解耦。NetworkMonitor.collect_state返回的是一个定长向量注意所有分量要拼成同一个数值区间再做输入ActionTransformer.apply_action里的先下新规则再删旧规则就是避坑章里提到的顺序修正。我在第一次复现时直接用论文顺序删旧再下新丢包率上升了 10%改成先下后删才恢复正常。6.2 训练循环先跑通再调参训练部分的骨架可以用第一节给出的drl_routing_train但有几个参数和策略值得单独调整。第一探索率 ε 从 1.0 线性衰减到 0.05衰减步数建议不低于 10000 步路由场景的动作空间不算大但网络状态维度高需要足够探索。第二学习率 1e-4 到 3e-4 之间用 Adam 优化器不要用太大学习率否则 Dueling DQN 的优势函数分支很容易震荡。第三目标网络同步周期在 1000-3000 步之间太频繁会让 Q 值估计不稳定太稀疏会让学习方向滞后。# 在 Mininet 中运行 DRL-Routing 实验的常用命令组合 sudo mn --topofattree --controllerremote,ip127.0.0.1,port6633 ryu-manager dRL_routing_controller.py --observe-links iperf3 -c 10.0.0.2 -t 60 -i 1 -w 2M命令说明第一条启动 Mininet 的 fat-tree 拓扑控制器指向本地 Ryu第二条启动 Ryu 控制器并开启链路观察--observe-links会周期发送 LLDP 发现链路这是 NMM 模块获取拓扑和延迟的数据来源第三条用 iperf3 在两台主机之间打 60 秒流量-w 2M固定 TCP 窗口大小减少前面讲的测量偏差。训练脚本和 Ryu 控制器之间可以通过共享文件或 TCP 端口传递状态和动作如果不想引入额外依赖先从脚本启动控制器、用 REST API 查询端口统计信息是最快的方案。6.3 验证算法效果别看单点指标看三组对照论文实验的验证维度是奖励之和、平均文件传输时间、平均利用率。复现时建议也做成三组对照实验DRL-Routing、OSPF、LL。OSPF 在 Ryu 里有现成实现LL 需要自己写一个最小负载路径选择逻辑。跑实验时注意每次随机种子固定流量模型用同样的 Iperf 脚本生成否则算法之间的差异会被流量随机性淹没。奖励曲线收敛后把智能体的探索关闭在测试拓扑上重新生成一组陌生流量看文件传输时间和利用率是否保持优势。这一步很关键因为训练时的流量分布和测试时的流量分布不一致才能验证算法学到的路由策略是不是真的泛化而不是背下了训练集的答案。从那以后我每次在 Mininet 里跑这类深度强化学习路由实验都会强制走一遍三件套检查状态向量的每个分量是否都在合理的数值区间确认流表更新是先下新规则再删旧规则再把对照组的三条实验跑完才敢下结论。希望这几条经验和这份算法拆解能帮到你尤其是那些卡在 DQN 训练不收敛和流表切换丢包问题上的同行。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑