当前位置: 首页 > news >正文

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 = 0return 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.5mod = (self.state[:2] - self.state[2:]).norm(p=2).item()reward = -1.0over = Falseif mod <=0.15:reward = 0.0over =Trueif self.count>=50:over =Truereturn 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 =Falsedata = {'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_stateself.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 goalif 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和overreward = -1.0over =Falseif mod <=0.15:reward = 0.0over = True#以伪终点构建新的statestate[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())

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++】C++11新增特性
  • Fabric:关于链码的编写及部署的问题记录
  • 在CodeBlocks搭建SDL2工程OLED液晶模拟器虚拟OLED单色液晶(128x64)
  • 使用MongoDB构建AI:Story Tools Studio将生成式AI引入Myth Maker AI游戏
  • vue中点击导航栏,动态改变样式,经典写法
  • Linux网络:基于OS的网络架构
  • 【Kubernetes】k8s集群图形化管理工具之rancher
  • SourceTree远端!无法获取代码
  • 6. 数据结构—串的匹配算法
  • SpringBoot教程(二十二) | SpringBoot实现分布式定时任务之elastic-job
  • PMP到底有什么用?
  • C++的模板简介
  • JVM 类加载机制
  • Git的使用-初级
  • OJ-0819
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • 「译」Node.js Streams 基础
  • conda常用的命令
  • eclipse(luna)创建web工程
  • Git学习与使用心得(1)—— 初始化
  • go append函数以及写入
  • Linux中的硬链接与软链接
  • MYSQL 的 IF 函数
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • php的插入排序,通过双层for循环
  • php面试题 汇集2
  • v-if和v-for连用出现的问题
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 服务器从安装到部署全过程(二)
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 警报:线上事故之CountDownLatch的威力
  • 前端技术周刊 2019-01-14:客户端存储
  • 微信公众号开发小记——5.python微信红包
  • 新书推荐|Windows黑客编程技术详解
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • !!java web学习笔记(一到五)
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • (arch)linux 转换文件编码格式
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (void) (_x == _y)的作用
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (ZT)出版业改革:该死的死,该生的生
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (黑马C++)L06 重载与继承
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (十八)Flink CEP 详解
  • (一) storm的集群安装与配置
  • (已解决)什么是vue导航守卫
  • (转)可以带来幸福的一本书
  • .axf 转化 .bin文件 的方法
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务