强烈推荐【莫烦python】的强化学习视频课程,对初学者入门较为友好,最主要是免费。课程连接:https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/
在一维寻宝问题中,探索者处于一维世界的起始段(最左端或者任意位置),可以选择向左或者向右移动位置进行探索,直至找到末位的宝藏,获得相应的奖励。
探索者相应环境信息如下:
状态:位置i(i=0,…,n)且起始位置为0,结束位置为n
动作:左,右
此外,当探索者位于位置0时,无法向左进行移动;当探索者位置为n时,成功获得奖励。
相应操作流程:
(1)设置初始状态
(2)选择动作
(3)获取状态反馈
(4)更新Q表
(5)更新状态
(6)设置终止条件
初始化时需要设置环境状态,动作列表以及算法的参数
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,
)
)
在动作选择部分,算法根据当前状态(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
在探索环境中,宝藏位置的奖励为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
#根据当前状态、动作、下一状态、奖励更新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)
#主循环
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]#奖励列表
今天到此为止,后续记录其他强化学习技术的学习过程。
以上学习笔记,如有侵犯,请立即联系并删除!