Q-Learning在路径规划中的应用(MATLAB版)

目录

一、Q-Learning介绍 

二、Q-Learning在路径规划的应用

三、部分代码展示

四、结果展示

五、参考文献


一、Q-Learning介绍 

        Q-learning 是强化学习中的一种基于值函数的学习方法,用于解决无模型的马尔可夫决策过程(MDP)问题。在 Q-learning 中,代理尝试学习一个价值函数 Q(s, a),它估计在状态 s 采取动作 a 后所能获得的长期回报的价值。

Q-Learning结构:状态 s、动作a、奖励信号r、Q 值函数 (Q-table)、折扣因子 γ、学习率 α、探索-利用策略 

图1 Q-Learning结构图 

状态s:在 Q-learning 中,代理与环境进行交互,环境处于不同的状态。状态是描述环境的特定情况或配置的抽象表示。

动作a:代理在每个状态下可以执行的操作或决策。动作集合定义了代理可以采取的所有可能行动。

奖励信号r:在每个时间步,代理执行一个动作并转移到下一个状态时,环境会返回一个奖励信号。奖励信号指示代理动作的好坏,是代理学习的反馈。

Q 值函数Qtable:Q 值函数 Q(s, a) 估计在状态 s 下采取动作 a 后所能获得的长期累积奖励的价值。Q 值函数是 Q-learning 算法的核心,代表代理对每个状态动作对的预期回报。

学习率α:学习率 α 决定了在每次更新 Q 值时保留新旧信息的比例。较高的学习率会更快地更新 Q 值,但可能导致不稳定性;较低的学习率会使学习过程更平稳,但需要更多的训练时间。

 折扣因子γ:折扣因子 γ 用于权衡当前奖励和未来奖励的重要性。它决定了未来奖励的折现程度,有助于代理考虑长期回报。

探索-利用策略:Q-learning 使用探索-利用策略来平衡探索新策略和利用已知最优策略之间的权衡。通常使用 ε-贪心策略来在探索和利用之间做出决定。

更新规则:Q-learning 使用Bellman方程更新规则来更新 Q 值函数,以逐步逼近最优策略。更新规则通常包括计算当前 Q 值和未来最大 Q 值之间的差异,并根据学习率进行更新。如式(1):

Q(s_{t},a_{t})\leftarrow Q(s_{t},a_{t})+\alpha [r+\gamma *maxQ(s_{t+1},a_{t+1})-Q(s_{t},a_{t})]

Q-Learning算法的具体流程如下:

输入:环境信息(env)

           起始状态(Start)和目标状态(Target)

           α、γ、ε、训练时间、最大迭代次数

输出:Q-table

初始化

设置 Q_{m\times n}=0,t=0,i=0

s=s_{start}

while  t<t_{max}<t

        while i<最大迭代次数:

                随机生成随机数\sigma ,\sigma \in (0,1)

                if \sigma <\varepsilon:

                        随机选择一个动作a

                else:

                        根据s_{t}选择动作a

                获取下一个状态s_{t+1}=Q(s_{t},a_{t})

                if  s_{t+1}==s_{target}:

                        跳过循环

                更新Q(s_{t},a_{t})

                i=i+1

                s_{t}\leftarrow s_{t+1}

        t=t+1

二、Q-Learning在路径规划的应用

        Q-learning 在路径规划方面的应用是通过强化学习的方法来训练智能体(如无人机、智能车)学习如何在环境中找到最优路径。

状态空间定义:在路径规划任务中,状态通常是代表机器人或智能体在环境中的位置。状态空间可以是离散的(如网格地图上的特定位置)。

%rng(1) % 测试时固定地图不变
% 规划起点、终点和障碍物数量
myMap = struct('Size',[50,50],'MAP',[],'startState',[2 2],'finalState',[49,49], ...
    'obstaclesNum',50,'Obstacles',[],'Reward',[],'H',10,'W',10);
trainOpts = struct('MaxSteps',200,'MaxEpisodes',1000,'LearnRate',0.9,...
    'Epsilon',0.5,'gamma',0.8);

