【深入浅出强化学习-原理入门】1 基于gym的MDP(作业)

题目:基于gym构建如下迷宫世界:
在这里插入图片描述
全部代码:

  • maze_mdp.py
import logging #日志模块
import numpy
import random
from gym import spaces
import gym

logging = logging.getLogger(__name__)


# Set this in SOME subclasses
class MazeEnv(gym.Env):
    metadata = {
        'render.modes':['human','rgb_array'],
        'video.frames_per_second':2
    }
    def _seed(self, seed=None):
        self.np_random, seed = seeding.np_random(seed)
        return [seed]


    def __init__(self):
        # 状态空间
        self.states = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
        # 设置机器人的位置,机器人的位置根据所处状态不同位置也不同。
        # 事先计算出每个状态点机器人位置的中心坐标,并存储到两个向量中,在类初始化中给出
        self.x = [125, 175, 225, 325, 125, 175, 225, 325, 225, 275, 325, 125, 175, 225, 275, 325, 125, 175]
        self.y = [325, 325, 325, 325, 275, 275, 275, 275, 225, 225, 225, 175, 175, 175, 175, 175, 125, 125]
        self.terminate_states = dict() #终止状态为字典格式
        self.terminate_states[11] = 1

        # 动作空间
        self.actions = ['n','e','s','w']

        # 回报函数
        self.rewards = dict(); #回报的数据结构为字典
        self.rewards['18_s'] = 20.0
        self.rewards['10_e'] = 20.0
        self.rewards['16_n'] = 20.0

        # 状态转移概率
        self.t = dict();
        self.t['1_e'] = 2
        self.t['1_s'] = 5
        self.t['2_w'] = 1
        self.t['2_e'] = 3
        self.t['2_s'] = 6
        self.t['3_w'] = 2
        self.t['3_s'] = 7
        self.t['4_s'] = 8
        self.t['5_e'] = 6
        self.t['5_n'] = 1
        self.t['6_w'] = 5
        self.t['6_e'] = 7
        self.t['6_n'] = 2
        self.t['7_w'] = 6
        self.t['7_s'] = 9
        self.t['7_n'] = 3
        self.t['8_s'] = 11
        self.t['8_n'] = 4
        self.t['9_e'] = 10
        self.t['9_s'] = 14
        self.t['9_n'] = 7
        self.t['10_w'] = 9
        self.t['10_e'] = 11
        self.t['10_s'] = 15
        self.t['11_w'] = 10
        self.t['11_s'] = 16
        self.t['11_n'] = 8
        self.t['12_e'] = 13
        self.t['12_s'] = 17
        self.t['13_w'] = 12
        self.t['13_e'] = 14
        self.t['13_s'] = 18
        self.t['14_w'] = 13
        self.t['14_e'] = 15
        self.t['14_n'] = 9
        self.t['15_w'] = 14
        self.t['15_e'] = 16
        self.t['15_n'] = 10
        self.t['16_w'] = 15
        self.t['16_n'] = 11
        self.t['17_e'] = 18
        self.t['17_n'] = 12
        self.t['18_w'] = 17
        self.t['18_n'] = 13

        #折扣因子
        self.gamma = 0.8
        self.viewer = None
        self.state = None

    def getTerminal(self):
        return self.terminate_states

    def getGamma(self):
        return self.gamma

    def getStates(self):
        return self.states

    def getAction(self):
        return self.actions

    def getTerminate_states(self):
        return self.terminate_states

    def setAction(self,s):
        self.state = s

    # step()函数输入是动作,
    # 输出是下一时刻的动作、回报、是否终止、调试信息
    # 没有的用{}表示
    def _step(self,action):
        # 系统当前状态
        state = self.state
        # 判断系统当前状态是否为终止状态
        if state in self.terminate_states:
            return state,0,True,{}
        #将状态与动作组成字典的键值
        key = "%d_%s"(state,action)

        #状态转移
        if key in self.t:
            next_state = self.t[key]
        else:
            next_state = state
        self.state = next_state

        is_terminal = False

        if next_state in self.terminate_states:
            is_terminal = True

        if key not in self.rewards:
            r = -1.0
        else:
            r = self.rewards[key]

        return next_state,r,is_terminal,{}

    # reset函数建立
    # reset常常用随机的方法初始机器人状态
    def _reset(self):
        self.state = self.states[int(random.random()*len(self.states))]
        return self.state


        # render函数建立
    def _render(self, mode='human', close=False):
        if close:
            if self.viewer is not None:
                self.viewer.close()
                self.viewer = None
            return
        screen_width = 450
        screen_height = 450

        if self.viewer is None:
            # 调用rendering的画图函数
            from gym.envs.classic_control import rendering
            self.viewer = rendering.Viewer(screen_width, screen_height)

            # 创建网格世界,一共12条直线
            self.line1 = rendering.Line((100, 350), (350, 350))
            self.line2 = rendering.Line((100, 300), (350, 300))
            self.line3 = rendering.Line((100, 250), (350, 250))
            self.line4 = rendering.Line((100, 200), (350, 200))
            self.line5 = rendering.Line((100, 150), (350, 150))
            self.line6 = rendering.Line((100, 100), (350, 100))
            self.line7 = rendering.Line((100, 350), (100, 100))
            self.line8 = rendering.Line((150, 350), (150, 100))
            self.line9 = rendering.Line((200, 350), (200, 100))
            self.line10 = rendering.Line((250, 350), (250, 100))
            self.line11 = rendering.Line((300, 350), (300, 100))
            self.line12 = rendering.Line((350, 350), (350, 100))

            # 接下来写墙块,黑色填满代表墙块
            # 创建第一个墙块
            self.wall1 = rendering.make_polygon([(250,350),(300,350), (300,300),(250,300)],filled=True)
            self.wall1.set_color(0, 0, 0)

            # 创建第二个墙块
            self.wall2 = rendering.make_polygon([(250,300),(300,300),(300,250),(250,250)],filled=True)
            self.wall2.set_color(0, 0, 0)

            # 创建第三个墙块
            self.wall3 = rendering.make_polygon([(100, 250), (150, 250), (150,200),(100,200)], filled=True)
            self.wall3.set_color(0, 0, 0)

            # 创建第四个墙块
            self.wall4 = rendering.make_polygon([(150, 250), (200, 250), (200,200),(150,200)], filled=True)
            self.wall4.set_color(0, 0, 0)

            # 创建第五个墙块
            self.wall5 = rendering.make_polygon([(200, 150), (250, 150), (250, 100),(200, 100)], filled=True)
            self.wall5.set_color(0, 0, 0)

            # 创建第六个墙块
            self.wall6 = rendering.make_polygon([(250, 150), (300, 150), (300, 100),(250, 100)], filled=True)
            self.wall6.set_color(0, 0, 0)

            # 创建第七个墙块
            self.wall7 = rendering.make_polygon([(300, 150), (350, 150), (350, 100),(300, 100)], filled=True)
            self.wall7.set_color(0, 0, 0)

            # 创建出口,用三角形表示
            self.goal = rendering.make_polygon([(325,245),(300,205),(350,205)],
                                                filled=True)
            self.goal.set_color(1, 0.9, 0)

            # 创建机器人,用不同颜色的圆表示
            self.robot = rendering.make_circle(15)
            self.robotrans = rendering.Transform()
            self.robot.add_attr(self.robotrans)
            self.robot.set_color(0.8, 0.6, 0.4)

            # 给11条直线设置颜色,并将这些创建的对象添加到几何中
            self.line1.set_color(0, 0, 0)
            self.line2.set_color(0, 0, 0)
            self.line3.set_color(0, 0, 0)
            self.line4.set_color(0, 0, 0)
            self.line5.set_color(0, 0, 0)
            self.line6.set_color(0, 0, 0)
            self.line7.set_color(0, 0, 0)
            self.line8.set_color(0, 0, 0)
            self.line9.set_color(0, 0, 0)
            self.line10.set_color(0, 0, 0)
            self.line11.set_color(0, 0, 0)
            self.line12.set_color(0, 0, 0)

            self.viewer.add_geom(self.line1)
            self.viewer.add_geom(self.line2)
            self.viewer.add_geom(self.line3)
            self.viewer.add_geom(self.line4)
            self.viewer.add_geom(self.line5)
            self.viewer.add_geom(self.line6)
            self.viewer.add_geom(self.line7)
            self.viewer.add_geom(self.line8)
            self.viewer.add_geom(self.line9)
            self.viewer.add_geom(self.line10)
            self.viewer.add_geom(self.line11)
            self.viewer.add_geom(self.line12)
            self.viewer.add_geom(self.wall1)
            self.viewer.add_geom(self.wall2)
            self.viewer.add_geom(self.wall3)
            self.viewer.add_geom(self.wall4)
            self.viewer.add_geom(self.wall5)
            self.viewer.add_geom(self.wall6)
            self.viewer.add_geom(self.wall7)
            self.viewer.add_geom(self.goal)
            self.viewer.add_geom(self.robot)


        # 根据这两个向量和机器人当前状态,就可以设置机器人当前的圆心坐标
        if self.state is None: return None
        self.robotrans.set_translation(self.x[self.state - 1], self.y[self.state - 1])


        return self.viewer.render(return_rgb_array=mode =='rgb_array')
  • classic_control\_init_.py中添加
