当前位置: 首页 > news >正文

24/12/1 算法笔记<强化学习> 创建Maze交互

我们今天制作一个栅格的游戏。

我们直接上代码教学。

1.载入库和查找相应的函数版本

import numpy as np
import time
import sysif sys.version_info.major == 2:import Tkinter as tk
else:import tkinter as tk

2.设置长宽和单元格大小

UNIT= 40
MAZE_H= 4
MAZE_W =4

3.初始化Maze环境类

class Maze(tk.Tk, object):def __init__(self):super(Maze, self).__init__()self.action_space = ['u', 'd', 'l', 'r']self.n_actions = len(self.action_space)self.title('maze')self.geometry('{0}x{1}'.format(MAZE_H * UNIT, MAZE_H * UNIT))self._build_maze()

里面初始化动作(上下左右),动作数量,窗口标题和大小,构建迷宫。

4.构建迷宫画布,绘制垂直线和水平线

def _build_maze(self):self.canvas = tk.Canvas(self, bg='white', height=MAZE_H * UNIT, width=MAZE_W * UNIT)for c in range(0, MAZE_W * UNIT, UNIT):x0, y0, x1, y1 = c, 0, c, MAZE_H * UNITself.canvas.create_line(x0, y0, x1, y1)for r in range(0, MAZE_H * UNIT, UNIT):x0, y0, x1, y1 = 0, r, MAZE_W * UNIT, rself.canvas.create_line(x0, y0, x1, y1)

5.设定两个陷阱,一个目标和玩家

origin = np.array([20, 20])hell1_center = origin + np.array([UNIT * 2, UNIT])self.hell = self.canvas.create_rectangle(hell1_center[0] - 15, hell1_center[1] - 15,hell1_center[0] + 15, hell1_center[1] + 15,fill='black')hell2_center = origin + np.array([UNIT, UNIT*2])  self.hell2 = self.canvas.create_rectangle(hell2_center[0] - 15, hell2_center[1] - 15,hell2_center[0] + 15, hell2_center[1] + 15,fill='black'
)oval_center = origin + UNIT * 2self.oval = self.canvas.create_oval(oval_center[0] - 15, oval_center[1] - 15,oval_center[0] + 15, oval_center[1] + 15,fill='yellow')self.rect = self.canvas.create_rectangle(origin[0] - 15, origin[1] - 15,origin[0] + 15, origin[1] + 15,fill='red')self.canvas.pack()

最后是打包画布,将画布添加到 Tkinter 窗口中,并允许它显示。

6.重置游戏环境到初始状态的函数。

def reset(self):self.update()time.sleep(0.5)self.canvas.delete(self.rect) #删除旧的玩家图形origin = np.array([20, 20])  #设置玩家的初始位置self.rect = self.canvas.create_rectangle( #重新创建玩家图形origin[0] - 15, origin[1] - 15,origin[0] + 15, origin[1] + 15,fill='red')

7.设定处理玩家在迷宫中的一步移动,并根据结果更新游戏状态的函数。

def step(self, action):s = self.canvas.coords(self.rect)  #获取当前位置base_action = np.array([0, 0])     #初始化动作向量if action == 0:                    #根据动作更新位置if s[1] > UNIT:base_action[1] -= UNITelif action == 1:if s[1] < (MAZE_H - 1) * UNIT:base_action[1] += UNITelif action == 2:if s[0] < (MAZE_W - 1) * UNIT:base_action[0] += UNITelif action == 3:if s[0] > UNIT:base_action[0] -= UNITself.canvas.move(self.rect, base_action[0], base_action[1]) #移动玩家s_ = self.canvas.coords(self.rect)        #获取新位置if s_ == self.canvas.coords(self.oval):   #检查是否到达终点或陷阱reward = 1done = Trues_ = 'terminal'elif s_ == self.canvas.coords(self.hell) or s_ == self.canvas.coords(self.hell2):reward = -1done = Trues_ = 'terminal'else:reward = 0done = Falsereturn s_, reward, done

8.停顿更新函数

def render(self):time.sleep(0.1)self.update()

9.更新函数

def update():for t in range(10):s = env.reset()while True:env.render()a = 1  # 这里应该是根据策略选择动作s, r, done = env.step(a)if done:break

10.主函数

if __name__ == '__main__':env = Maze()env.after(100, update)env.mainloop()

然后运行就能获得一个简单的自动玩栅格游戏的智能体,这次我们是简单给一些基本设定,以后将加入强化学习的知识强化它。

http://www.lryc.cn/news/495533.html

相关文章:

  • Linux驱动开发(10):I2C子系统–mpu6050驱动实验
  • 《装甲车内气体检测“神器”:上海松柏 K-5S 电化学传感器模组详解》
  • 如何将多个JS文件打包成一个JS文件?
  • 100个python经典面试题详解(新版)
  • C#初阶概念理解
  • node.js基础学习-url模块-url地址处理(二)
  • 算法与数据结构(1)
  • FTP介绍与配置
  • SQL面试题——抖音SQL面试题 最近一笔有效订单
  • 【线程】Java多线程代码案例(1)
  • go使用mysql实现增删改查操作
  • 【Rust】unsafe rust入门
  • dpwwn02靶场
  • K8S疑难概念理解——Pod,应该以哪种Kind来部署应用,为什么不直接Pod这种kind?
  • LabVIEW进行仪器串行通信与模拟信号采集的比较
  • D81【 python 接口自动化学习】- python基础之HTTP
  • 白鹿 Hands-on:消除冷启动——基于 Amazon Lambda SnapStart 轻松打造 Serverless Web 应用(二)
  • ROC曲线
  • c++ 位图和布隆过滤器
  • 阿里云CPU过载的一点思考
  • 单片机学习笔记 15. 串口通信(理论)
  • 算法训练营day22(二叉树08:二叉搜索树的最近公共祖先,插入,删除)
  • Linux history 命令详解
  • Kafka知识体系
  • 【Android】EventBus的使用及源码分析
  • 【大数据学习 | Spark调优篇】Spark之内存调优
  • Linux:文件系统inode
  • 力扣难题解析
  • 4.5-Channel 和 Flow:SharedFlow 和 StateFlow
  • Qt | TCP服务器实现QTcpServer,使用线程管理客户端套接字