【python】CliffWalking悬崖寻路问题

news2025/1/22 19:50:02

强化学习

    • 简介
      • gym库-CliffWalking
      • SARSA
      • Q-learning
    • 示例
      • SARSA
      • Q-learning

简介

机器学习:监督学习、非监督学习、强化学习

  • 模仿人类和动物的试错机制进行学习
  • 智能体环境交互,根据当前的环境状态s,按照一定策略采取行动a,获得回报r
  • 目标:获取最大累积期望回报

在这里插入图片描述
脉络介绍:
在这里插入图片描述

gym库-CliffWalking

安装标准化实验环境

pip install gym

CliffWalking:悬崖寻路问题,4*12网格,红色为悬崖,36为起始,47为目标

动作:0-4,上右下左,如果移出除网络则不变
奖励:{-1,100},与悬崖为-100,否则为-1

在这里插入图片描述

SARSA

行动选择策略:ε-greedy,以ε的概率进行探索,以1-ε的概率进行利用
Q值更新:根据下一次实际行动更新,胆小,选择离悬崖远的路线

 td_target += gamma * Q[next_state, next_action]
 Q[state, action] += lr * (td_target - Q[state, action])

Q-learning

行动选择策略:ε-greedy,以ε的概率进行探索,以1-ε的概率进行利用
Q值更新:选取最优的行动更新Q值,胆大,最终选择离悬崖近的路线

 td_target += gamma * max(Q[next_state, :])
 Q[state, action] += lr * (td_target - Q[state, action])

示例

SARSA

import numpy as np
import pandas as pd
import gym
from tqdm import tqdm


def max_index(a):
    # return np.argmax(a)
    candidate = np.where(a == np.max(a))[0]  
    index = np.random.randint(0, len(candidate))  
    return candidate[index]


def eps_greedy(Q, state):
    a = Q[state, :]
    if np.random.random() < 1 - eps:
        return max_index(a)
    return np.random.randint(0, len(a))  # [start,end)


def calc_policy(Q):
    state_number = Q.shape[0]
    policy = np.zeros(shape=state_number, dtype=np.int8)
    for i in range(state_number):
        policy[i] = np.argmax(Q[i, :])
    return policy


# 0123:{上右下左}
def print_optimal_action(pi, row, col):
    print(actions)
    for i in range(row):
        for j in range(col):
            print(actions[pi[i * col + j]], end=' ')
        print()


# 比较a,b之间的差值是否小于阈值
def is_same(a, b, thresold=0.001):
    e = np.abs(a - b) > thresold
    return np.sum(e) == 0