from gym.envs.classic_control.maze_mdp import MazeEnv
  • envs/_init_.py中添加
register(
    id='MazeWorld-v0',
    entry_point = 'gym.envs.classic_control:MazeEnv',
    max_episode_steps=200,
    reward_threshold=100.0,
)
  • 启动Anaconda Prompt
    在这里插入图片描述
    在这里插入图片描述
  • 遇到的困难
    墙块代码我采用的画多边形的函数make_polygon,但是一直缺一块口子
    最后发现。。。。
    是因为四个顶点的顺序搞错了。。。。。。
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 《深入浅出强化学习编程实战》是一本以深入浅出的方式介绍强化学习编程实践的教材。强化学习是一种机器学习的方法,其通过与环境进行交互,不断试错并根据反馈进行学习,以最大化获取奖励的策略。 这本书从实际应用的角度出发,为读者提供了丰富的强化学习编程实例,并用简洁明了的语言进行讲解。书中首先对强化学习的基本概念进行了介绍,包括马尔科夫决策过程、值函数、策略梯度等核心理论。接着,作者通过具体的案例,如迷宫问题、扫地机器人等,演示了如何应用强化学习算法解决实际问题。 《深入浅出强化学习编程实战》的编写极富教学性,每个实例都配有详细的代码解释和算法原理分析,使读者能够更好地理解和掌握强化学习的编程实现。同时,书中还介绍了一些在实践中常用的强化学习库和工具,如OpenAI Gym、TensorFlow等,让读者能够更加便捷地进行实验和应用。 这本书适合对强化学习感兴趣的初学者阅读,也适合已有一定编程基础的读者进行进一步的学习和实践。通过读完本书,读者可以了解到强化学习的基本概念和常用算法,并能够运用所学知识解决实际问题。 总之,《深入浅出强化学习编程实战》是一本循序渐进、实用性极高的强化学习编程实践指南,帮助读者快速入门和应用强化学习算法。无论是学术研究还是工程实践,都能够从中获得丰富的经验和知识。 ### 回答2: 《深入浅出强化学习编程实战》pdf是一本讲解强化学习编程实践的电子书籍。强化学习是一种机器学习的分支,其主要目标是让智能体通过与环境的交互,最大化累积奖励。这本书以深入浅出的方式,向读者解释了强化学习的基本原理和相关算法。 这本书首先介绍了强化学习的基本概念和背景知识,包括马尔可夫决策过程、值函数和策略等重要概念。然后,书中详细介绍了一些经典的强化学习算法,如Q-Learning和Deep Q-Networks等。通过学习这些算法,读者可以了解如何通过强化学习方法来解决实际问题。 此外,该书也提供了一些实际项目案例,帮助读者将理论知识应用到实际场景中。这些案例涵盖了不同领域,如机器人、游戏和金融等,读者可以通过这些实例了解强化学习在不同领域的应用。 为了更好地帮助读者理解和掌握强化学习编程实践,该书还提供了大量的代码示例和实验练习。读者可以通过编写代码并运行实验来巩固所学的知识,并且可以在实验中探索不同的参数和算法,以实现更好的性能。 总的来说,《深入浅出强化学习编程实战》pdf以通俗易懂的方式介绍了强化学习的基本理论和算法,并通过实际案例和实验帮助读者深入理解和运用强化学习。这本书适合对强化学习编程实践感兴趣的读者阅读,不仅可以学到理论知识,还能够通过实践提升编程和问题解决能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值