目录
一、Q-Learning介绍
Q-learning 是强化学习中的一种基于值函数的学习方法,用于解决无模型的马尔可夫决策过程(MDP)问题。在 Q-learning 中,代理尝试学习一个价值函数 Q(s, a),它估计在状态 s 采取动作 a 后所能获得的长期回报的价值。
Q-Learning结构:状态 s、动作a、奖励信号r、Q 值函数 (Q-table)、折扣因子 γ、学习率 α、探索-利用策略 。
状态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-Learning算法的具体流程如下:
输入:环境信息(env)
起始状态(Start)和目标状态(Target)
α、γ、ε、训练时间、最大迭代次数
输出:Q-table
初始化
设置
while <:
while <最大迭代次数:
随机生成随机数
if :
随机选择一个动作a
else:
根据选择动作a
获取下一个状态
if :
跳过循环
更新
二、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个可行动的方向(上 左 下 右 右下 左下 右上 左上)。
奖励设计:奖励通常与到达目标或避免碰撞等目标相关。本文将智能体到达障碍物的奖励设置-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、根据如上Q表获取最优路径如下图所示。
4、训练过程展示
5、回合奖励值
五、参考文献
[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.