Qlearning matlab实现

地图为下表所示,其中s1为起始地址,s7为终止地址。S8和S9认为是陷阱所在地,进去算输。

action说明1、2、3分别代表左、下、右。

地图
S1S2S9
S8S3S6
S4S5S7

首先附一张其伪代码(复制于知乎),以及个人理解的翻译。如有错误还请指正。

 

 

%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 = %d\n",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 = %d\n Q = \n",cnt,reward);
    %fprintf("road = \n"); 
    disp(road);
    road = [1];%清空当前路径,开始下一次迭代
    reward = 0;
    %disp(Q)
   
end
 

最后输出: 

路径基本是12357和12367,因为有一定概率随机探索,所以会有掉进陷阱的。训练完毕就可以拿着Q去走了,不用其他的操作了。

  • 3
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值