Reinforcement Learning:An Introduction

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。

在这里插入图片描述
情景模拟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值