Q-learnig入门例子之我见

在这里看到了一个Q-learning的例子:点击打开链接

 https://blog.csdn.net/itplus/article/details/9361915

讲的是:从屋里到屋外的一个故事。

我有个个人的想法:上例中的房间5是吸收目标,那么,

1)agent达到5后就永远地停留在这里。也就是说,不会存在从5走到1或者4的转移过程。

2)同时,agent达到5后,迭代结束,不再进行任何动作。也就是说,不会存在从5走到5的转移过程。

所以,我认为,即使多次迭代以后,Q矩阵的最后一行也应该是全0.

我的代码如下(python 3.6):

 

 

from numpy import *;
import random;
# 初始化Q和R
Q=zeros([6,6]);
R=-1*ones([6,6]);
R[0,4]=R[1,3]=R[2,3]=R[3,1]=R[3,2]=R[3,4]=R[4,0]=R[4,3]=R[5,1]=R[5,4]=0;
R[1,5]=R[4,5]=R[5,5]=100;

# 初始化各个变量
a=0.8 #奖励折扣因子
stateHistory=[]; #记录遍历状态的顺序
Q=[];Qtemp=zeros([6,6]); #集合Q的最终结果、每次遍历后的临时结果


# 找出从状态stateNow开始,能跳转到的所有状态,即所有stateJ,R(stateNow, stateJ)>=0,记作,stateNow{...}
# 从集合stateNow{...}中,随机选择一个状态,作为StateNext
# 计算Q(stateNow, stateNext)=R(stateNow, stateNext)+a*max(Q(stateNext, stateNext{...})). 
for count in range(10): #10次循环后,终止
    stateNow=random.randint(0,4); #初始化当前状态
    stateNext=0; #初始化下一个状态
    stateHistoryTemp=[stateNow];
    while stateNext!=5:
        # 根据当前状态,选择下一个状态
        numOfStateNext=len(where(R[stateNow]>=0)[0]);
        idxOfStateNext=random.randint(0, numOfStateNext-1);
        stateNext=where(R[stateNow]>=0)[0][idxOfStateNext];
        # 根据当前状态和选择的下一个状态,更新Q矩阵
        Qtemp[stateNow, stateNext]=R[stateNow, stateNext]+a*max(Qtemp[stateNext][where(R[stateNext]>=0)]);
        # 更新当前状态,并且记录遍历的顺序
        stateNow=stateNext;
        stateHistoryTemp.append(stateNow);
    print(stateHistoryTemp);
    print(Qtemp);
    stateHistory.append(stateHistoryTemp);
    Q.append(Qtemp);
    
print(stateHistory);

 

执行后,得到的Q矩阵是:

 

 

[0, 0, 0, 0, 80, 0

 0, 0, 0, 64, 0, 100

0, 0, 0, 64, 0, 0

0, 80, 51.2 0, 80, 0

64, 0, 0, 64, 0, 100

0, 0, 0, 0, 0, 0]

 

 

 

 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值