✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。
🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:做科研,博学之、审问之、慎思之、明辨之、笃行之,是为:博学慎思,明辨笃行。
🔥 内容介绍
一、引言
D2D 通信作为一种新兴的通信技术,凭借其能够在近距离用户设备间直接通信的特性,为提升蜂窝网络的性能带来了显著潜力。它不仅能有效提高系统吞吐量、频谱效率以及能量效率,还为用户提供了更为灵活的通信方式。然而,当 D2D 链路与蜂窝用户共享频谱资源时,不可避免地会产生层间干扰,严重影响通信质量。传统集中式资源分配方法虽能在一定程度上解决资源分配问题,但对精确信道状态信息的依赖使其在动态环境中面临高昂的开销以及实时获取困难的挑战。因此,研究一种高效的分布式资源分配与功率控制算法迫在眉睫。基于 Q - learning 的算法以其分布式特性和自主学习能力,为解决这一问题提供了创新的思路,有望在复杂多变的通信环境中实现更优的资源管理。
二、D2D 通信系统模型
(一)系统架构
考虑一个蜂窝网络,其中包含多个蜂窝用户(CU)和多个 D2D 用户对。基站负责管理蜂窝用户的通信,并对 D2D 通信进行一定的监管。D2D 用户对在基站的控制下,可复用蜂窝用户的频谱资源进行直接通信。
(二)干扰模型
- 层间干扰
:当 D2D 链路与蜂窝用户共享频谱时,D2D 发射机可能会对蜂窝用户接收机产生干扰,同时蜂窝用户发射机也可能干扰 D2D 接收机。这种层间干扰严重影响了双方的通信质量,是资源分配与功率控制需要重点解决的问题。
- 同层干扰
:在 D2D 用户之间,如果多个 D2D 对复用相同频谱,还会产生同层干扰。为了简化分析,假设基站通过合理的资源分配策略,能够有效避免大部分同层干扰,主要关注层间干扰的处理。
(三)系统吞吐量
系统总吞吐量由蜂窝用户吞吐量和 D2D 用户吞吐量组成。蜂窝用户吞吐量取决于其接收信号强度、干扰水平以及信道带宽等因素;D2D 用户吞吐量则与自身发射功率、接收信号强度、来自蜂窝用户的干扰以及复用的信道带宽相关。在保证蜂窝用户服务质量(QoS)的前提下,最大化系统总吞吐量是本文算法的核心目标。
三、Q - learning 强化学习算法原理
(一)基本概念
Q - learning 是一种基于值函数的无模型强化学习算法。在该算法中,智能体通过与环境进行交互,不断尝试不同的动作,并根据环境反馈的奖励信号来学习最优策略。智能体在每个状态下选择动作的依据是 Q 值,Q 值表示在当前状态下执行某个动作所能获得的长期累积奖励的期望。
四、基于 Q - learning 的联合资源分配与功率控制算法
(一)算法框架
- 智能体定义
:将每个 D2D 用户对视为一个独立的智能体。每个智能体需要自主选择合适的信道以及调整发射功率,以适应环境变化并最大化自身收益。
- 状态空间
:每个 D2D 智能体的状态空间由其自身的信道质量、周围蜂窝用户的干扰水平、已占用信道情况以及自身发射功率等信息组成。通过对这些信息的量化处理,将其表示为离散的状态。
- 动作空间
:动作空间包括所有可用的信道选择以及一系列可能的发射功率值。每个 D2D 智能体可以从动作空间中选择一个动作,即选择一个信道并设置相应的发射功率。
(二)奖励函数设计
奖励函数的设计至关重要,它引导着 D2D 智能体学习到最优策略。奖励函数主要考虑以下几个方面:
- 系统吞吐量提升
:若 D2D 智能体的动作能够增加系统总吞吐量,则给予正奖励,鼓励智能体采取此类动作。例如,当 D2D 智能体选择的信道和功率组合使得 D2D 链路吞吐量增加,同时未对蜂窝用户造成过大干扰导致其吞吐量下降时,给予正奖励。
- 蜂窝用户 QoS 保障
:为确保蜂窝用户的服务质量,若 D2D 智能体的动作导致蜂窝用户吞吐量低于一定阈值,则给予负奖励,促使智能体避免此类动作。
- 功率消耗
:考虑到能量效率,对于过高的发射功率消耗给予一定的负奖励,引导智能体在满足通信需求的前提下尽量降低功率消耗。
⛳️ 运行结果
📣 部分代码
%% classification on ranData_rho02
load ranData_rho02;
% call your solver to have (w,b)
% you can tune the parameter lambda (default 0.1)
% change the parameters if needed
[p,N] = size(Xtrain);
lam = 0.1;
w_init = randn(p,1);
b_init = 0;
t_init = zeros(N,1);
opts = [];
opts.tol = 1e-3;
opts.maxit = 1000;
opts.subtol = 1e-4;
opts.maxsubit = 10000;
opts.beta = 1;
opts.w0 = w_init;
opts.b0 = b_init;
opts.t0 = t_init;
%%
fprintf('Testing by student code\n\n');
t0 = tic;
% change the name "ALM_SVM" if you use ADMM
[w_s,b_s,out_s] = ADMM_SVM(Xtrain,ytrain,lam,opts);
time = toc(t0);
pred_y = sign(Xtest'*w_s + b_s);
accu = sum(pred_y==ytest)/length(ytest);
fprintf('Running time is %5.4f\n',time);
fprintf('classification accuracy on testing data: %4.2f%%\n\n',accu*100);
fig = figure('papersize',[5,4],'paperposition',[0,0,5,4]);
semilogy(out_s.hist_pres,'b-','linewidth',2);
hold on
semilogy(out_s.hist_dres,'r-','linewidth',2);
legend('Primal residual','dual residual','location','best');
xlabel('outer iteration');
ylabel('error');
title('student: ranData\_rho02');
set(gca,'fontsize',14)
print(fig,'-dpdf','ranData_rho02_student')
%%
fprintf('Testing by instructor code\n\n');
lam = 0.1;
opts = [];
opts.tol = 1e-3;
opts.maxit = 1000;
opts.subtol = 1e-4;
opts.maxsubit = 10000;
opts.beta = 1;
opts.w0 = w_init;
opts.b0 = b_init;
opts.t0 = t_init;
t0 = tic;
[w_p,b_p,out_p] = ALM_SVM_p(Xtrain,ytrain,lam,opts);
time = toc(t0);
% do classification on the testing data
pred_y = sign(Xtest'*w_p + b_p);
accu = sum(pred_y==ytest)/length(ytest);
fprintf('Running time is %5.4f\n',time);
fprintf('classification accuracy on testing data: %4.2f%%\n\n',accu*100);
fig = figure('papersize',[5,4],'paperposition',[0,0,5,4]);
semilogy(out_p.hist_pres,'b-','linewidth',2);
hold on
semilogy(out_p.hist_dres,'r-','linewidth',2);
legend('Primal residual','dual residual','location','best');
xlabel('outer iteration');
ylabel('error');
title('instructor: ranData\_rho02');
set(gca,'fontsize',14)
print(fig,'-dpdf','ranData_rho02_instructor')
🔗 参考文献
[1]张建昌.在蜂窝网中应用D2D通信技术研究[D].电子科技大学,2016.