1.第一步初始化Q表。
2.第二步初始化s
3.第三步重复的,选择一个action从s中用policy函数,policy函数源自于Q算法。
4.第四步选择一个action,观察reward和新的s。
5.然后更新Q表。
6.更新s,s就是一个环境,每次做过action都不一样。
7.知道s是terminal状态。
1.首先创建Q_table,也就是每个动作的得分。参数是两个,第一个是有多少个状态,第二个是actions。
效果如图:
choose action的函数的功能:
2.选择action:
(1)state_actions = q_table.iloc[state, :] state_actions是state如今所处的状态的动作选择,如图所示,在本例中就是有两个可以选择的动作。
(2)if (np.random.uniform() > EPSILON) or ((state_actions == 0).all()): # act non-greedy or state-action have no value action_name = np.random.choice(ACTIONS)
这句的意思是说在初始的状态下和有百分之十的概率可以进行随机选择,会随机选择action进行行动。
(3)else: # act greedy action_name = state_actions.idxmax()
这句的意思是说否则的话就选择那个索引的值最大的那个。
对于第二部分出现的语法的解释,
(1)会生成一个随机数
(2)iloc会将这个行的两个列的数值和对应的值。
(3)table.iloc[1,:] == 0,会将等于0的值进行显示出来。
(4)(table.iloc[1,:] == 0).all(),如果里面的值全都等于0会显示true。
(5)这一步随随机选一个ACTIONS,这个ACTIONS是一个列表的数据类型。
在使用的过程中学到,loc好像比iloc更实用。loc里面是字符串或者索引的值都行,但是iloc只能是索引的值。
(6)这一步会根据索引将最大的值显示出来
(3)获得环境的反馈
其中A是action,N_STATES等于6,也就是说一共有6个状态如果S的状态等于4的话,而且A等于right的话,那么说明在状态S下还会继续往右走,这就说明S_(也就是S的下一个状态)是terminal。
否则的话,R=0(这里没有R等于-1这个选择,也就是说只用一个R来标识往哪走?R=0就往左走,R等于1就往右走?)
(4)进行环境的更新:这一步会进行环境的更新,也就是显示的页面。
这一步会显示一个环境的值,也就是5个-和一个T。
可以对list进行join操作, 前面的字符串就是连接的时候填充的一个字符。如果是"",没有东西的话那么就是对原来的list进行连接。
(5)最后进入到了RL,也就是强化学习的整个总览的函数这里。
(1)第一步会生成一个初始化的q_table的dataframe,里面的值一开始都是0。
(2)进行随机选择,第一步选择的是往右走,A=right。这里S_等于1,R等于0, 这个R并不是往右走而是reward,只有到底的时候才会有R=1的回馈。
(3)这里的意思是,reward会随着离目标的距离而变少,也就是说最先更新的reward是[4,right]的reward,然后在更新的才是下面的reward。