tkinter制作强化学习可视化环境

13 篇文章 2 订阅
10 篇文章 33 订阅

原文地址

分类目录——强化学习

分类目录——tkinter

全部代码

  • 先看一下环境效果

    tkinter环境
  • 强化学习用到的环境通常需要以下几个功能函数

    1583854666466

  • _init_()

        def __init__(self):
            super(Maze, self).__init__()
            self.observatin_space = [(x, y) for x in range(1, 5) for y in range(1, 5)]
            self.action_space = range(4)
            self.n_actions = len(self.action_space)
            self.n_features = np.array(self.observatin_space).shape[-1]
            self.target = {(4, 2): 10}  # 安全/目标状态
            self.danger = {(2, 2): -20, (3, 3): -20}  # 危险状态
            self.state = None
            # 初始化窗口、画布
            self.window = tk.Tk()
            self.canvas = tk.Canvas(self.window, bg='white', height=500, width=500)
    
  • reset()

    用来在每轮训练前重置初始化状态

        def reset(self, startstate=None):   # 重置初始状态
            self.canvas.delete('all')       # 操作之前清空画布,否则每步的状态将都会堆在画面上
            if startstate == None:          # 如果不指定起始状态,随机生成一个状态
                self.state = self.observatin_space[np.random.choice(range(len(self.observatin_space)))]
            else:   # 如果指定了初始状态,就初始化为指定状态
                self.state = startstate
            self.counts = 0
            return self.state
    
  • step()

    用来处理每一步的逻辑,获得下一个状态,回报以及判断是否结束

        def step(self, action):
            self.canvas.delete('all')
            # self.canvas.delete(self.statepos)
            x, y = self.state
            if action == 0:  # 不动
                x = x
                y = y
            elif action == 1:  # 上
                x = x
                y = y + 1
            elif action == 2:  # 下
                x = x
                y = y - 1
            elif action == 3:  # 左
                x = x - 1
                y = y
            elif action == 4:  # 右
                x = x + 1
                y = y
    
            # 判断下一个状态是否属于状态空间,如果在状态空间中更新当前状态,如果不在状态空间保持当前状态
            next_state = (x, y)
            self.state = next_state if next_state in self.observatin_space else self.state
    
            self.counts += 1
    
            s = tuple(self.state)   # 为了能用in操作
            if s in self.danger.keys():
                reward = self.danger[s]
                done = True
            elif s in self.target.keys():
                reward = self.target[s]
                done = True
            else:
                reward = -0.5   # 每多走一个,加个小的负反馈
                done = False
    
            return self.state, reward, done
    
  • render()

    完成可视化画面搭建

        def render(self):
            # 注意tkinter的平面为向下x轴正向,向右y轴正向
    
            # 格线
            for i in range(5):
                # 两个顶点的四个坐标
                self.canvas.create_line(50, 50 + 100 * i, 450, 50 + 100 * i)
                self.canvas.create_line(50 + 100 * i, 50, 50 + 100 * i, 450)
    
            # 绘制出口(安全状态)
            for state in self.target:
                # 我自己把画格的操作封装了一个方法
                self.drawrectangle(state, fill='green')
    
            # 绘制危险区域
            for state in self.danger:
                self.drawrectangle(state, fill='red')
    
            # 绘制当前state的位置(圆)
            self.statepos = self.drawoval(self.state, fill='yellow')
    
            self.canvas.pack()
            self.window.update()
    	
        # 为了方便的复用,将画格点和画圆另外进行了封装
        def drawrectangle(self, point, **attrs):
            '''
            根据格点画一个方格
            :param point: 格点坐标(4,3)
            :param attrs: 其他参数,such as  fill='red'
            :return:
            '''
            size = 100
            self.canvas.create_rectangle(
                50 + (point[0] - 1) * size, 50 + (point[1] - 1) * size,
                50 + point[0] * size, 50 + point[1] * size,
                **attrs
            )
            # 向右为x正方向,向下为y轴正方向
            # 左上角坐标和右下角坐标
    
        # 画椭圆
        def drawoval(self, point, **attrs):
            '''
            画(椭)圆
            :param point: 格点坐标(4,3)
            :param attrs: 其他参数,such as  fill='red'
            :return:
            '''
            size = 100
            self.canvas.create_oval(
                50 + (point[0] - 1) * size, 50 + (point[1] - 1) * size,
                50 + point[0] * size, 50 + point[1] * size,
                **attrs
            )
    
  • close()

        def close(self):
            if self.window:
                self.window.destroy()
    
  • 测试

    if __name__ == '__main__':
        env = Maze()
        for epoch in range(5):
            env.reset()
            print('Epoch', epoch + 1, ': ', end='')
            print(env.state, end='')
            env.render()  # 刷新画面
            time.sleep(0.5)
            for i in range(5):
                env.step(np.random.choice(env.action_space))  # 随机选择一个动作执行
                print(' ->', env.state, end='')
                env.render()  # 刷新画面
                time.sleep(0.5)
            print()
        env.close()
    

    测试效果如文首所示

  • 相关内容

    分类目录——强化学习(更新中)

    什么是gym

    gym自定义可视化环境绘制

    gym自定义可视化环境实例

    强化学习:gym环境解读及使用

    从Q_Learning看强化学习

    一个Q_Learning强化学习自定义gym环境可视化实例

    Pytorch实现DQN

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BBJG_001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值