概述
地图为下表所示,其中s1为起始地址,s7为终止地址。S8和S9认为是陷阱所在地,进去算输。
action说明1、2、3分别代表左、下、右。
S1 | S2 | S9 |
S8 | S3 | S6 |
S4 | S5 | S7 |
首先附一张其伪代码(复制于知乎),以及个人理解的翻译。如有错误还请指正。
%R表 表示在某一个状态下采取不同动作获得的奖励,如R[1 ][1 ]为在s1采取往左的奖励
% R=[-1000 -100 0;-5 0 -100;-100 0 0;-1000 -1000 0;-5 -1000 100;-5 100 -1000;0 -1000 -1000;-1000 0 0 ;0 0 -1000];
%状态切换表,从一个状态执行action,切换到另外一个状态映射表,行是state,列是action
%S[1][1]表示在1状态执行1(向左)以后到达状态1(因为左边是墙,左边走不通)
S = [1 8 2;1 3 9;8 5 6;4 4 5;4 5 7;3 7 6;5 7 7 ;8 4 3;2 6 9];
%Q表
Q = zeros(9,3);
gamma = 0.9;
alpha = 0.9;
cnt = 0;
epoch = 10000;
done = false;
action = 0;
state = 1;
reward = 0;
rt = 0;
road = [1];%构建一个数组存放路径,1表示默认位置,s1
as = 0;
while cnt<epoch
state = 1;
done = false;
while ~done
%贪心算法,确保不会一直按照已知的路走,有10%概率探索未知的方法
if rand()<0.9
[rt,action] = max(Q(state,:));
%当已知的路径有多条时随机选择一条
verify = find(Q(state,:) == rt);
if length(verify) >1
action = verify(randi([1,length(verify)]));
end
as = 1;
else
%随机去探索
action = randi([1,3]);
as = 2;
end
%fprintf("state = %d,actoin = %d,as = %dn",state,action,as);
reward = reward + Q(state,action);
%执行action切换到新的state
state_new = S(state,action);
%更新Q表
Q(state,action) = Q(state,action) + alpha*(R(state,action)+gamma*max(Q(state_new,:))-Q(state,action));
% 将迭代state切换到新的状态
state = state_new;
%记录走过的路径
road(end+1) = state;
%7是成功,8,9是失败,均结束
if state == 7 || state ==8 ||state == 9
done = true;
end
end
cnt = cnt + 1;
%fprintf("cnt = %d nreward = %dn Q = n",cnt,reward);
%fprintf("road = n");
disp(road);
road = [1];%清空当前路径,开始下一次迭代
reward = 0;
%disp(Q)
end
最后输出:
路径基本是12357和12367,因为有一定概率随机探索,所以会有掉进陷阱的。训练完毕就可以拿着Q去走了,不用其他的操作了。
最后
以上就是精明西装为你收集整理的Qlearning matlab实现的全部内容,希望文章能够帮你解决Qlearning matlab实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复