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

目标导向强化学习(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())

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一元二次方程系数

前言&#xff1a;刚刚开始写的时候也想到了先求出两个的解&#xff0c;但是没想到最后正负数系数怎么处理 且我才知道求解gcd是可以负数和正数的 #include<bits/stdc.h> using namespace std;#define int long long int t; int a,b,c;void solve(){cin >> a >&…

spfa()算法(求最短路)

spfa算法是对bellman_ford算法的优化&#xff0c;大部分求最短路问题都可以用spaf算法来求。 注意&#xff1a; &#xff08;1&#xff09;如若图中有负权回路&#xff0c;不能用spfa算法&#xff0c;要用bellman_ford算法&#xff1b;若只有负权边&#xff0c;则可以用 spf…

得到任务式 大模型应用开发学习方案

根据您提供的文档内容以及您制定的大模型应用开发学习方案&#xff0c;我们可以进一步细化任务式学习的计划方案。以下是具体的任务式学习方案&#xff1a; 任务设计 初级任务 大模型概述&#xff1a;阅读相关资料&#xff0c;总结大模型的概念、发展历程和应用领域。深度学…

vue3响应式工具 toRefs() 和 toRef()

前言 直接解构响应式对象的属性进行赋值给新的变量&#xff0c;会导致新变量失去响应式。 当修改新变量的值时&#xff0c;不会触发原始响应式对象的更新&#xff0c;从而在模板中也不会有相应的视图更新。 示例&#xff1a; <template><div><p>姓名: {{ …

案例分享—国外深色UI界面设计赏析

在国外&#xff0c;深色界面设计&#xff08;Dark Mode&#xff09;已成为提升用户体验的重要趋势。它不仅有效减少屏幕亮度&#xff0c;保护用户视力&#xff0c;还能在夜晚或低光环境下提供更加舒适的浏览体验。设计师们普遍认识到&#xff0c;深色主题不仅提升了应用的视觉层…

android13禁用打开wifi ap 热点

总纲 android13 rom 开发总纲说明 目录 1.前言 2.情况分析 3.代码分析 4.代码修改 5.彩蛋 1.前言 这个文章介绍的是如何禁止用户打开wifi热点,禁止用户安装app后,打开wifi热点。 2.情况分析 android13 应用层打开wifi AP public void setWifiApEnabled(boolean isEn…

qt-17不规则窗体

不规则窗体 知识点shape.hshape.cppmain.cpp运行图 知识点 感觉这个就是在图片背景 贴了白色 shape.h #ifndef SHAPE_H #define SHAPE_H#include <QWidget>class Shape : public QWidget {Q_OBJECTpublic:Shape(QWidget *parent nullptr);~Shape(); protected:void m…

HTML及CSS面试题4

1、BFC 1.1、介绍BFC及其应用 补充——触发BFC的方式&#xff0c;常见的有&#xff1a; 设置浮动overflow设置为&#xff1a;auto、scroll、hiddenpositon设置为&#xff1a;absolute、fixed 介绍&#xff1a; ○ 所谓BFC&#xff0c;指的是&#xff1a;一个独立的布局环境&am…

go-zero中间件的使用

一、自定义中间件 1、在api中在服务中定义一个中间件,名字随便取 type PostDemoReq {Name string json:"name" validate:"required" // 姓名Age int64 json:"age" validate:"required,gte1,lte130" // 年龄// optional 表示可选,omi…

漏洞挖掘 | 某系统webpack接口泄露引发的一系列漏洞

信息搜集 这里找到从小穿一条裤子长大的兄弟&#xff0c;要挟他交出来他的统一账号&#xff0c;否则把小时候的照片挂网上&#xff0c;开始某大学的资产搜集&#xff0c;直接hunter搜索此大学域名 看有价值的站点&#xff0c;ok找到下面的站点 未授权敏感信息泄露越权任意用…

docker compose部署rabbitmq集群,并使用haproxy负载均衡

一、创建rabbitmq的data目录 mkdir data mkdir data/rabbit1 mkdir data/rabbit2 mkdir data/rabbit3 二、创建.erlang.cookie文件&#xff08;集群cookie用&#xff09; echo "secretcookie" > .erlang.cookie 三、创建haproxy.cfg配置文件 global log stdout fo…

018集——递归函数和for循环对比(从1加到100实例) ——C#学习笔记

本例分别用递归函数和for循环&#xff0c;求出1到100的和&#xff1a; using System;namespace Mytest {class Mytest{static void Main(string[] args){Calculate Myc new Calculate();int YourNumber 100;int Mysum Myc.Xto1(YourNumber);Console.WriteLine("从1加到…

Go-Zero微服务框架下开发接口流程

目录 一&#xff1a;定义api入参和返回值 二&#xff1a;生成入参和返回值文件 三&#xff1a;定义rpc参数和返回值 四&#xff1a;生成返回值和参数 五&#xff1a;定义数据库 六&#xff1a;生成数据库文件 今天我们来讲解下如何在Go-Zero下开发一个api接口的具体流程&…

Android 13 GMS 内置壁纸

如图&#xff0c;原生系统上&#xff0c;设备上的壁纸 显示系统内置壁纸。如果没有添加内置壁纸&#xff0c;就显示默认的壁纸。点击进去就是预览页面 扩展下&#xff0c;默认壁纸在 frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png frameworks/b…

Markdown导出为 Excel文件 Vue3

直接复制到单文件内即可使用 需要用到的插件 xlsx 0.17.5marked 14.0.0file-saver 2.0.5vue 3.4.29 直接SFC单文件内使用 <script setup> import {reactive} from vue; import xlsx from xlsx; import {marked} from marked; import {saveAs} from file-saver;const…

博达网站群管理平台 v6.0使用相关问题解决

1 介绍 最近受人所托&#xff0c;需要用博达网站群管理平台创建一个网站。该平台的内部版本为9.8.2。作为一个能直接从代码创建网站系统的人&#xff0c;初次使用本平台&#xff0c;刚开始感觉摸不着头脑。因为该平台存在的目的&#xff0c;就是让不懂代码的人能快速创建网站&…

Go语言导入gin包

访问https://pkg.go.dev/页面,输入gin 点击README&#xff0c;点击Getting started&#xff0c;点击Getting Gin。 以VSCode通过mod命令导入gin包为例 安装第三方库 go mod init go mod tidy运行成功创建go.mod文件 go get -u github.com/gin-gonic/gin创建Go项目&#xf…

el-image 图片预览时 与 el-table (或avue-crud) 样式冲突 的解决

问题: 解决 <style scoped> ::v-deep(.el-table__cell) {position: static !important; } </style> 后效果

尚品汇-前端调用搜索实现(三十二)

目录&#xff1a; &#xff08;1&#xff09;修改web-all模块 &#xff08;2&#xff09;配置网关 &#xff08;3&#xff09;页面渲染 &#xff08;4&#xff09;面包屑处理 &#xff08;1&#xff09;修改web-all模块 修改pom.xml文件 <dependencies><depende…

手撕C++入门基础

1.C介绍 C课程包括&#xff1a;C语法、STL、高阶数据结构 C参考文档&#xff1a;Reference - C Reference C 参考手册 - cppreference.com cppreference.com C兼容之前学习的C语言 2.C的第一个程序 打印hello world #define _CRT_SECURE_NO_WARNINGS 1 // test.cpp // …