24/8/18算法笔记 目标导向强化学习

news2024/11/16 1:33:44

目标导向强化学习(Goal-Oriented Reinforcement Learning,简称GORL)是强化学习的一个分支,它关注于智能体如何通过与环境的交互来实现特定的目标或任务。与传统的强化学习不同,目标导向强化学习更加关注目标的设定和达成,而不是简单地最大化累积奖励。以下是目标导向强化学习的一些关键特点:

  1. 目标设定:在目标导向强化学习中,每个任务都有一个明确的目标,智能体需要学习如何达成这些目标。

  2. 目标表示:目标可以以不同的方式表示,例如状态向量、状态的子集、特定的状态标签或属性等。

  3. 策略学习:智能体需要学习一个策略,该策略能够根据当前状态和目标来选择最佳的动作。

  4. 探索与利用:智能体在学习过程中需要平衡探索(发现新的目标达成方式)和利用(使用已知的有效策略)。

  5. 多样性:目标导向强化学习鼓励智能体学习多种达成目标的方式,以适应不同的环境条件或初始状态。

  6. 泛化能力:智能体应该具备一定的泛化能力,能够在不同的目标或类似的任务中使用学到的知识。

  7. 奖励结构:奖励函数通常与目标紧密相关,智能体根据接近目标的程度来获得奖励。

  8. 学习效率:目标导向强化学习通常需要更少的探索,因为智能体可以专注于达成特定的目标,而不是在状态空间中随机游走。

  9. 应用领域:目标导向强化学习在机器人导航、自动驾驶、游戏AI等领域有广泛的应用。

  10. 算法实现:实现目标导向强化学习算法时,可以使用多种技术,如将目标作为额外的状态特征输入到策略网络中,或者使用目标引导的探索策略等。

#定义游戏环境
import torch
import random
import numpy as np
random.seed(0)
torch.manual_seed(0)

#创建一个游戏环境
class Env:
    def reset(self):
        #前两个数是起点,后两个数是终点
        self.state = torch.zeros(4)
        self.state[2] = random.uniform(3.5,4.5)
        self.state[3] = random.uniform(3.5,4.5)
        
        self.count = 0
        return self.state.tolist()
    def step(self,action):
        action  = torch.FloatTensor(action).reshape(2)
        
        #裁剪动作范围
        action = torch.clamp(action,min=-1,max = 1)
        
        #执行动作
        self.state[:2] +=action
        
        #规范状态空间
        self.state[:2] = torch.clamp(self.state[:2],min = 0,max = 5)
        
        self.count+=1
        
        #求二范数,求两向量相减之后的向量的模长
        #两向量相减的几何意义是两个向量的尾部相连,再连接两个头部形成的新向量
        #mod = ((self.state - self.goal)**2).sum()**0.5
        mod = (self.state[:2] - self.state[2:]).norm(p=2).item()
        
        reward = -1.0
        over = False
        if mod <=0.15:
            reward = 0.0
            over =True
        if self.count>=50:
            over =True
            
        return self.state.tolist(),reward,over
        
env = Env()

print(env.reset())
env.step([0.1,0.2])

定义DDPG模型,代码省略http://t.csdnimg.cn/2wml3

#初始化DDPG模型
ddpg = DDPG()
ddpg.train(
    torch.randn(200,4),
    troch.randn(200,2),
    troch.randn(200,1),
    troch.randn(200,4),
    troch.zeros(200,1).long(),
)
ddpg.get_action([1,2,3,4])

定义data update函数

