前言
本文针对下面这篇文章进行代码复现,文章写的很棒,但是算法最关键的更新步骤貌似有问题,本人使用原版公式。
http://www.cnblogs.com/coshaho/p/7475988.html
正文
使用矩阵模拟了环境以及奖励,可以先尝试读懂原文章。本文是针对文章做的复现,我的学习经历告诉我,要啃很多遍概念才可以将知识转化为实践。所以对该文章以及本文示例代码有困惑请务必多看教学视频理解概念。
本人也只是刚刚入门强化学习,对一些概念理解感觉较为困难,故有不足之处一定要评论私聊告知我。
import numpy as np
# 最大轮次
max_number_of_episodes = 1000
# 每轮最大步长
max_number_of_steps = 20
# 每轮目标得分
target_score = 200
# 构建目标矩阵
target_table = np.zeros([6, 6])
# 构建一个奖励矩阵
# 相连通的房间行动一步奖励为1
# 通往屋外的行动奖励100
# 不连通的屋子用 -1 来表示不可达
reward_table = np.array([[-1, -1, -1, -1, 1, -1],
[-1, -1, -1, 1, -1, 100],
[-1, -1, -1, 1, -1, -1],
[-1, 1, 1, -1, 1, -1],
[0, -1, -1, 1, -1, 100],
[-1, 1, -1, -1, 1, 100]])
# 主循环,分为两个循环,
# 外循环控制轮次,内循环控制本轮进行
# 当每一轮步长超长或得分超过额定值退出本轮
for episodes in range(max_number_of_episodes):
# 随机获得一个初始状态
observation = np.random.choice([0, 1, 2, 3, 4, 5])
# 通过总奖励来控制提前退出本轮
total_reward = 0
for i in range(max_number_of_steps):
# 选出当前状态可以行动的房间,随机下一个 action
action_array = (np.array(np.where(reward_table[observation] >= 0))).flatten()
action = np.random.choice(action_array)
# 获得下一个 action 对应的可进入房间
next_action_array = (np.array(reward_table[action][np.where(reward_table[action] >= 0)])).flatten()
# 按照 q-learning 公式进行更新
target_table[observation][action] = target_table[observation][action] + 0.9 * (reward_table[observation][action] + 0.8 * max(next_action_array))
total_reward += reward_table[observation][action]
observation = action
# 如果本轮得分超过200,即停留在外面2次,结束循环
if(total_reward >= 200):
break
# 打印规范化后的目标矩阵
print(target_table / max(target_table.flatten()))