摘要: OpenAI gym 中 用 Render 画基本形状
【对算法,数学,计算机感兴趣的同学,欢迎关注我哈,阅读更多原创文章】
我的网站:潮汐朝夕的生活实验室
我的公众号:算法题刷刷
我的知乎:潮汐朝夕
我的github:FennelDumplings
我的leetcode:FennelDumplings
在文章 OpenAI-Gym入门 中,我们以 CartPole-v1 环境为例学习了 OpenAI Gym 的基本用法。在文章 OpenAI-Gym神经网络策略及其训练 中,我们依然是以 CartPole-v1 为例,学习了策略梯度算法及其实现,并用 Keras 实际训练了一个神经网络策略。
在实际业务场景中,我们需要自己实现环境,也就是继承 gym.Env,然后重新实现 reset, step, render 等函数。本文我们主要看一下 render 这个函数,也就是对环境可视化这块。
Gym 简单画图
(1) 直线
首先导入 Gym 中的渲染模块
1
| from gym.envs.classic_control import rendering
|
定义一个自己的环境类,继承 gym.Env,可以添加元数据来改变渲染环境时的参数,在 init() 中定义一个画板,然后重载 render 方法,写自己的画图逻辑。
其中直线是用 rendering.Line
定义的。代码中的直线元素的方法 set_color
是添加颜色,画板的方法 add_geom
是将元素画到画板上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| class StraightEnv(gym.Env): metadata = { "render.modes": ["human", "rgb_array"], "video.frames_per_second": 2 }
def __init__(self): self.viewer = rendering.Viewer(600, 400)
def render(self, mode="human", close=False): line1 = rendering.Line((100, 300), (500, 300)) line2 = rendering.Line((100, 200), (500, 200)) line1.set_color(0, 0, 0) line2.set_color(0, 0, 0) self.viewer.add_geom(line1) self.viewer.add_geom(line2)
return self.viewer.render(return_rgb_array = mode == "rgb_array")
env = StraightEnv() while True: env.render()
|
结果如下
注意:画板的水平方向是 x 轴,垂直方向是 y 轴,原点在左下角。
(2) 圆
画圆形与画双直线主要的区别在 render 函数内部,其它代码基本一样。
圆是用 rendering.make_circle()
定义的。圆心默认是在原点的,也就是在左下角,我们可以用 rendering.Transform(translation=(100, 200))
和的方式进行平移。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class CircleEnv(gym.Env): metadata = { "render.modes": ["human", "rgb_array"], "video.frames_per_second": 2 }
def __init__(self): self.viewer = rendering.Viewer(600, 400)
def render(self, mode="human", close=False): circle = rendering.make_circle(30) circle_transform = rendering.Transform(translation=(100, 200)) circle.add_attr(circle_transform) self.viewer.add_geom(circle) return self.viewer.render(return_rgb_array = mode == "rgb_array")
env = CircleEnv() while True: env.render()
|
渲染结果如下
(3) 多边形
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class MultiPolylineEnv(gym.Env): metadata = { "render.modes": ["human", "rgb_array"], "video.frames_per_second": 2 }
def __init__(self): self.viewer = rendering.Viewer(600, 400)
def render(self, mode="human", close=False): multipolyline = rendering.make_polyline([(50, 200 - 50 * math.sqrt(3)) ,(100, 200) ,(200, 200) ,(250, 200 - 50 * math.sqrt(3)) ,(200, 200 - 100*math.sqrt(3)) ,(100, 200 - 100*math.sqrt(3)) ,(50, 200 - 50 * math.sqrt(3)) ]) multipolyline_transform = rendering.Transform(translation=(60, 120)) multipolyline.add_attr(multipolyline_transform) self.viewer.add_geom(multipolyline) return self.viewer.render(return_rgb_array = mode == "rgb_array")
|
渲染结果如下