Q-Learning解决一维寻宝问题

前言

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

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

1 Q-Learning流程

Q-Learning解决一维寻宝问题_第1张图片
相应操作流程:
(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()<self.epsilon:
            stateActionList=self.qTable.loc[state,:]
            #若存在多个最好动作,则随机选择其中一个
            action=np.random.choice(stateActionList[stateActionList==np.max(stateActionList)].index)
        #10%的概率随机选择一个动作
        else:
            action=np.random.choice(self.actions)
        return action

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]#奖励列表

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

你可能感兴趣的:(强化学习,python,计算机视觉,人工智能)