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

【Python】强化学习SARSA走迷宫

时间:2024-05-18 20:40:59浏览次数:28  
标签:Python random 迷宫 next np state SARSA action 255

之前有实现Q-Learning走迷宫,本篇实现SARSA走迷宫。

Q-Learning是一种off-policy算法,当前步采取的决策action不直接作用于环境生成下一次state,而是选择最优的奖励来更新Q表。

更新公式:

SARSA是一种on-policy算法,当前步采取的策略action既直接作用于环境生成新的state,也用来更新Q表。

更新公式:

其中s是当前状态,a是当前动作,s’是下次状态,a'是下次动作。

代码如下:

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]

    action = np.random.choice(actions)

    while(True):

        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 = (next_state == goal)  
 
        if np.random.rand() < 1.0/(i+1):              #随机或者下一个状态最大q值对应的动作
            next_action = np.random.choice(actions)
        else:
            next_action = np.argmax(q_table[next_state])

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

        state = next_state
        action = next_action
        path.append(state)

        if done: 
            break

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

        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

效果似乎没有Q-Learning好。

标签:Python,random,迷宫,next,np,state,SARSA,action,255
From: https://www.cnblogs.com/tiandsp/p/18199736

相关文章

  • Python数据分析numpy、pandas、matplotlib包
    Python数据分析numpy、pandas、matplotlib一、基础1.1notebook的一些配置快捷键:ctrl+enter执行单元格程序并且不跳转到下一行esc+L可以显示行号结果是打印的而没有返回任何的值就没有out1.2列表基础知识回顾b=[1,2.3,'a','b']b#列表中的元素允许各个元素不一样......
  • 轻松玩转Python文件操作:移动、删除
    哈喽,大家好,我是木头左!Python文件操作基础在处理计算机文件时,经常需要执行如移动和删除等基本操作。Python提供了一些内置的库来帮助完成这些任务,其中最常用的就是os模块和shutil模块。这两个模块包含了许多与文件和目录操作相关的函数。理解os模块os模块是Python中用于与操......
  • 解决Python执行命令时路径空格引发的困扰
    哈喽,大家好,我是木头左!在编程实践中,常常需要通过Python执行系统命令,这包括调用外部程序、脚本或是其他命令行工具。然而,一个看似简单却常被忽视的细节——文件路径中的空格,可能会导致程序意外崩溃或行为异常。本篇文章将深入探讨当路径中包含空格时,如何在Python中正确执行命令,以......
  • python中pip安装源配置
    需要指定pip为国内源windows打开文件资源管理器地址栏上面输入%appdata%在这里面新建一个文件夹pip在pip文件夹里面新建一个文件叫做pip.ini,内容写如下即可python[global]timeout=6000index-url=https://mirrors.aliyun.com/pypi/simple/trusted-hos......
  • 用flask框架在html中运行python程序
    目录-app.py-templates-index.html首先安装Flask和OpenCV库pipinstallflaskopencv-python接着创建一个Python脚本,叫做app.pyfromflaskimportFlask,render_template,Responseimportcv2app=Flask(__name__)@app.route('/')defindex():retur......
  • Python 潮流周刊#51:用 Python 绘制美观的图表
    本周刊由Python猫出品,精心筛选国内外的250+信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进Python技术,并增长职业和副业的收入。本期周刊分享了12篇文章,12个开源项目,赠书5本《图解IT基础设施》,全文220......
  • Python学习迭代器(Iterator)
    一、可迭代的对象(Iterable)1、定义:可以直接用在循环的数据类型,如list,tuple,dict,set,str,还有generator(生成器),和带yield的函数,这些直接可以用在循环的对象统称为可迭代对象(Iterable)fromcollectionsimportIterableprint(isinstance([],Iterable))print(isin......
  • python中的生成器(generator)学习
    生成器(Generator)是一种特殊的函数,可以用于迭代地生成一系列值,而不需要一次性生成所有值并将它们存储在内存中。生成器在需要时逐个生成值,并在生成值后暂停执行,保留函数的状态,以便下次调用时能够从停止的地方继续执行。生成器函数使用yield语句来定义,而不是常规函数中的return......
  • python计算机视觉学习笔记——PIL库的用法
    如果需要处理的原图及代码,请移步小编的GitHub地址传送门:请点击我如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice这个是之前的笔记,自己看到了就顺带发出来,也是温习一下,内容可能不太全,算是入门贴吧。前言:PIL 图像处理是计算机视觉领域中......
  • python中的装饰器,迭代器,生成器之间的关系
    一、装饰器装饰即修饰,意指为其他函数添加新功能;装饰器的本质就是函数作用是为其他函数添加新功能,如计算该函数运行时长装饰器遵循原则:1.不修改被装饰函数的源代码(开放封闭原则)2.为被装饰函数添加新功能后,不能修改被修饰函数的调用方式装饰器的实现=高阶函数+函数嵌套+......