【又一个作业】基于强化学习的雷达干扰样式选择(MATLAB实现)

【前情提要】有可能写的不对,发出来想做个纪念,也算是一种分享。

实验原理

雷达干扰决策

基于强化学习的干扰决策

雷达干扰决策是干扰方在侦察雷达信息的基础上,通过观测敌方雷达模式的变化,选择合适的干扰目标,合理地分配干扰资源,并根据雷达的工作模式选择对应干扰样式的过程。
基于强化学习的雷达干扰决策的具体过程为:

干扰方先侦察雷达辐射信号、提取雷达特征并识别雷达工作模式。然后根据工作模式的威胁等级,同时观测雷达前后工作模式的变化得到的干扰收益,可以选择针对当前雷达工作模式的干扰样式并实施干扰。雷达受到干扰后,因其自身的抗干扰措施,具备实时更新工作模式的能力。

基于强化学习的雷达干扰决策模型如下:

在这里插入图片描述
强化学习的基本要素为一个四元组(X,A,P,R),其中X表示外界环境的状态空间,A是Agent的动作空间,P是状态转移概率矩阵,R是即时回报矩阵。在基于深度强化学习的雷达干扰决策模型里,雷达对应是环境,雷达在收到干扰方实施干扰后,我们考虑雷达通过改变工作模式进行抗干扰。

在强化学习算法中,有以下四个要素:

  1. 环境模型(model):对环境信息的完整描述,包括:状态转移概率矩阵、即时回报矩阵等。
  2. 策略(policy):从状态空间到动作措施的映射,?(?,?) 表示在状态s下选择动作a的概率。
  3. 回报或奖励(reward):环境对Agent采取动作后的响应。
  4. 价值函数(value function):计算状态s t s_tst或状态-动作对< s t , a t > <s_t,a_t><st,at>的累积回报,是从长远的角度考察某个状态或状态-动作对的好坏。

这里,强化学习的目标就是最大化Agent接收到的延迟会报,而强化学习算法的目的就是对价值函数进行估计。此外,强化学习算法一般要求环境状态满足马尔可夫性,即环境在t+1时刻的响应仅依赖于其在t时刻的状态及接收到的动作。因此,我们采用的是马尔可夫决策模型。

  • 假设雷达共有N种状态,将第n nn种工作模式记作s n s_nsn,则雷达的状态集合可以表示为S = { s 1 , . . . s n , . . . , s N } S=\left\{s_1,...s_n,...,s_N\right\}S={s1,...sn,...,sN},雷达状态可以是雷达的工作模式,如搜索、跟踪、识别等。

干扰方无法直接获得雷达状态,而是通过侦察雷达的辐射信号并提取信号的特征,通过工作模式识别方法,获得当前雷达的工作模式,再根据当前的工作模式,以雷达干扰决策算法进行决策,选择干扰样式对雷达实施干扰。

  • 假设可实施的干扰样式共有M种,第m mm种干扰样式记作j m j_mjm,总的干扰样式集合为J = { j 1 , . . . j m , . . . , j M } J=\left\{j_1,...j_m,...,j_M\right\}J={j1,...jm,...,jM},常用的干扰样式有压制干扰、欺骗干扰等。干扰方的干扰收益可以通过雷达工作模式的改变估计干扰收益,将干扰收益记作R RR

时序差分强化学习

Sarsa算法

Sarsa算法是一种免模型的使用时序差分求解强化学习控制问题的方法,由于更新一次动作值函数需要用到五个量,即( s , a , r , s ′ , a ′ ) \left(s,a,r,s',a'\right)(s,a,r,s,a),其中s ss表示状态state,a aa表示动作action,r rr表示奖励reward,因此被称为sarsa算法。
在这里插入图片描述在迭代的时候,我们首先根据某种算法(如ϵ \epsilonϵ-贪婪法)在当前状态S SS选择一个动作A AA,系统此时会进入新的状态S ′ S'S,同时给我们一个奖励R RR。然后,在新的状态S ′ S'S下,我们再基于某算法(如ϵ \epsilonϵ-贪婪法)选择一个动作A ′ A'A,但是此时我们并不执行动作A ′ A'A,只是用来更新我们的价值函数(Q表),其更新公式为
Q ( S , A ) = Q ( S , A ) + α ( R + γ Q ( S ′ , A ′ ) − Q ( S , A ) ) Q\left(S,A\right)=Q\left(S,A\right)+\alpha\left(R+γQ\left(S',A' \right)-Q\left(S,A\right)\right)Q(S,A)=Q(S,A)+α(R+γQ(S,A)Q(S,A)) 其中,γ \gammaγ是衰减因子,α \alphaα是迭代步长。

