main.py文件
main.py是基于深度强化学习技术优化无线网络中的资源分配项目的主程序,可以理解为主控脚本,负责初始化环境,创建Agent,执行训练与测试,记录性能指标,并最终画图展示结果.
程序整体结构由import部分,系统参数定义,DQN参数设置,Train()函数,训练循环,结果保存,性能图像展示几大部分组成,接下来继续解读这份文件.
import
import numpy as np
from DQN_agent import Agent
from Environment import Env_cellular
引入Python中处理矩阵和数组运算的核心库NumPy,在这个项目中用于创建动作数组,生成随机数,累计平均与绘图数据处理等.
再从DQN_agent.py与Environment.py中分别导入Agent类和Env_cellular类,也就是前两章的代码.
Agent是强化学习智能体的封装,包含Q-Network的创建与更新,ε-greedy策略执行,存储经验并从ReplayBuffer中学习,支持模型保存与加载等,是整个DQN学习过程中的关键组件.
Env_cellular定义了蜂窝网络环境,主要负责初始化基站和用户的位置,模拟信道衰落,计算每个用户的速率和系统的奖励,提供训练\测试的reset()和step()接口.
简单总结来说Agent就是控制智能体学习行为,Env-cellular提供一个可交互的无线网络环境,接受动作并反馈新的状态和奖励.
系统参数设置system parameters
'System Parameters ------------------------------------------------------------------------------'
n_x = 4 # BS on axis x
n_y = 4 # BS on axis y
maxM = 3 # Number of UE at each cell
min_dis = 0.01 # UE minimum distance between UE-BS
max_dis = 1.0 # BS minimum distance between UE-BS
max_p = 38. # BS maximum transmission power (in DB)
p_n = -114. # Noise power in dBm
power_num = 10 # Number power levels available (Action space)
'--------------------------------------------------------------------------------------------------'
参数名 | 数值 | 含义 | 用途 |
---|---|---|---|
n_x = 4 |
4 | X轴基站数目 | 在仿真区域中,X方向布置4个BS |
n_y = 4 |
4 | Y轴基站数目 | Y方向同样4个BS,总共 4x4=16 个BS |
maxM = 3 |
3 | 每个小区的用户数(UE) | 每个基站服务3个用户 |
min_dis = 0.01 |
0.01 | UE到BS的最小距离 | 避免用户位置与基站过近引发奇异值(如路径损耗为0) |
max_dis = 1.0 |
1.0 | BS之间的最小距离 | 控制网络拓扑密度,保证基站之间有固定距离 |
max_p = 38. |
38 dB | 最大发射功率 | 基站功率上限(38 dB ≈ 6.3W) |
p_n = -114. |
-114 dBm | 噪声功率 | 通常用于信噪比计算,代表热噪声+接收机噪声 |
power_num = 10 |
10 | 动作空间的功率等级数 | 强化学习中的每个动作对应一个发射功率级别 |
这些参数用来生成强化学习环境,形成一个4*4的基站网络拓扑,每个基站与多个用户交互,模拟资源调度问题,用户和基站之间根据距离和信道模型决定SINR和速率,power_num控制智能体可以选择的功率等级(可以理解为动作数量). |
Jakes信道模型建模的参数设定
'Requirement for modeling de Jakes Model -------------------------------------------------------------------'
fd = 10 # Maximum Doppler Frequency ( Reger to Eq. 2)
Ts = 20e-3 # Time intervals between intervals (Refer to Eq. 2)
'------------------------------------------------------------------------------------------------------------'
Jakes模型是一种用于模拟无线信道中多普勒扩展和瑞利衰落的经典模型,常用于模拟用户移动带来的信道时变型.
参数名 | 值 | 含义 | 用途 |
---|---|---|---|
fd = 10 |
10 Hz | 最大多普勒频移 (Maximum Doppler Frequency) | 模拟用户移动速度带来的频移;数值越大表示用户移动越快,信道变化越剧烈 |
Ts = 20e-3 |
0.02 秒 | 时间间隔 (Time Slot Duration) | 每次信道更新之间的间隔(即仿真的“时间步”) |
这两个参数被传入Env_cellular环境类中,用来生成符合Jakes模型的时变瑞利衰落信道,例如用于计算当前信道增益h(t).
局部干扰建模与聚簇感知范围
'Considerations ----------------- ----------------------------------------------------------------------------'
L = 3 # Represents the number of clusters to consider as adjacent (BSs L1=7BS, L2=19BS, L3=37BS)
C = 16 # (Ic) Number of interferers taked account for the localized reward (48 input state neurons)
'-------------------------------------------------------------------------------------------------------------'
参数 | 值 | 含义 | 用途 |
---|---|---|---|
L = 3 |
3 层聚簇 | 考虑多少层邻居基站作为“邻近干扰簇” | 控制“局部性”的范围,例如: L1 → 7 个BS,L2 → 19 个BS,L3 → 37 个BS |
C = 16 |
16 个干扰者 | 计算奖励时考虑的干扰基站数目 | 用于 DQN 状态输入维度(48 个神经元 ← 与16个干扰BS有关) |
局部建模法可以既能保留关键信息,又降低了状态维度,避免DQN输入维度过高.
其他参数设置
# ------------------------------------- Other params
ExpTag = 'FIFO10K'
max_reward = 0
ExpTag = ‘FIFO10K’ 表示实验标识符,可用于区分不同时间的设置或结果文件命名
max_reward = 0是指训练过程中用于记录目前为止的最大平均奖励,起到保存最佳模型时的判断标准和用于结果评估或early stopping的作用.
DQN算法核心参数
'DQN parameters -----------------------------------------------------------------------------------------------'
Gamma = 0.5 # Discount factor
epsilon = 0.9 # Initial epsilon value
eps_min = 0.01 # Final Epsilon value
batch_size = 256 # Batch Size
lr = 0.001 # Learning Rate
mem_size = 50000 # Memory size
'--------------------------------------------------------------------------------------------------------------'
参数 | 值 | 含义 | 用途 |
---|---|---|---|
Gamma = 0.5 |
折扣因子 γ | 用于未来奖励的折扣权重(值越小越重视即时奖励) | |
epsilon = 0.9 |
初始 ε | ε-greedy 策略中初始的探索概率(90% 探索) | |
eps_min = 0.01 |
最小 ε | ε衰减到的最小值(最终保留 1% 的探索) | |
batch_size = 256 |
批大小 | 每次从经验池中采样 256 条数据进行学习 | |
lr = 0.001 |
学习率 | 用于神经网络梯度更新(越小越稳定,越大越快) | |
mem_size = 50000 |
经验回放池大小 | 存储最多 5 万条 transition(s, a, r, s’)用于训练 |
gamma设置为0.5说明更关注短期回报,适用于信道快速变化的场景,epsilon会随着训练逐步衰减,形成从探索到利用的转变.
这些参数会作为初始化Agent时的输入,并直接影响学习效果,收敛速度和稳定性.
DQN训练过程中的控制参数
'---------------------------------------'
train_interval = 10 # Training interval
interval = 500 # Result print interval
replace = 100 # Update target network interval
Ns = 30001 # Number of intervals per episodes
test_intervals = 500 # Test interval
episodes = 1 # Episodes (Each episode randomly deploy UEs with new propagation conditions)
instances = 10 # Instances to average the results
source_seed = 0 # Fixed seed to intialize environment (for replicability)
'---------------------------------------'
参数 | 值 | 含义 | 说明 |
---|---|---|---|
train_interval = 10 |
每10步训练一次 | DQN每间隔10个时间步更新一次Q网络 | |
interval = 500 |
每500步打印一次 | 控制打印日志的频率(可视化与调试用) | |
replace = 100 |
每100步替换一次目标网络 | 固定间隔更新 target network(DQN 稳定学习关键) | |
Ns = 30001 |
每集步数 | 每个 episode 包含 30,001 个时间步 | |
test_intervals = 500 |
每500步测试一次 | 与训练环境分开,每隔500步进行性能评估 | |
episodes = 1 |
episode 数量 | 仅训练1轮,每轮随机部署新的UE拓扑(环境变化) | |
instances = 10 |
平均次数 | 重复实验10次,取平均值用于可视化和分析 | |
source_seed = 0 |
固定随机种子 | 用于控制随机过程的可复现性(replicability) |
当Ns = 30001时训练一次episode就会在每10步调用一次agent.learn(),每100步更新一次target网络,每500步做一次测试并打印性能.
训练\测试数据保存与模型加载保存控制项
这部分主要用于实验记录与重用模型.