if __name__ == '__main__':
    eps = 0.01
    lr = 0.01
    gamma = 0.99

    np.set_printoptions(suppress=True)
    row, col = 4, 12
    state_number = row * col
    action_number = 4
    actions = list('↑→↓←')  # 上右下左:0123
    Q = np.zeros((state_number, action_number), dtype=np.float64)
    Q_last = [np.ones_like(Q), np.ones_like(Q), np.ones_like(Q), np.ones_like(Q), np.ones_like(Q)]
    env = gym.make('CliffWalking-v0')
    print('状态数量:', env.observation_space.n)
    print('行为数量:', env.action_space.n)

    #  10万个episode的迭代
    for i in tqdm(range(1, 100000)):
        env.reset()
        state = 36  # 初始位置
        done = False
        action = eps_greedy(Q, state)
        while not done:
            next_state, reward, done, info = env.step(action)
            # print('state, action, reward:', state, action, reward)
            next_action = eps_greedy(Q, next_state)
            td_target = reward
            if not done:
                td_target += gamma * Q[next_state, next_action]
            Q[state, action] += lr * (td_target - Q[state, action])
            state = next_state
            action = next_action
        if is_same(Q_last[0], Q):
            print('Q-table迭代完成,提前退出:', i)
            break
        Q_last = Q_last[1:]
        Q_last.append(np.copy(Q))
    pi = calc_policy(Q)
    print('Q Table:\n', Q)
    # np.savetxt('Q_table.txt', Q, fmt='%.5f')
    pd.DataFrame(Q).to_excel('Q_table.xlsx', index=True)
    for s_id in range(state_number):
        print(s_id, s_id // col, s_id % col, Q[s_id, :], pi[s_id], actions[pi[s_id]])
    print('最优策略:', pi)
    print_optimal_action(pi, row, col)

    # 输出最终路径(状态及坐标)
    env.reset()
    state = 36
    done = False
    trace = [{state: (state // col, state % col)}]
    while not done:
        action = pi[state]
        state, _, done, _ = env.step(action)
        trace.append({state: (state // col, state % col)})
        if len(trace) > 48:
            break
    print(len(trace), ':', trace)

Q-learning

import numpy as np
import pandas as pd
import gym
from tqdm import tqdm


def max_index(a):
    candidate = np.where(a == np.max(a))[0]
    index = np.random.randint(0, len(candidate))
    return candidate[index]


def eps_greedy(Q, state):
    a = Q[state, :]
    if np.random.random() < 1-eps:
        return max_index(a)
    return np.random.randint(0, len(a))


def calc_policy(Q):
    state_number = Q.shape[0]
    policy = np.zeros(shape=state_number, dtype=np.int8)
    for i in range(state_number):
        policy[i] = np.argmax(Q[i, :])
    return policy


# 0123:{上右下左}
def print_optimal_action(pi, row, col):
    a = list('↑→↓←')
    print(a)
    for i in range(row):
        for j in range(col):
            print(a[pi[i*col+j]], end=' ')
        print()


if __name__ == '__main__':
    eps = 0.1 # 10%概率探索,90%概率利用
    lr = 0.01
    gamma = 0.99

    np.set_printoptions(suppress=True)

    row = 4
    col = 12
    state_number = row * col
    action_number = 4   # 上下左右
    Q = np.zeros((state_number, action_number), dtype=np.float64)
    env = gym.make('CliffWalking-v0')
    for i in tqdm(range(10000)):   # 10000个episode的训练
        env.reset()
        state = 36  
        done = False
        action = eps_greedy(Q, state)
        while not done:
            next_state, reward, done, info = env.step(action)
            next_action = eps_greedy(Q, next_state)
            td_target = reward
            if not done:
                td_target += gamma * max(Q[next_state, :])  # Q-learning
            Q[state, action] += lr * (td_target - Q[state, action])
            state = next_state
            action = next_action
    pi = calc_policy(Q)
    print('Q Table:\n', Q)
    pd.DataFrame(Q).to_excel('Q_table.xlsx', index=True)
    for s_id in range(state_number):
        print(s_id, s_id//col, s_id % col, Q[s_id, :], pi[s_id])
    print_optimal_action(pi, row, col)

    # 输出最终路径
    env.reset()
    state = 36
    done = False
    trace = [{state: (state // col, state % col)}]
    while not done:
        action = np.argmax(Q[state, :])
        state, _, done, _ = env.step(action)
        trace.append({state: (state//col, state % col)})
        if len(trace) > 48:
            break
    print(len(trace), ':', trace)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1007091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 CSS 伪类的attr() 展示 tooltip

效果图: 使用场景: 使用React渲染后台返回的数据, 遍历以列表的形式展示, 可能简要字段内容需要鼠标放上去才显示的 可以借助DOM的自定义属性和CSS伪类的attr来实现 所有代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-…

Linux之文本搜索工具--grep

目录 Linux之文本搜索工具--grep 作用 格式 参数 注意 示例 操作对象文件&#xff1a;/etc/passwd grep过滤命令示例 Linux之文本搜索工具--grep 作用 grep是linux中一种强大的文件搜索过滤工具&#xff0c;可以按照正则表达式检索文件内容&#xff0c;并把匹配的结果显…

Ubuntu安装与配置MySQL简要记录

目标 前置条件&#xff1a;Virtualbox虚拟机下Ubuntu20.04 目标MySQL版本&#xff1a;8.0.34 目标效果&#xff1a;安装并配置MySQL&#xff0c;开启远程连接且使用windows下的DataGrip进行管理 安装 sudo apt install mysql-server 通过apt安装的mysql只需一行&#xff0c;…

LeetCode——动态规划篇(一)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 目录 509. 斐波那契数 - 力扣&#xff08;LeetCode&#xff09; 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 746. 使用最小花费爬楼梯 - 力扣&#xff08;LeetCode&a…

【C++】泛型编程 | 函数模板 | 类模板

一、泛型编程 泛型编程是啥&#xff1f; 编写一种一般化的、可通用的算法出来&#xff0c;是代码复用的一种手段。 类似写一个模板出来&#xff0c;不同的情况&#xff0c;我们都可以往这个模板上去套。 举个例子&#xff1a; void Swap(int& a, int& b) {int tmp …

智能驾驶感知技术的综述与展望

目录 1 智能驾驶环境感知的目的 1.1 智能驾驶感知技术的定义和作用 1.2 基于传感器的智能驾驶感知技术 1.3 基于深度学习的智能驾驶感知技术 2 环境感知的手段与方法 2.1 感知技术在智能驾驶中的应用与发展 2.2 智能驾驶决策系统的设计与优化 2.3 控制技术在智能驾驶中的应…

SpringMVC之JSON返回异常处理机制

json处理统一异常处理 1.json处理 //pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"…

加快项目开发进度常用5种方法

项目进度管理是根据进度目标&#xff0c;制定合理的进度计划&#xff0c;全程监控项目进度的执行情况。这样有利于明确项目目标&#xff0c;协调团队行动&#xff0c;提高开发效率&#xff0c;从而最大化项目利益。而加快项目进度&#xff0c;有利于提高项目整体效率&#xff0…

我的创作纪念日——1个普通网安人的漫谈

机缘 大家好&#xff0c;我是zangcc。今天突然收到了一条私信&#xff0c;才发现来csdn已经1024天了&#xff0c;不知不觉都搞安全渗透2年半多了&#x1f414;&#xff0c;真是光阴似箭。 我写博客的初衷只是记录自己的学习历程&#xff0c;比如打打靶场&#xff0c;写一下通关…

高成本获客时代,企业如何通过营销自动化实现突围?

在数字化时代&#xff0c;随着市场竞争的不断升级&#xff0c;企业在获客方面面临了前所未有的挑战。不论是B端或C端的市场和运营部门纷纷寻求可降低获客成本的新运营路径&#xff0c;将有限的预算花在刀刃上。 企业迫切需要寻求更加智能和高效的方式来吸引、转化和留住潜在客…

QGC 参数设置中关于param_union的使用

在QGC中在设置飞控参数中使用到了union,此处关于param_uinon使用的理解进行记录。 参数上传 在参数上传中根据参数类型将参数存储在param_union对应的类型中&#xff0c;但是上传参数时&#xff0c;上传的是param_float类型&#xff0c;所以在飞控端接收时&#xff0c;需要使…

JSON与实体类之间的互相转换!!

一、意义 在我们调用三方平台接口时&#xff0c;经常需要将我们封装的实体类转换为json作为传参&#xff0c;或者是当我们接收报文时接收的为json数据想要转换为我们自己封装的实体类。 1实体类转JSON public static void main(String[] args) throws JsonProcessingExceptio…

“深入理解SpringMVC的JSON数据返回和异常处理机制“

目录 引言1. SpringMVC之JSON数据返回1.1 导入依赖1.2 配置弹簧-MVC.xml1.3 ResponseBody注解使用1.4.Jackson 2. 异常处理机制2.1 为什么要全局异常处理2.2 异常处理思路2.3 SpringMVC异常分类2.4 综合案例 总结 引言 在现代Web开发中&#xff0c;SpringMVC是一个广泛使用的框…

山东EV多域名SSL证书可以保护几个域名

EV多域名SSL证书是一种特殊的SSL证书&#xff0c;可以在一个物理服务器上为多个不同的域名同时部署SSL证书。这种证书特别适合于需要同时保护多个域名的网站&#xff0c;不仅可以提高网站的安全性&#xff0c;还可以提高网站的可信度。今天就随SSL盾小编了解EV多域名SSL证书。 …

打家劫舍 III

题目链接 打家劫舍 III 题目描述 注意点 如果 两个直接相连的房子在同一天晚上被打劫 &#xff0c;房屋将自动报警返回 在不触动警报的情况下 &#xff0c;小偷能够盗取的最高金额 解答思路 记忆化 解决重复子问题解决本题&#xff0c;在任意一个位置&#xff0c;小偷可以…

Unity 轮播图

核心脚本 using UnityEngine; using UnityEngine.UI; using System.IO; using DG.Tweening;public class ImageSlider : MonoBehaviour {public RawImage mainImage; // 中间显示的主要图片public RawImage leftImage; // 左侧辅助图片public RawImage rightImage; // 右侧辅助…

【工艺盘点】新能源行业废水除钴的工艺盘点

钴是一种稀有金属&#xff0c;也是非常重要的过渡金属材料&#xff0c;因其优异的物理、化学性质&#xff0c;以化学品和金属的形式&#xff0c;广泛应用于锂电池、硬质合金、超耐热合金、绝缘材料和磁性材料、工业催化剂、染料及氧化钴的生产过程中。 钴可以提高锂离子电池的稳…

【Flink实战】新老用户分析:按照操作系统维度进行新老用户的分析

&#x1f680; 作者 &#xff1a;“大数据小禅” &#x1f680; 文章简介 &#xff1a;新老用户分析&#xff1a;按照操作系统维度进行新老用户的分析 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 目录导航 同类产品参考日志的数据格式需求&…

vue 检查指定路由是否存在

今天路由跳转报错了 RangeError: Maximum call stack size exceeded 但显然 我的代码只有一个简单的路由跳转 并没有很大的的堆栈数据操作 所以 我就联想到了 会不会是因为路由不存在 我们可以通过 console.log(this.$router.options.routes)输出整个路由对象类看一下 或者…

HttpServletRequest是什么,有什么作用

HttpServletRequest是Java Servlet规范中定义的一个接口&#xff0c;它提供了与HTTP请求相关的方法和属性。在Java Web应用程序中&#xff0c;当客户端发送HTTP请求时&#xff0c;容器&#xff08;例如Tomcat&#xff09;会创建一个HttpServletRequest对象&#xff0c;该对象包…