myMap.H = myMap.Size(1);
myMap.W = myMap.Size(2);
myMap.MAP = zeros(myMap.Size);
%myMap.obstaclesNum = randi([20,40],1,1); % 添加随机障碍物障碍物
while sum(myMap.finalState == myMap.startState) > 1
    % 保证起点与终点位置不同
    myMap.finalState = 1+[randi(myMap.Size(1)-2) randi(myMap.Size(2)-2)];
end
myMap.MAP(myMap.finalState(1),myMap.finalState(2)) = 150;  % 设置终点的奖励值
% 生成围墙,将四周用障碍物代替
myMap.MAP(1, :) = -100;
myMap.MAP(end, :) = -100;
myMap.MAP(:, 1) = -100;
myMap.MAP(:, end) = -100;
% 设置障碍物
myMap.Obstacles = find(myMap.MAP == 0);
myMap.Obstacles = myMap.Obstacles(randperm(length(myMap.Obstacles),myMap.obstaclesNum));
myMap.MAP(myMap.Obstacles) = -100; %设置障碍物位置为-1
% 设置起点位置
myMap.MAP(myMap.startState(1),myMap.startState(2)) = 0;
myMap.Reward = myMap.MAP;

动作空间定义:动作是代理可以在每个状态下执行的操作,一般网格地图有QLB4a 和 QLB8a两种可移动方向,QLB8a如图2(右)所示,有8个可行动的方向(上 左 下 右 右下 左下 右上 左上)。

图2 动作空间定义

奖励设计:奖励通常与到达目标或避免碰撞等目标相关。本文将智能体到达障碍物的奖励设置-100,到达终点奖励为150。

训练train:代理在环境中执行动作并根据奖励信号更新 Q 值函数。通过迭代训练,代理学习到在不同状态下选择最优的动作,以找到最佳路径。

% 训练参数设置
trainOpts = struct('MaxSteps',200,'MaxEpisodes',1000,'LearnRate',0.9,...
    'Epsilon',0.5,'gamma',0.8);

探索-利用策略:在路径规划中,探索策略可以帮助代理发现新的路径选择,避免陷入局部最优解。ε-贪心策略是一种常用的探索-利用策略,可以平衡探索和利用之间的权衡。

最优路径选择:查询 Q 表,可以选择在特定状态下采取的最优动作,以找到最佳路径。

三、部分代码展示

主函数

clc
clear
close all

%% 地图建模
%rng(1) % 此指令为测试时固定地图不变
% 设置超参数、规划起点、终点和障碍物数量
myMap = struct('Size',[50,50],'MAP',[],'startState',[2 2],'finalState',[49,49], ...
    'obstaclesNum',50,'Obstacles',[],'Reward',[],'H',10,'W',10);
trainOpts = struct('MaxSteps',200,'MaxEpisodes',1000,'LearnRate',0.9,...
    'Epsilon',0.5,'gamma',0.8);

myMap.H = myMap.Size(1);
myMap.W = myMap.Size(2);
myMap.MAP = zeros(myMap.Size);
%myMap.obstaclesNum = randi([20,40],1,1); % 例如,添加5个障碍物
while sum(myMap.finalState == myMap.startState) > 1
    % 保证起点与终点位置不同
    myMap.finalState = 1+[randi(myMap.Size(1)-2) randi(myMap.Size(2)-2)];
end
%myMap.MAP(25,25) = 0.5;
myMap.MAP(myMap.finalState(1),myMap.finalState(2)) = 150;  % 设置终点的奖励值
% 生成围墙,将四周用障碍物代替
myMap.MAP(1, :) = -100;
myMap.MAP(end, :) = -100;
myMap.MAP(:, 1) = -100;
myMap.MAP(:, end) = -100;
% 设置障碍物
myMap.Obstacles = find(myMap.MAP == 0);
myMap.Obstacles = myMap.Obstacles(randperm(length(myMap.Obstacles),myMap.obstaclesNum));
myMap.MAP(myMap.Obstacles) = -100; %设置障碍物位置为-1
% 设置起点位置
myMap.MAP(myMap.startState(1),myMap.startState(2)) = 0;
myMap.Reward = myMap.MAP;
%% 开始训练
Qtable = getTrainResult(myMap, trainOpts);

训练过程:

