Python强化学习,基于gym的马尔可夫决策过程MDP,动态规划求解,体现序贯决策

决策的过程分为单阶段和多阶段的。单阶段决策也就是单次决策,这个很简单。
而序贯决策指按时间序列的发生,按顺序连续不断地作出决策,即多阶段决策,决策是分前后顺序的。序贯决策是前一阶段决策方案的选择,会影响到后一阶段决策方案的选择,后一阶段决策方案的选择是取决于前一阶段决策方案的结果。
强化学习过程中最典型的例子就是非线性二级摆系统,有4个关键值,小车受力,受力方向,摆速度,摆角,每个状态下都需要决策车的方向及力的大小。更著名的例子就是AlphaGo。
强化学习要解决的就是序贯决策问题,它不关心输入是什么样的,也不需要带有标签的样本,只关心当前状态下应该采取什么动作才能实现最终目标,即无监督的学习。因为智能体是不断地与环境交互,不断尝试。智能体虽然刚开始不知道哪个状态序列可以实现目标,但是在交互过程中,环境会给智能体反馈,智能体根据回报评估采取动作,有利的保留,不利的丢弃。
gym是OpenAI的平台,可以通过pip install gym安装,安装过程会自动安装依赖,如果报错(如下图)再安装需要的库即可。
在这里插入图片描述
最简单的强化学习模型就是马尔可夫(Markov)决策过程(MDP)。这其中包含了3个概念。
1、马尔可夫性质。系统的下一个状态只与当前状态有关,即称马尔可夫性质。但是当前状态其实已经包含了历史状态的信息了。
2、马尔可夫过程。马尔可夫过程是一个二元组(S,P),S是state,状态,例如人的状态包含睡觉,吃饭,娱乐。P是probability,状态间的转移概率,例如睡觉-吃饭-娱乐。但是该过程并没有包含动作(A)和回报(R)。
3、马尔可夫决策过程。多元组(S,A,P,R,gamma),gamma是折扣,用于计算累积回报的。
在回到AlphaGo例子,他包含2个大脑。第一大脑:落子选择器 (策略网络,目的是做决策),企图找到最佳的下一步,即累积回报最优的状态序列。第二大脑:棋局评估器 (棋面价值计算),用于判断局面的好坏。
强化学习的目标就是给定一个MDP,寻找最优策略,而这个策略就是状态到动作的映射。但是这是一个随机过程。例如人可以睡觉-吃饭-娱乐,也可以吃饭-睡觉-娱乐。我们在给定策略下计算累计回报时,状态序列的值可能不唯一,因此价值回报也是随机的。虽然回报是随机的,没法用具体值描述,但是期望是确定的,因此将期望值作为累计回报状态的价值函数值。
Python强化学习,基于gym的马尔可夫决策过程MDP,动态规划求解,体现序贯决策_第1张图片

例如,这是一个找出口的例子,一共8个网格,红色6和8色代表不通,黄色7代表出口。这样状态空间就是S={1,2,3,4,5,6,7,8}。动作A={东e,西w,南s,北n}。1的状态转移表达式可表示为1_s和1_e。7的回报就是1,6和8的回报就是-1,1-5之间转移的回报都是0。
下面我们展示一个demo,演示一下这个过程。蓝色点就是智能体,他随机决策寻找出口。因为这个示例是没有加入学习算法的,因此每个步骤都是随机的,而不是最优的。
Python强化学习,基于gym的马尔可夫决策过程MDP,动态规划求解,体现序贯决策_第2张图片

import gym
import time
from gym.envs.registration import register

register(
    id="MyDemo-v0",
    entry_point="grid_mdp:GridEnv",
    max_episode_steps=200,
    reward_threshold=100.0,
)

# env = gym.make('CartPole-v0')  # 官方的demo
env = gym.make('MyDemo-v0')
env.reset()
while True:
    score, tag = env.render()
    if tag:
        print(score)
        break
time.sleep(1)

上面的是主程序入口。下边是类,py文件需要命名为grid_mdp,与主程序中的入口对应。

import logging
import random
import time

import gym
import re
from gym.utils import seeding

logger = logging.getLogger(__name__)


class GridEnv(gym.Env):
    metadata = {
   
        'render.modes': ['human', 'rgb_array'],
        'video.frames_per_second': 2
    }

    def __init__(self):

        self.states = [1, 2, 3, 4, 5, 6, 7, 8]  # 状态空间
        self.x = [140, 220, 300, 380, 460, 140, 300, 460]
        self.y = [250, 250, 250, 250, 250, 150, 150, 150]
        self.terminate_states = dict()  # 终止状态为字典格式
        self.terminate_states[6] = 1
        self.terminate_states[7] = 1
        self.terminate_states[8] = 1

        self.actions = ['n'

你可能感兴趣的:(python,gym,qlearning,python,强化学习,mdp,动态规划求解,马尔科夫决策过程)