• 深度强化学习之gym扫地机器人环境的搭建(持续更新算法,附源码,python实现)


    想要源码可以点赞关注收藏后评论区留下QQ邮箱

    本次利用gym搭建一个扫地机器人环境,描述如下:

    在一个5×5的扫地机器人环境中,有一个垃圾和一个充电桩,到达[5,4]即图标19处机器人捡到垃圾,并结束游戏。同时获得+3的奖赏。左下角[1,1]处有一个充电桩,机器人到达充电桩可以充电且不再行走,获得+1的奖赏。环境中间[3,3]处有一个障碍物,机器人无法通过。

    扫地机器人具体流程如下

    1:每局游戏开始 机器人初始位置位于左上角 即[1,5]处

    2:游戏进行过程中 机器人将在地图上不断进行探索

    3:机器人遇到障碍物时无法通过 保持原地不动 获得-10的奖赏

    4:地图上有两个终止状态,一个为捡到垃圾,获得+5的奖赏,另一个为达到充电桩进行充电进行充电  获得+1奖赏

    5:扫地机器人到达终止状态 即一个情节结束 机器人回到初始位置 

     代码运行效果如下

    扫地机器人环境搭建

       部分代码如下

    1. # 深度强化学习——原理、算法与PyTorch实战,代码名称:代02-搭建扫地机器人的Gym环境.py
    2. import gym
    3. from gym import spaces
    4. from gym.utils import seeding
    5. import sys
    6. from time import sleep
    7. import signal
    8. class Grid(object):
    9. def __init__(
    10. self,
    11. x: int = None, # 坐标x
    12. y: int = None, # 坐标y
    13. grid_type: int = 0, # 类别值(0:空;1:障碍或边界)
    14. enter_reward: float = 0.0): # 进入该格子的即时奖励
    15. self.x = x
    16. self.y = y
    17. self.grid_type = grid_type
    18. self.enter_reward = enter_reward
    19. self.name = "X{0}-Y{1}".format(self.x, self.y)
    20. def __str__(self):
    21. return "Grid: {name:{3}, x:{0}, y:{1}, grid_type:{2}}".format(self.x, self.y, self.grid_type, self.name)
    22. class GridMatrix(object):
    23. def __init__(
    24. self,
    25. n_width: int, # 水平方向格子数
    26. n_height: int, # 竖直方向格子数
    27. default_type: int = 0, # 默认类型,0-空
    28. default_reward: float = 0.0, # 默认即时奖励值
    29. ):
    30. self.n_height = n_height
    31. self.n_width = n_width
    32. self.default_reward = default_reward
    33. self.default_type = default_type
    34. self.grids = None # list(Grid) 将二维的格子世界中的格子存储在一维的列表中
    35. self.len = n_width * n_height # 格子数
    36. self.reset()
    37. def reset(self):
    38. self.grids = []
    39. for x in range(self.n_height):
    40. for y in range(self.n_width):
    41. self.grids.append(Grid(x, y, self.default_type, self.default_reward))
    42. def get_grid(self, x, y=None):
    43. """
    44. 获取一个格子信息
    45. args: 坐标信息,由x,y表示或仅有一个类型为tuple的x表示
    46. return: grid object
    47. """
    48. xx, yy = None, None
    49. if isinstance(x, int):
    50. xx, yy = x, y
    51. elif isinstance(x, tuple):
    52. xx, yy = x[0], x[1]
    53. assert (0 <= xx < self.n_width and 0 <= yy < self.n_height) # 任意坐标值应在合理区间
    54. index = yy * self.n_width + xx # 二维坐标展开为一维线性坐标
    55. return self.grids[index]
    56. def set_reward(self, x, y, reward):
    57. grid = self.get_grid(x, y)
    58. if grid is not None:
    59. grid.enter_reward = reward
    60. else:
    61. raise ("grid doesn't exist")
    62. def set_type(self, x, y, grid_type):
    63. grid = self.get_grid(x, y)
    64. if grid is not None:
    65. grid.grid_type = grid_type
    66. else:
    67. raise ("grid doesn't exist")
    68. def get_reward(self, x, y):
    69. grid = self.get_grid(x, y)
    70. if grid is None:
    71. return None
    72. return grid.enter_reward
    73. def get_type(self, x, y):
    74. grid = self.get_grid(x, y)
    75. if grid is None:
    76. return None
    77. return grid.grid_type
    78. class GridWorldEnv(gym.Env):
    79. metadata = {'render.modes': ['human', 'rgb_array'], 'video.frames_per_second': 30}
    80. def __init__(
    81. self,
    82. n_width: int = 5, # 格子世界宽度(以格子数计)
    83. n_height: int = 5, # 高度
    84. u_size=40, # 当前格子绘制尺寸
    85. default_reward: float = 0,
    86. default_type=0):
    87. self.n_width = n_width
    88. self.n_height = n_height
    89. self.default_reward = default_reward
    90. self.default_type = default_type
    91. self.u_size = u_size
    92. self.screen_width = u_size * n_width # 场景宽度
    93. self.screen_height = u_size * n_height # 场景长度
    94. self.grids = GridMatrix(n_width=self.n_width,
    95. n_height=self.n_height,
    96. default_reward=self.default_reward,
    97. default_type=self.default_type)
    98. self.reward = 0 # for rendering
    99. self.action = None # for rendering
    100. # 0,1,2,3 represent left, right, up, down
    101. self.action_space = spaces.Discrete(4)
    102. # 观察空间由low和high决定
    103. self.observation_space = spaces.Discrete(self.n_height * self.n_width)
    104. self.state = None # 格子世界的当前状态
    105. self.ends = [(0, 0), (4, 3)] # 终止格子坐标,可以有多个
    106. self.start = (0, 4) # 起始格子坐标,只有一个
    107. self.types = [(2, 2, 1)]
    108. self.rewards = [(0, 0, 1), (4, 3, 5), (2, 2, -10)]
    109. self.refresh_setting()
    110. self.viewer = None # 图形接口对象
    111. self.seed() # 产生一个随机子
    112. self.reset()

  • 相关阅读:
    手机网页,输入时 软键盘盖住输入框完整解决方案,兼容安卓、鸿蒙、苹果IOS
    【Hack The Box】windows练习-- acute
    一文了解大模型工作原理——以ChatGPT为例
    Bash语法中的字符串拼接与比较
    黑马学Docker(二)
    IntelliJ IDEA 2023.2.1 (Ultimate Edition) 版本 Git 如何合并多次的本地提交进行 Push
    PCL1.12.1+VTK9.1+Qt5.14.2VS创建Qt项目在widget上显示点云
    关于webpack的一些记录
    std::bind 源码分析
    这几个小众的软件,我只告诉你
  • 原文地址:https://blog.csdn.net/jiebaoshayebuhui/article/details/127436449