function [Qtable] = getTrainResult(mapStructure,qlTrainOpts)
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 参数初始化 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
mapStructure.MAP = mapStructure.MAP;
mapStructure.H = mapStructure.Size(1);
mapStructure.W = mapStructure.Size(2);
% 初始化Q表
Qtable = getInitQtable(mapStructure,mapStructure.startState,mapStructure.finalState);
%% %%%%%%%%%%%%%%%%%%%%%%%%%%% 更新Q 表 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 更新Q表的迭代次数
STEP = zeros(qlTrainOpts.MaxEpisodes,1);
tic;
for i = 1:qlTrainOpts.MaxEpisodes
    %  一个episode
    s = 1 ; % 每个迭代步骤的数量
    currentState = [mapStructure.startState(1) mapStructure.startState(2)];
    while s <= qlTrainOpts.MaxSteps % 每个episode的最大步数
         % 获取奖励值
        % 根据epsilon策略选择动作以找到下一个状态
        r = rand;
        lastState = currentState;
        currentState = getNextAction(qlTrainOpts.Epsilon, Qtable,currentState , r, i);
        if mapStructure.MAP(currentState(1),currentState(2)) >=0
            s = s + 1;
        else
            currentState = lastState;
        end
        % 跟新Q值
        rew = mapStructure.MAP(currentState(1),currentState(2));
        if(rew<100)
            Qtable = update_Q_table(currentState, rew, qlTrainOpts.LearnRate, qlTrainOpts.gamma, Qtable);                   %更新Q_table
        else
            Qtable = updata_reward_Q_table(currentState,rew,Qtable);
        end
        if sum(mapStructure.finalState == currentState) > 1 % 代理达到目标
            break
        end
    end % 结束一个episode
    STEP(i) = s;
end % 结束1000次训练的循环
toc
disp('训练完成!')
end

四、结果展示

1、训练完成

历时 0.060671 秒。
训练完成!
最小步数为30
最大奖励值为4.713578e+03

2、Qtable

图3 Qtable

3、根据如上Q表获取最优路径如下图所示。

图4 路径展示

4、训练过程展示

图5 回合迭代步数

 5、回合奖励值

图6 回合奖励值

五、参考文献

[1] Z. Zhang, "Four-wheeled Ackermann Robot Path Planning in 2D Maze Based on Q-Learning-Bezier Method," 2023 IEEE International Conference on Control, Electronics and Computer Technology (ICCECT), Jilin, China, 2023, pp. 36-41.

[2] Y. Gao, Y. Li and Z. Guo, "A Q-learning based UAV Path Planning Method with Awareness of Risk Avoidance," 2021 China Automation Congress (CAC), Beijing, China, 2021, pp. 669-673.

【免费】Q-Learning在路径规划中的应用(MATLAB版)资源-CSDN文库

  • 21
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Q-learning路径规划算法是一种经典的强化学习算法,常用于在未知环境进行路径规划。该算法可以通过不断探索和学习来寻找最优路径,并逐步提高其效率和准确性。在Matlab实现Q-learning路径规划算法,需要考虑以下几个步骤: 第一步,定义状态空间和动作空间。状态空间通常指的是机器人所处的环境状态,例如机器人的位置、速度、方向等;动作空间则指机器人所能够执行的动作,如前进、后退、左转、右转等。 第二步,定义奖励函数。奖励函数是用来评估机器人执行某个动作的好坏程度的函数,通常由用户根据具体情况来定义。在路径规划问题,奖励函数通常指的是机器人是否能够到达目标位置,如果能够到达,则奖励为正值,否则为负值。 第三步,定义Q表。Q表是一个状态-动作的二维矩阵,用来记录在某个状态下,执行某个动作所获得的奖励。当机器人学习过程,Q表会不断更新,直到找到最优路径。 第四步,采用ε-贪心算法进行探索。 ε-贪心算法是指机器人在训练过程,以一定的概率ε选择随机动作,以一定的概率1-ε选择当前Q值最大的动作,从而使机器人不断探索未知空间,逐步提高自己的路径规划能力。 第五步,更新Q表。当机器人执行完一个动作后,会获得实时奖励,Q表将根据奖励值和当前状态-动作的Q值来进行更新,使机器人逐渐找到最优路径。 以上就是在Matlab实现Q-learning路径规划算法的基本步骤。在实际应用,用户还需要根据具体情况来优化算法参数和修改控制器,以获得更好的路径规划效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值