前言:看了paper ,paper 上提到强化学习,所以打算写一个强化学习的专栏,本人比较水(真的水,你说看我的文章吓不吓人,刺不刺激),我看了几篇别人的博客越看越糊涂,所以写一篇方便后来人
下面介绍两个概念:
1 .reward (当做出一个选择,环境给的回馈,这个是固定不变的,是先验信息)
2.Q矩阵(和随机过程的Q矩阵稍有不同,相当于机器人的大脑,通过算法训练出来,再拿来做决策)
引入一个书上的例子:
下面是一个房间抽象图,一个机器人需要从一端走到房间的另一端
机器人需要从2点走到 5点(问题描述完)
下面先将算法贴上:
根据算法初始化reward 矩阵R (根据上面的房间,-1表示不可以通过,0表示可以通过,100表示直接到达终点:)
初始化一个与R同阶 的矩阵 Q(表示做出选择,可能在将来得到奖励的期望),初始化为0矩阵
Q阵的更新公式为:
一般将贪婪因子设置为0.8,Q表示的是,在状态s下采取动作a能够获得的期望最大收益,R是立即获得的收益,而未来一期的收益则取决于下一阶段的动作。
example:
随机选择一个状态,比如1,查看状态1所对应的R表,也就是1可以到达3或5,随机地,我们选择5,根据转移方程:
又随机选中了3状态 ,3对应的下一个状态有(1,2,4都是状态3对应的非负状态),随机地,我们选择1,这样根据算法更新:
经过两次更新,Q阵变成了 :
经过多次更新以后,Q阵变成了;
将Q阵转移到房间的抽象图上
下面就可以使用Q矩阵来做出最优解了
在入口进入(2是入口),选择权值最大的路径,3 ,4(或者1),5
贴上我写的代码,可能有错,吓je写的
import numpy as np
import random
r = np.array([[-1, -1, -1, -1, 0, -1], [-1, -1, -1, 0, -1, 100], [-1, -1, -1, 0, -1, -1], [-1, 0, 0, -1, 0, -1],
[0, -1, -1, 0, -1, 100], [-1, 0, -1, -1, 0, 100]])
q = np.zeros([6, 6], np.float)
greed = 0.8
episode = 0
while episode < 1000:
state = np.random.randint(0, 5)
if state != 5:
next_state_list =[]
for i in range(6):
if r[state, i] != -1:
next_state_list.append(i)
if len(next_state_list) > 0:
next_state = next_state_list[random.randint(0, len(next_state_list)-1)]
q[state, next_state] = r[state, next_state] + greed*max(q[next_state])
episode = episode + 1
if episode % 100 == 0:
print episode
i = 0
while i < 5:
state = i
i= i+1
print("robot 处于{}位置".format(state))
count = 0
list =[]
while state != 5:
if count > 11:
print ("failed ! \n")
break
list.append(state)
next_state = q[state].argmax()
count = count + 1
state = next_state
list.append(5)
print ('path is :')
print list