栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Q-Learning解决一维寻宝问题

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Q-Learning解决一维寻宝问题

前言
强烈推荐【莫烦python】的强化学习视频课程,对初学者入门较为友好,最主要是免费。课程连接:https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/

在一维寻宝问题中,探索者处于一维世界的起始段(最左端或者任意位置),可以选择向左或者向右移动位置进行探索,直至找到末位的宝藏,获得相应的奖励。
探索者相应环境信息如下:
状态:位置i(i=0,…,n)且起始位置为0,结束位置为n
动作:左,右
此外,当探索者位于位置0时,无法向左进行移动;当探索者位置为n时,成功获得奖励。

1 Q-Learning流程


相应操作流程:
(1)设置初始状态
(2)选择动作
(3)获取状态反馈
(4)更新Q表
(5)更新状态
(6)设置终止条件

2 参数设置

初始化时需要设置环境状态,动作列表以及算法的参数

class OneDimensionQTable:
    def __init__(self, states,actions, rewords,learningRate=0.01, rewarddecay=0.9, eGreedy=0.9,episode=10):
        #状态列表
        self.states=states
        #动作列表
        self.actions = actions
        #奖励列表
        self.rewords=rewords
        #学习率
        self.lr = learningRate
        #奖励衰减率
        self.gamma = rewarddecay
        #贪婪策略
        self.epsilon = eGreedy
        #训练次数
        self.episode=episode
        #空Q表
        self.qTable = pd.DataFrame(columns=self.actions, dtype=np.float64)

由于初始设置Q表为空,在算法进行过程中需要将探索得到的新状态添加进入Q表并更新Q表的行列。

#遇到新状态后添加到Q表,行索引:状态;列索引:动作
    def stateExist(self, state):
        if state not in self.qTable.index:
            self.qTable = self.qTable.append(
                pd.Series(
                    [0]*len(self.actions),
                    index=self.qTable.columns,
                    name=state,
                    )
            )
3 动作选择

在动作选择部分,算法根据当前状态(state)选择动作(action)。选择动作过程中的策略是:90%的概率根据Q表最优值进行选择;10%的概率随机选择;

#根据状态从qTable选择动作
    def chooseAction(self,state):
        #判断状态是否存在Q表中
        self.stateExist(state)
        #选择采取的动作
        #90%的概率按照Q表最优进行选择
        if np.random.uniform() 
4 状态反馈 

在探索环境中,宝藏位置的奖励为1,其余位置设定为0.

#根据状态和动作返回下一个状态和当前的奖励
    def feedBack(self,state,action):
        #向右移动
        if action=='right':
            if state==len(self.states)-2:
                nextState=len(self.states)-1
            else:
                nextState=state+1
        else:
            if state==0:
                nextState=state
            else:
                nextState=state-1
        reword=self.rewords[nextState]
        return nextState,reword
5 更新Q表
#根据当前状态、动作、下一状态、奖励更新Q表
    def updateTable(self,state,action,nextState,reword):
        #判断状态是否存在Q表中
        self.stateExist(nextState)
        #当前状态值
        qPredict=self.qTable.loc[state,action]
        #下一状态值
        if nextState==len(self.states)-1:
            qTarget=reword
        else:
            qTarget=reword+self.gamma*self.qTable.loc[nextState,:].max()
        #更新
        self.qTable.loc[state,action]+=self.lr*(qTarget-qPredict)
6 主循环
#主循环
    def mainCycle(self):
        for episode in range(self.episode):
            #初始状态
            state=0
            while True:
                #选择动作
                action=self.chooseAction(state)
                #状态反馈
                nextState,reword=self.feedBack(state,action)
                #更新Q表
                self.updateTable(state,action,nextState,reword)
                #更新状态
                state=nextState
                #终止条件
                if state==len(self.states)-1:break

其中,设置状态为5,则环境表示为“S — — — E”。

stateNum=5#状态数量
states=[i for i in range(stateNum)]#状态列表
actions=['left','right']#动作列表
rewords=[0 for i in range(stateNum-1)]+[1]#奖励列表

今天到此为止,后续记录其他强化学习技术的学习过程。
以上学习笔记,如有侵犯,请立即联系并删除!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/883326.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号