class Data():
    def __init__(self):
        self.datas = []
    def __len__(self):
        return len(self.datas)
    def update(self):
        state = env.reset()
        pvere =False
        
        data = {
            'state' : [],
            'action':[],
            'reward' :[],
            'next_state':[],
            'over':[],
        }
        while not over:
            action = ddpg.get_action(state)
            next_state,reward,over = env.step(action)
            
            data['state'].append(state)
            data['action'].append(action)
            data['reward'].append(reward)
            data['next_state'].append(next_state)
            data['over'].append(over)
            
            state = next_state
        self.datas.append(data)
        #Data采样函数        
        def get_sample(self):
        #采样结果
            sample = {
                'state' : [],
                'action':[],
                'reward' :[],
                'next_state':[],
                'over':[],
            }


            #采样N个数据
            for _ in range(256):

                #随机一局游戏
                data = random.sample(self.datas,1)[0]

                #随机游戏中的一步,这里除了最后一步
                step = random.randint(0,len(data['action'])-2)
                #提取数据
                state = data['state'][step]
                next_state = date['next_state'][step]
                action = data['action'][step]
                reward = data['reward'][step]
                over = data['over'][step]

                #设置fake goal
                if random.random()<=0.8:
                    #随机选择step后面的某一步
                    step = random.randin(step+1,len(date['action'])-1)
                    #以后面某个步的状态为一个伪的终点,也就是希望先走到这里再说
                    fake_goal = data['state'][step][:2]
                    #求二范数
                    mod = [
                        next_state[0]-fake_goal[0],next_state[1]-fake_goal[1]
                    ]
                    mod = torch.FloatTensor(mod).norm(p=2).item()

                    #再自己重新计算reward和over
                    reward = -1.0
                    over =False
                    if mod <=0.15:
                        reward = 0.0
                        over = True

                    #以伪终点构建新的state
                    state[2] = fake_goal[0]
                    state[3] = fake_goal[1]
                    next_state[2] = fake_goal[0]
                    next_state[2] = fake_goal[1]

                sample['state'].append(state)
                sample['action'].append(action)
                sample['reward'].append(reward)
                sample['next_state'].append(next_state)
                sample['over'].append(over)

            sample['state']  = torch.FloatTensor(sample['state']).reshape(-1,4)
            sample['action']  = torch.FloatTensor(sample['action']).reshape(-1,2)
            sample['reward']  = torch.FloatTensor(sample['reward']).reshape(-1,1)
            sample['next_state']  = torch.FloatTensor(sample['next_state']).reshape(-1,4)
            sample['over'] = torch.FloatTensor(sample['over']).reshape(-1,1)

            return sample
    #计算最后10个数据reward_sum的值
    def get_last_reward_mean(self):
        reward_sum = []
        for data in self.datas[-10:]:
            reward_sum.append(sum(data['reward']))
        return sum(reward_sum)/len(reward_sum)

初始化Data对象

data = Data()

#初始化数据
for _ in range(200):
    data.update()
data.get_sample(),data.get_last_reward_mean()

训练

