强化学习 Q—learning(python 代码)

 前言:看了paper ,paper 上提到强化学习,所以打算写一个强化学习的专栏,本人比较水(真的水,你说看我的文章吓不吓人,刺不刺激),我看了几篇别人的博客越看越糊涂所以写一篇方便后来人

下面介绍两个概念:

   1 .reward  (当做出一个选择,环境给的回馈,这个是固定不变的,是先验信息)

   2.Q矩阵(和随机过程的Q矩阵稍有不同,相当于机器人的大脑,通过算法训练出来,再拿来做决策)

引入一个书上的例子:

  下面是一个房间抽象图,一个机器人需要从一端走到房间的另一端

强化学习 Q—learning(python 代码)_第1张图片

机器人需要从2点走到 5点(问题描述完)

下面先将算法贴上:

强化学习 Q—learning(python 代码)_第2张图片

根据算法初始化reward 矩阵R (根据上面的房间,-1表示不可以通过,0表示可以通过,100表示直接到达终点:)

强化学习 Q—learning(python 代码)_第3张图片

初始化一个与R同阶 的矩阵 Q(表示做出选择,可能在将来得到奖励的期望),初始化为0矩阵

强化学习 Q—learning(python 代码)_第4张图片

Q阵的更新公式为:

一般将贪婪因子\gamma设置为0.8,Q表示的是,在状态s下采取动作a能够获得的期望最大收益,R是立即获得的收益,而未来一期的收益则取决于下一阶段的动作。

example:

随机选择一个状态,比如1,查看状态1所对应的R表,也就是1可以到达3或5,随机地,我们选择5,根据转移方程:

强化学习 Q—learning(python 代码)_第5张图片

又随机选中了3状态 ,3对应的下一个状态有(1,2,4都是状态3对应的非负状态),随机地,我们选择1,这样根据算法更新:

强化学习 Q—learning(python 代码)_第6张图片

经过两次更新,Q阵变成了 :

强化学习 Q—learning(python 代码)_第7张图片

经过多次更新以后,Q阵变成了;

强化学习 Q—learning(python 代码)_第8张图片

 将Q阵转移到房间的抽象图上

强化学习 Q—learning(python 代码)_第9张图片

下面就可以使用Q矩阵来做出最优解了

强化学习 Q—learning(python 代码)_第10张图片

 在入口进入(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

 

你可能感兴趣的:(强化学习)