Q-Learning在路径规划中的应用(MATLAB版)
立即下载
资源介绍:
针对于已知环境中的路径规划问题,本文提出Q-Learning解决智能体在复杂环境中找到最优路径。最终阶段包括查询 Q 表以选择最佳行动路径。训练完成后,呈现了历时、最小步数、最大奖励值等结果,以及 Q 表的可视化、最短路径和整个训练过程。Q-learning 是强化学习中的一种基于值函数的学习方法,用于解决无模型的马尔可夫决策过程(MDP)问题。在 Q-learning 中,代理尝试学习一个价值函数 Q(s, a),它估计在状态 s 采取动作 a 后所能获得的长期回报的价值。状态 s、动作a、奖励信号r、Q 值函数 (Q-table)、折扣因子 γ、学习率 α、探索-利用策略。图1 Q-Learning结构图状态s:在 Q-learning 中,代理与环境进行交互,环境处于不同的状态。状态是描述环境的特定情况或配置的抽象表示。
clc
clear
close all
%% 地图建模
%rng(1) % 此指令为测试时固定地图不变
% 设置超参数、规划起点、终点和障碍物数量
myMap = struct('Size',[30,30],'MAP',[],'startState',[2 2],'finalState',[29,29], ...
'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);
%% 绘制训练结果
figure('Name','Path','Position',[700,50,600,600])
screen = axes;
set(screen, 'YDir', 'reverse');
grid on
hold on
[rows,cols] = find(Qtable == 0);
for i = 1:size(rows)
rectangle('Position', [cols(i)-1 rows(i)-1 1 1], 'FaceColor', [0,0, 0], 'EdgeColor', 'none')
end
% 获取到最后训练的路径
route = getLearningRoute(Qtable,myMap.startState,myMap.finalState);
% 绘制路径
scatter(route(1,2)-.5,route(1,1)-.5, 'x', 'b', 'Linewidth', 5);
scatter(route(end,2)-.5,route(end,1)-.5, 'x', 'g', 'Linewidth', 5);
line(route(:,2)-.5,route(:,1)-.5,'Color','red','LineWidth',3)
figure('Name','Qtable','Position',[100,50,800,800])
screen1 = axes;
set(screen1, 'YDir', 'reverse');
grid on
hold on
for x = 0:myMap.W-1
for y = 0:myMap.H-1
rectangle('Position', [x y 1 1], 'FaceColor', [.5 .5 .5], 'EdgeColor', [.192, .192, .192])
if myMap.MAP(y+1, x+1) == 0
rectangle('Position', [x y 1 1], 'FaceColor', [1 1 1], 'EdgeColor', [.192, .192, .192])
t = text(x, y + .5, num2str(round(Qtable(y+1, x+1))));
t.FontSize = 7;
t.FontWeight = 'bold';
end
end
end