首页 > 编程语言 >【Python】强化学习Q-Learning走迷宫

【Python】强化学习Q-Learning走迷宫

时间:2024-02-15 13:22:31浏览次数:30  
标签:Python random 迷宫 next state Learning action reward 255

Q-Learning是一种基于值函数的强化学习算法,这里用该算法解决走迷宫问题。

算法步骤如下:

1. 初始化 Q 表:每个表格对应状态动作的 Q 值。这里就是一个H*W*4的表,4代表上下左右四个动作。

2. 选择动作: 根据 Q 表格选择最优动作或者以一定概率随机选择动作。

3. 执行动作,得到返回奖励(这里需要自定义,比如到达目标给的大的reward,撞墙给个小的reward)和下一个状态。

4. 更新 Q 表: 根据规则更新 Q 表格中对应状态动作的 Q 值。规则为 Q(s, a) = Q(s, a) + α*[r + γ*max(Q(s', a')) - Q(s, a)],其中 α 是学习率,γ 是折扣因子,r 是获得的奖励,s 是当前状态,a 是当前动作,s' 是下一个状态,a' 是在下一个状态下选择的最优动作。

5. 重复步骤 2-4: 不断与环境交互,选择动作、执行、更新 Q 值,直至满足停止条件(如达到最大迭代次数或者 Q 值收敛等)。

6. 最优策略提取: 通过学习得到的 Q 表格,可以提取最优策略,即在每个状态下选择具有最高 Q 值的动作。

代码如下:

import numpy as np
import random
import matplotlib.pyplot as plt
from PIL import Image
import imageio
import io

H = 30
W = 40

start = (0, random.randint(0, H-1))
goal = (W-1, random.randint(0, H-1))

img = Image.new('RGB', (W, H), (255, 255, 255))
pixels = img.load()

maze = np.zeros((W, H))
for h in range(H):
    for w in range(W):
        if random.random() < 0.1:
            maze[w, h] = -1

actions_num = 4
actions = [0, 1, 2, 3]
q_table = np.zeros((W, H, actions_num))
rate = 0.5
factor = 0.9
images = []

for i in range(2000):

    state = start
    path = [start]
    while(True):

        if np.random.rand() < 0.1:              #随机或者下一个状态最大q值对应的动作
            action = np.random.choice(actions)
        else:
            action = np.argmax(q_table[state])

        next_state = None                       #执行该动作
        if action == 0 and state[0] > 0:
            next_state = (state[0]-1, state[1])
        elif action == 1 and state[0] < W-1:
            next_state = (state[0]+1, state[1])
        elif action == 2 and state[1] > 0:
            next_state = (state[0], state[1]-1)
        elif action == 3 and state[1] < H-1:
            next_state = (state[0], state[1]+1)
        else:
            next_state = state

        if next_state == goal:                  #得到reward,到目标给大正反馈
            reward = 100
        elif maze[next_state] == -1:
            reward = -100                       #遇见障碍物给大负反馈
        else:
            reward = -1                         #走一步给小负反馈,走的步数越小,负反馈越小

        done = (state == goal)  

        if done:
            break

        current_q = q_table[state][action]      #根据公式更新qtable
        q_table[state][action] += rate * (reward + factor * max(q_table[next_state])  - current_q) 

        state = next_state
        path.append(state)

    if i % 100 == 0:                            #每100次看结果

        for h in range(H):
            for w in range(W):
                if maze[w,h]==-1:
                    pixels[w, h] = (0, 0, 0)
                else:
                    pixels[w, h] = (255, 255, 255)

        for x, y in path:
            pixels[x, y] = (0, 0, 255)

        pixels[start] = (255, 0, 0)
        pixels[goal] = (0, 255, 0)

        plt.clf()                           # 清除当前图形
        plt.imshow(img)
        plt.pause(0.1)                      # 暂停0.1秒,显示动态效果

        buf = io.BytesIO()
        plt.savefig(buf, format='png')      # 保存图像到内存中
        buf.seek(0)                         # 将文件指针移动到文件开头
        images.append(imageio.imread(buf))  # 从内存中读取图像并添加到列表中

