地图为下表所示,其中s1为起始地址,s7为终止地址。S8和S9认为是陷阱所在地,进去算输。
action说明1、2、3分别代表左、下、右。
S1 | S2 | S9 |
S8 | S3 | S6 |
S4 | S5 | S7 |
首先附一张其伪代码(复制于知乎),以及个人理解的翻译。如有错误还请指正。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62%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内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复