for i in range(1800):
    data.update()
    
    for _ in range(20):
        ddpg.train(**data.get_sample())
    if i% 100==0:
        print(i,len(data,data.get_last_reward_mean())

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

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

相关文章

图像数据处理13

三、空域滤波 3.1滤波器的基本概念 什么是滤波&#xff1f; 简单来说就是从干扰信号中提取出有用的信号 3.1.1空域滤波&#xff08;Spatial Domain Filtering&#xff09; 空域滤波适用于简单的滤波任务&#xff0c;直接对图像的像素空间进行操作。它通过对图像中的每个像…

如何选择流量与商业潜力兼备的SEO关键词?

如何选择流量与商业潜力兼备的SEO关键词&#xff1f; 你选择的关键词可以成就或破坏你的SEO活动。 如果你明智地选择关键词&#xff0c;那么你制作的内容将有可能月复一月地吸引有价值的自然搜索流量。如果你选择了错误的关键词&#xff0c;你的内容将只能吸引低价值的流量&a…

Java流程控制07:增强for循环

本节内容视频链接&#xff1a;Java流程控制10&#xff1a;增强for循环_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV12J41137hu?p42&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 Java中的增强for循环&#xff08;‌也称为“for-each”循环&#xff09;‌是…

实用好软-----电脑端好用的免费音乐下载小工具 简单 快速

目前很多很多音乐软件都是收费的。要么是试听。前段时间分享了一款嗅探工具感觉很不错。今天分享的这款小工具超小。下载只有3M大小。解压后运行窗口简单。直接输入歌曲名字即可搜索出来。然后选择下载即可 界面 测试了下还是比较好用的。而且下载很快 &#xff0c;不过软件显…

Ajax-02.Axios

Axios入门 1.引入Axios的js文件 <script src"js/axios-0.18.0.js"></script> Axios 请求方式别名: axios.get(url[,config]) axios.delete(url[,config]) axios.post(url[,data[,config]]) axios.put(url[,data[,config]]) 发送GET/POST请求 axios.get…

PROLOG实现亲属关系小型演绎数据库

问题 试编写一个描述亲属关系的PROLOG程序&#xff0c;然后给出一些事实数据&#xff0c;建立一个小型演绎数据库。 代码实现 % 基本事实 father(john, mike). father(john, lisa). father(boluo, ana). father(boluo, peter).mother(mary, mike). mother(mary, lisa). mother…

大厂进阶五:React源码解析之深度剖析Diff算法

本文主要针对React源码进行解析&#xff0c;内容有&#xff1a; 1、Diff算法原理、两次遍历 2、Diff瓶颈及限制 3、Diff更新之单节点和多节点原理 一、Diff源码解析 以下是关于 React Diff 算法的详细解析及实例&#xff1a; 1、React Diff 算法的基本概念和重要性 1.1 概念…

【串口助手开发】--温度曲线图实时显示功能,全流程小白教程,zedgraph控件的使用方法,Visual Studio 软件C#语言

1、ZedGraph.dll 控件下载 链接&#xff1a;下载ZedGraph&#xff08;ZedGraph.dll 和ZedGraph.Web.dll文件&#xff09; 打开链接后&#xff0c;图中红框显示的是仅下载zedgraph控件&#xff0c;本文所需的文件是ZedGraph.dll。 2、ZedGraph.dll 控件添加进Visual Studio 软…

【Arduino】ATmega328PB 连接 LSM6DS3 姿态传感器,并读数据(不确定 ESP 系列是否可行,但大概率是可行的)

总览 1.初始化 ATmega328PB&#xff0c;默认大家已经完成了 328 的配置准备工作&#xff0c;已经直接能够向里面写入程序 2.接线&#xff0c;然后验证 mega328 的 I2C 设备接口能否扫描到 LSM6DS3 3.编写代码&#xff0c;上传&#xff0c;查看串口数据。完成。 一、初始化 AT…

履带无人车+无人机+自组网:空地一体化技术详解

履带无人车、无人机与自组网技术的结合&#xff0c;构成了空地一体化技术的核心框架&#xff0c;这种技术在多个领域展现出巨大的潜力和应用价值。以下是对该技术的详细解析&#xff1a; 一、技术概述 空地一体化技术巧妙融合了履带无人车、无人机以及自组网技术&#xff0c;…

EPIC Institute of Technology Round August 2024 (Div. 1 + Div. 2)

前言 又是一场压线不掉分的比赛。 Standings&#xff1a;2706 题目链接&#xff1a;Dashboard - EPIC Institute of Technology Round August 2024 (Div. 1 Div. 2) - Codeforces A. Distanced Coloring 题意&#xff1a; 给一个 n * m 的矩阵&#xff0c;涂色&#xff0c;要…

pkg 打包后运行报错 Cannot mkdir in a snapshot. Try mountpoints instead.

把项目中使用到的 __dirname 类似这样的 join(__dirname, ./config)替换为 process.cwd() __dirname&#xff1a;获取的是当前文件目录路径&#xff0c;二进制文件内部的文件(pkg打包的二进制文件是快照文件&#xff0c;里面的文件只能读不能修改新增)&#xff0c;比如&#x…

区块链基础

1、区块链定义 区块链技术本质上是一个去中心化的数据库&#xff0c;它是比特币的核心技术与基础架构&#xff0c;是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。狭义来讲&#xff0c;区块链是一种按照时间顺序将数据区块以顺序相连的方式组合…

XSS-跨站脚本攻击

目录 XSS简介 XSS分类 反射型XSS&#xff08;非持久型XSS&#xff09; 存储型XSS&#xff08;持久型XSS&#xff09; DOM型XSS HTML文档解析过程 例题 HTML解析 字符实体(character entities) HTML字符实体(HTML character entities) 字符引用&#xff08;character…

程序员如何写PLC程序

PLC是可编程逻辑控制器的简称&#xff0c;常用的编程语言是IEC61131-3&#xff08;梯形图、结构化文本、指令表、功能块、顺序功能图&#xff09;和西门子的SCL。程序员常用的编程语言是JS、Java、Python、C/C、Go等。PLC广泛采用编程工具有codesys、博图等。程序员常用的编程工…

用Python实现9大回归算法详解——06. K近邻回归算法

1. K近邻回归的基本概念 K近邻回归&#xff08;K-Nearest Neighbors Regression, KNN Regression&#xff09;是一种基于实例的学习方法。与传统的回归模型不同&#xff0c;KNN回归不通过显式的函数来建模数据之间的关系&#xff0c;而是通过查找输入样本的“邻居”来进行预测…

【PDF技巧】如何编辑忘记密码PDF文件?

PDF文件打开之后&#xff0c;发现编辑功能都是灰色的&#xff0c;无法使用&#xff0c;无法编辑PDF文件&#xff0c;遇到这种情况&#xff0c;因为PDF文件设置了限制编辑导致的。一般情况下&#xff0c;我们只需要输入PDF密码&#xff0c;将限制编辑取消就可以正常编辑文件了&a…

在线装修管理系统pf

TOC springboot389在线装修管理系统pf 第1章 绪论 1.1 课题背景 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。所以各行业…

C语言 | Leetcode C语言题解之第345题反转字符串中的元音字母

题目&#xff1a; 题解&#xff1a; char vowel[] "aeiouAEIOU";bool isVowel(char ch) {for (int i 0; vowel[i]; i) {if (vowel[i] ch) {return true;}}return false; };char* reverseVowels(char* s) {int n strlen(s);int i 0, j n - 1;while (i < j) …