plt.show()
imageio.mimsave('result.gif', images, fps=3)  # 保存为 GIF 图像,帧率为3

结果如下:

标签:Python,random,迷宫,next,state,Learning,action,reward,255
From: https://www.cnblogs.com/tiandsp/p/18015242

相关文章

  • Edu-Dict + English Learning Materials: Mdict
    https://mdict.orghttps://github.com/xiaolai/apple-computer-literacy/blob/main/Install-Mdict-Dictionaries-to-macOS-Dictionary.mdhttps://downloads-direct.freemdict.com/Language_Learning_Videos/英语/https://downloads.freemdict.comhttps://mdx.mdict.orgMdic......
  • Python:处理大数据量文件心得
    --javascripttypescriptbashsqljsonhtmlcssccppjavarubypythongorustmarkdown完成大文件按规则拆解。使用python实现将5个多g,总共五千万行数据的csv文件进行按照某个特殊时属性进行拆解。问题难点:文件过大,服务器内存资源不足,需要分块读入内存并处理。之前想着......
  • python基础学习6-第三方模块
    自定义模块优先级大于系统模块模块分为系统模块,自定义模块,第三方模块导入方式import模块名称[as别名]from模块名称import变量/函数/类*包的导入import包名.模块名as别名form包名import模块名as别名form包名.模块名import函数/变量/类*主程序运行i......
  • Python 中 print 函数的用法
    在Python中,可以使用print函数来打印一个变量或者一个字符串:print("MynameisAlice")print(i)如果需要字符串格式化来打印一句话中包含变量的内容,有几种常用的方法:使用格式化字符串(f-string):在字符串前面加上字母"f",然后在字符串中使用大括号{}包裹变量名。示例代码如下:......
  • Ubuntu 中通过源码安装 Python3.x 环境
    最近在个人前后端分离项目时候,后端接口程序fastapi,在部署的时候,需要Pyhton3.8以上的环境,但ubuntu默认的是2.7于是想通过源码安装的方式进行环境搭建.下载官网下载二进制源码安装包:https://www.python.org/downloads/source/wegthttps://www.python.org/ftp/......
  • Python--列表
    Python--列表列表是什么列表由一系列按特定顺序排列的元素组成。你可以创建包含字母表中所有字母、数字0~9或所有家庭成员姓名的列表;在python中使用([])来表示列表,并且使用逗号来分割其中的元素.bicycles=['trek','cannondale','redline','specialized']print(bicycles)#......
  • Python之禅 (Although practicality beats purity.)的理解
    TheZenofPython,byTimPeters摘其中一句谈谈我的理解Althoughpracticalitybeatspurity.实用性有时比理论上的完美更重要。python看起来是不太完美,比如,很长时间都没有编译时的类型检查,开始时候认为这个是语言设计者的一个bug,但后来发现,过早的把精力放到类型上去,对于程......
  • Python之发送邮件
    https://www.runoob.com/python/python-email.html#!/usr/bin/python#-*-coding:UTF-8-*-importsmtplibfromemail.mime.textimportMIMETextfromemail.headerimportHeader#第三方SMTP服务mail_host="smtp.XXX.com"#设置服务器mail_user="XXXX&q......
  • Python语法笔记
    url中含有中文的处理Python编程:URL网址链接中的中文编码与解码Python进行URL解码fromurllib.requestimportquote... defstart_requests(self):keywords=['手机','笔记本电脑','键鼠套装']forkeywordinkeywords:url=r'https://s.taobao.......
  • Python基本笔记
    导入库的顺序:先导标准库空行再导第三方库空行最后导自己的库库之间按字母顺序导macpycharncode-优化导入工具:可自动帮调整顺序,将没有用到的库名删除查看安装了什么第三方库:piplist或pipfreezepipfreeze>requirements.txt将输出重定向到requirements.txtpipi......