Reinforcement Learning:An Introduction
强化学习问题建模
环境类
class Environment():
'''环境类。环境需要描述这个世界,响应与其进行交互的个体的行为,并向个体提供交互比较的信息
'''
def __init__(self):
# 个体在环境中所具有的行为和状态空间
self.action_space = None
self.status_space = None
print("构建环境完毕")
pass
def dynamics(self, action):
obs_1, reward_1, is_done = None, None, False
# 确定个体的观测状态、即时奖励、是否交互结束
pass
# 返回给个体的信息
print("环境: 获得个体行为,处理后返回给个体观测和及时奖励,并告知个体是否交互结束")
return obs_1, reward_1, is_done
def obs_space(self):
'''
根据自身的状态空间以及交互的个体身份确定该个体所具有的观测空间
'''
# 可默认具有环境的状态空间,此时对该个体来说是完全可观测环境
print("环境:开放观测空间给个体")
obs_space = self.status_space
return obs_space
def act_space(self):
'''根据环境的行为空间以及交互的个体身份确定该个体所具有的行为空间
'''
print("环境:开放行为空间给个体")
act_space = self.action_space
return act_space
def reset(self):
'''重新设定环境信息,给个体一个初始观测
'''
print("重置环境信息")
agent_start_obs = None # 初始状态下个体的观测
return agent_start_obs
个体类
class Agent():
'''个体类。
'''
def __init__(self, env = None, name = "agent1"):
self.env = env
self.name = name
self.act_space = env.act_space()
self.obs_space = env.obs_space()
self.values = None
self.policy = None
self.memory = None
self.obs_0 = None # t=0时刻个体的观测
print("构建个体完毕")
pass
def __str__(self):
return self.name
pass
def update_values(self):
print("个体:更新观测状态价值")
# self.values = # Code here
pass
def update_policy(self):
print("个体:更新策略")
# self.policy = # Code here
pass
def update_model(self):
print("个体:更新模型")
# self.model = # Code here
pass
def update_memory(self,
obs_0 = None,
action_0 = None,
reward_1 = None,
is_done = None,
obs_1 = None):
print("个体:当前状态转换加入记忆中")
# self.memory = # Code here
pass
def perform_policy(self, policy = None, obs = None):
# 产生一个行为
if policy is not None:
action = policy(obs)
else:
action = None # 随即产生
print("个体:依据策略产生一个行为")
return action
def model(self, action = None):
print("个体:思考行为可能带来的下一时刻的观测、及时奖励及是否交互结束")
# 思考个体的观测状态、即时奖励、是否交互结束
v_obs_1, v_reward_1, v_is_done = None, None, None
# 依据action确定v_obs_1, v_reward_1, v_is_done
# 返回给个体的虚拟信息
# 也可以把思考的过程变为记忆的一部分
return v_obs_1, v_reward_1, v_is_done
def act(self, action_0):
# 调用环境的动力学方法
print("个体:执行一个行为")
obs_1, reward_1, is_done = self.env.dynamics(action_0)
self.update_memory(self.obs_0, action_0, reward_1, is_done, obs_1)
self.obs_0 = obs_1
pass
def learning(self):
'''个体的学习过程
'''
self.obs_0 = env.reset()
policy = None # 选定一个策略
end_condition = False # 设定一个终止条件
while( not end_condition):
obs = self.obs_0
act_0 = self.perform_policy(policy, obs)
self.act(act_0)
self.update_policy()
# addtional code here
end_condition = True
pass
def planning(self):
'''个体的规划过程
'''
policy = None # 选定一个策略
end_condition = False # 设定一个终止条件
obs_0 = None # 选定一个观测状态
while(not end_condition):
obs = self.obs_0
v_act_0 = self.perform_policy(policy, obs)
self.model(action = v_act_0)
self.update_policy()
# addtional code here
end_condition = True
pass
env = Environment()
agent = Agent(env = env, name = "agent_1")
env.reset()
act = agent.perform_policy(None, agent.obs_0)
agent.act(act)
agent.learning()
agent.planning()
马尔科夫决策过程
Markov Decision Process 马尔科夫决策过程
- 马尔科夫过程(马尔科夫链)
- 马尔科夫奖励过程
- 马尔科夫决策过程
- 编程实践
马尔科夫链:将马尔科夫链(比较抽象的概念),用可视化的方式来解释,还可调节相应参数来改变结果,使这些抽象概念变得生动而立体!
-
马尔科夫链是指数学中具有马尔科夫性质的离散事件随机过程。在其每一步中,系统根据概率分布可以从一个状态变到另一个状态,也可以保持当前状态。状态的改变叫做转移,与不同的状态改变相关的概率叫做转移概率。
2种状态的马尔科夫链 -
在状态空间中有两种状态,A和B。共有4种可能的转换。如果我们在A,接下来可以过渡到B或留在A。如果我们在B,可以过渡到A或者留在B。在这张图中,从任意状态到任意状态的转移概率是0.5。
-
真正的建模工作者不会总是就画一张马尔科夫链图。 相反,他们会使用**“转移矩阵”**来计算转移概率。状态空间中的每个状态都会出现在表格中的一列或者一行中。矩阵中的每个单元格都告诉你从行状态转换到列状态的概率。因此,在矩阵中,单元格做的工作和图中的箭头所示是一样。
马尔科夫链—图转移矩阵
- 如果状态空间添加了一个状态,我们将添加一行和一列,向每个现有的列和行添加一个单元格。 这意味着当我们向马尔可夫链添加状态时,单元格的数量会呈二次方增长。因此,转换矩阵就起到了很大的作用!
- 马尔科夫链的一个作用是用计算机模拟现实世界中的现象。例如,可以用来检测一个新建的水坝溢流的频率(取决于连续下雨的天数)。为建立这个模型,可以从下面的雨天(R)和晴天(S)开始:
原始的模拟
- 表述这种模拟天气的方法就是:“有一半的天数是下雨天。所以模拟中的每一天都有50%的概率是下雨的。”这个规则在模拟中所产生的序列如下:
改变状态的模拟
- 第二个序列似乎具有跳跃性,而第一个(真实数据)似乎具有“粘性”。在真实的数据中,如果某一天是晴天,那么第二天也很可能是晴天。
- 可以通过两个状态的马尔可夫链来消除这种“粘性”。当马尔科夫链处于状态“R”时,它保持在该状态的概率是0.9,状态改变的概率是0.1。同样,“S”状态保持不变的概率是0.9,过渡到“R”状态的概率是0.1。
情景模拟
- 在许多需要对大规模的现象做研究的工作人员手中,马尔科夫链的作用可以变得非常强大。例如,谷歌用于确定搜索结果顺序的算法,称为PageRank,就是一种马尔可夫链。
马尔科夫链实践:Exploring the Markov Chains Together!