算法总结:
在这里插入图片描述

Q-learning算法

Q-Learning算法和sarsa算法都是时序差分方法,它与sarsa算法的主要区别为:在“在状态S SS执行当前动作A AA,得到新状态S ′ S′S和奖励R RR后,直接更新Q表,不需要再选择新的动作A ’ A’A

算法总结:
在这里插入图片描述

Epsilon-greedy算法

ϵ \epsilonϵ-greedy策略基于一个概率来对探索和利用进行折中:

每次开始实验时,随机一个大于0小于1的值。
如果该值小于ϵ \epsilonϵ,以均匀概率随机选取动作,即探索;
否则,以1 − ϵ 1-\epsilon1ϵ的概率选择当前平均回报最高的动作,即利用。

除当前最优动作(贪婪动作)外,其余动作(探索动作)的选择概率相等,而没有利用它们当前所获得的回报信息,使得 Agent 有可能选择一个很“差”的动作,降低学习效率。

实验步骤和内容

实验分析

本题需要对即时回报矩阵(干扰收益)进行设计。由于考虑的是雷达通过转变工作模式进行抗干扰,因此干扰收益与雷达模式的转变和干扰样式相关。
在雷达处于工作模式s n s_nsn的情况下,若受到第m mm种干扰后,工作模式转变为k的概率为p n k q p_{nk}^qpnkq,那么雷达在受到第m mm种干扰后的工作模式转移概率矩阵P m P^mPm
在这里插入图片描述其中, 矩阵里的概率满足以下约束条件∑ k = 1 N p n k m = 1 \sum_{k=1}^Np_{nk}^m=1\quadk=1Npnkm=1

工作模式奖励是指干扰方在实施不同干扰样式后,导致雷达工作模式发生改变,干扰方从中获得的收益。针对雷达不同的工作模式,不同的干扰样式达到的干扰效果不同,因此获得的工作模式转移奖励不同。由题知,干扰方的即时回报矩阵R t R_tRt为(行:t 时刻雷达状态,列:t+1 时刻雷达状态)

在这里插入图片描述
由于我们干扰方的目的是让雷达处于较低风险值的时候,也就是状态S1识别状态,因此我们设置terminal为S1。

参数设置

在这里插入图片描述参数设置
state_num = 3; % 3种雷达状态
jam_num = 4; % 4种干扰样式,动作(在下文代码对应了action_num,也就是采取的干扰动作)
gamma = 0.8; % 衰减因子
alpha = 0.2; % 步长
epsilon = 0.8; % epsilon-greedy策略
episode_max = 10000;
iterative_max = 100;

具体实现

选用语言:MATLAB

  1. sarsa
function [Q,time,epi,action,state,reward_list] = sarsa(R,P)
    global state_num action_num;
    global terminal_state;
    global gamma alpha iterative_max episode_max;
    tic;
    Q = zeros(state_num,action_num);
    action = [];
    state = [];
    reward_list = [];
    for epi = 1:episode_max
        Q0 = Q;  % 上一个episode的Q
        is_terminal = false;
        step_count = 0;
        % 随机选择一个初始状态
        start_state = unidrnd(state_num);
        S = start_state;
        % 使用epsilon-贪婪法在当前状态S的所有可能动作中选取一个动作A
        A = choose_action(S,Q);
        while ~is_terminal
            step_count = step_count +1;
            S_ = new_state(S,A,P); % 执行动作,得到新的状态S' 
            reward =  R(S,S_);   % 动作A->状态S' 的即时回报
            A_ = choose_action(S_,Q);  % SARSA对 下一个状态的 动作
            % 更新Q表
            if S_~= terminal_state   % 不是终点
                Q_target = reward + gamma * Q(S_,A_);
            else  % 如果是终点,就没有下一步,直接复制
                Q_target = reward;
                is_terminal = true;
            end
            Q(S,A) = Q(S,A) + alpha*(Q_target - Q(S,A));
            % 更新状态和动作
            S = S_;
            A = A_;
            action = [action A];
            state = [state S];
            reward_list = [reward_list reward];
            
            if step_count > iterative_max  % 迭代次数过多
                break
            end
        end
         if norm(Q-Q0,2)<0.00005
             break
         end    
    end
    time=toc;
