网站开发毕业论文提纲/沈阳线上教学
原文地址
分类目录——强化学习
分类目录——tkinter
全部代码
-
先看一下环境效果
-
强化学习用到的环境通常需要以下几个功能函数
-
_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 = startstateself.counts = 0return self.state
-
step()
用来处理每一步的逻辑,获得下一个状态,回报以及判断是否结束
def step(self, action):self.canvas.delete('all')# self.canvas.delete(self.statepos)x, y = self.stateif action == 0: # 不动x = xy = yelif action == 1: # 上x = xy = y + 1elif action == 2: # 下x = xy = y - 1elif action == 3: # 左x = x - 1y = yelif action == 4: # 右x = x + 1y = y# 判断下一个状态是否属于状态空间,如果在状态空间中更新当前状态,如果不在状态空间保持当前状态next_state = (x, y)self.state = next_state if next_state in self.observatin_space else self.stateself.counts += 1s = tuple(self.state) # 为了能用in操作if s in self.danger.keys():reward = self.danger[s]done = Trueelif s in self.target.keys():reward = self.target[s]done = Trueelse:reward = -0.5 # 每多走一个,加个小的负反馈done = Falsereturn 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 = 100self.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 = 100self.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