% Q学习例程
addpath('modules');
%% %%%%%%%%%%%%%%%%%%%%%%%%% Q学习初始设置 %%%%%%%%%%%%%%%%%%%%%%%%%
% 设置学习率参数γ
gamma=0.80;
% 设置奖励矩阵R
R=[-inf,-inf,-inf,-inf, 0, -inf;
-inf,-inf,-inf, 0,-inf, 100;
-inf,-inf,-inf, 0,-inf, -inf;
-inf, 0, 0,-inf, 0, -inf;
0,-inf,-inf, 0,-inf, 100;
-inf, 0,-inf,-inf, 0, 100];
% 初始化知识矩阵Q
Q=zeros(size(R));
% 设置目标
Target=6;
% 收敛判断符
count=0;
Q_last=ones(size(R))*inf;%无穷大
%% %%%%%%%%%%%%%%%%%%%%%%%%%%% 强化学习 %%%%%%%%%%%%%%%%%%%%%%%%%%%
% 定义最大学习次数
episode_max=50000;
% 迭代学习
for episode=0:episode_max
%% 选择随机初始状态
% 读取状态总数
state_num=size(R,1);
% 选择随机初始状态
state=randperm(state_num,1);
%% 随机搜索直到到达目标
while 1
%% 根据当前状态随机选择一个可执行的行为
% 找出可执行的行为
choices=find( R(state,:)>=0 );
% 随机选择一个可执行行为
action=act_rand_select( choices );
%% 根据下一个状态更新Q表
% 根据所选行为到达下一个状态
next_state=action;
% 根据这个“下一状态”找出所有可选行为
psb_act=find( R(next_state,:)>=0 );
% 读取可选行为的Q值,并找出最大Q
psb_Q=Q(next_state,psb_act);
Q_max=max( psb_Q );
% 更新Q表
Q(state,next_state)=R(state,next_state)+gamma*Q_max;
%% 更新状态
state=next_state;
%% 到达目标后停止本次搜索
if state==Target
break
end
end
% 判断训练是否已收敛
[check,count,Q_last]=conver_check(Q,Q_last,count);
if check
fprintf('训练在%d轮时已完成\n',episode)
break
end
end
%% %%%%%%%%%%%%%%%%%%%%%%%%%%% 结果应用 %%%%%%%%%%%%%%%%%%%%%%%%%%%
% 指定任一初始状态
mission=3;
%% 归一化并显示Q值
Q_max=max(max(Q));
Q=Q/Q_max
%% 统计最快路径
% 最大搜索ser_max步
ser_max=10;
path=zeros(1,ser_max);
path(1)=mission;
% 开始规划
for step=1:ser_max
% 当前步的选择
choices_step=Q(mission,:);
act_step=max( choices_step );
act_step_address=find( choices_step==act_step );
choices_num=size(act_step_address,2);
rand_choice=randperm(choices_num,1);
mission=act_step_address( rand_choice );
path(step+1)=mission;
% 检测若到达目标,停止统计
if mission==Target
break
end
end
% 显示最终规划路径
path