end
  1. Q-Learning
function [Q,time,epi,action,state,reward_list] = ql(R,P)
    global state_num action_num;
    global terminal_state;
    global gamma iterative_max alpha episode_max;
    Q = zeros(state_num,action_num);
    tic;
    action = [];
    state = [];
    reward_list=[];
    for epi = 1:episode_max
        Q0 = Q;  % 上一个episode的Q
        is_terminal = false;
        step_count = 0;
        % 随机选择一个初始状态
        start_state = unidrnd(state_num);
        S = start_state;
        while ~is_terminal
            step_count = step_count +1;
            % 使用e-贪婪法在当前状态S的所有可能动作中选取一个动作A
            A = choose_action(S,Q);
            % 执行动作,得到新的状态S'和奖励R
            S_ = new_state(S,A,P); % 获得回报,下一个状态
            reward = R(S,S_);
            % 更新Q表
            if S_~= terminal_state   % 不是终点
                Q_target = reward + gamma * max(Q(S_,:));
            else  % 如果是终点,就没有下一步,直接复制
                Q_target = reward;
                is_terminal = true;
            end
            Q(S,A) = Q(S,A) + alpha*(Q_target - Q(S,A));
            % 更新状态
            S = S_;
            action = [action A];
            state = [state S];
            reward_list = [reward_list,reward];
            if step_count > iterative_max  % 迭代次数过多
                break
            end
        end
        if norm(Q-Q0,2)<0.00005
            break
        end
    end
        time=toc;
end
  1. 子函数
    (1)获得新的状态
function [S_ ]= new_state(S,A,P) % 获得回报值和下一个状态
	global state_num
	% A:干扰动作 
	% S:现在的状态 
	% P:状态转移矩阵
	prob = P(S,:,A);
	S_  = randsrc(1,1,[(1:1:state_num); prob]);  % 以一定的概率产生下一个状态
end

(2) 选择动作ϵ \epsilonϵ-贪婪算法

function [A] = choose_action(S,Q)
	% greedy-policy
	global epsilon  action_num; 
	a = rand;
	if a > epsilon         % epsilon的概论进行探索
	    A = unidrnd(action_num);  % 随机选取一个动作
	else                   %1-epsilon的概率进行利用
	    [~, A] = max(Q(S,:));
	end
end

实验结果

sarsa

最优策略:3 3 1
运行时间:0.074913
Q表:
0.4271 0.3393 0.5998 0.3074
-0.2900 -0.2750 0.4690 -0.2194
0.2255 -0.1436 0.0820 -0.0037

在这里插入图片描述根据最佳策略,进行10步测试得到:
在这里插入图片描述

Q-Learning

最优策略: 3 3 1
运行时间: 0.042841
Q表
0.4435 0.3784 0.5998 0.3218
0.0236 0.0714 0.6999 -0.3360
0.2332 0.1087 0.0027 -0.0765

在这里插入图片描述根据最佳策略,进行10步测试得到:
在这里插入图片描述
我们设置的算法收敛条件为:两次episode结束后的Q矩阵差异不大,即∥ Q e p i − Q e p i − 1 ∥ F < β \Vert Q^{epi}-Q^{epi-1}\Vert_F<\betaQepiQepi1F<β,其中β \betaβ是我们自设的阈值,这里我们设置为5 × 1 0 − 5 5\times10^{-5}5×105

分析

Sarsa算法和Q-learning算法收敛时间分别为:0.080820和0.038544,其中Q-learning算法的收敛速度要优于Sarsa算法。
然后,我们绘制了Sarsa算法和Q-Learning算法的每一个episode内的迭代次数和episode的图像。这张图可以用来表示两种算法每次episode的耗费时间。

在这里插入图片描述算法收敛后,得到的最优策略为< S 1 , J 3 > , < S 2 , J 3 > , < S 3 , J 1 > <S_1,J_3>,<S_2,J_3>,<S_3,J_1><S1,J3>,<S2,J3>,<S3,J1>

到这里,正是内容就结束了。BUT我的结果还是存在一些问题,比如偶尔会出现两种算法的最优策略不同的情况,如下图所示。
但是调试代码我也没有找到解决方案,我分析可能是episode的最大数目不够大造成的。
在这里插入图片描述


版权声明:本文为qq_43485394原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。