24/8/15算法笔记 dp策略迭代 价值迭代

ops/2024/9/24 12:22:20/
  1. 策略迭代

    • 策略迭代从某个策略开始,计算该策略下的状态价值函数。
    • 它交替进行两个步骤:策略评估(Policy Evaluation)和策略改进(Policy Improvement)。
    • 在策略评估阶段,计算给定策略下每个状态的期望回报。
    • 在策略改进阶段,尝试找到一个更好的策略,该策略对于每个状态选择最优动作。
    • 这个过程一直进行,直到策略收敛,即不再有改进的空间。
  2. 价值迭代

    • 价值迭代直接迭代状态价值函数,而不是策略。
    • 它从任意状态价值函数开始,然后迭代更新每个状态的价值,直到收敛。
    • 在每次迭代中,对所有状态使用贝尔曼最优性方程(Bellman Optimality Equation)来更新其价值。
    • 价值迭代通常比策略迭代更快收敛到最优价值函数。
  3. 收敛性

    • 策略迭代保证在有限次迭代后收敛到最优策略和最优价值函数。
    • 价值迭代也保证收敛,但收敛速度可能因问题而异。
  4. 计算复杂度

    • 策略迭代可能需要多次策略评估,每次评估都涉及对所有状态的操作,因此在某些情况下可能比较慢。
    • 价值迭代每次迭代只更新一次所有状态的价值,但可能需要更多次迭代才能收敛。
  5. 适用性

    • 策略迭代在策略空间较大或状态转移概率较复杂时可能更有效。
    • 价值迭代适用于状态空间较大且容易计算贝尔曼最优性方程的情况。
  6. 实现方式

    • 策略迭代通常使用循环,外部循环负责策略评估,内部循环负责策略改进。
    • 价值迭代使用单一循环,每次迭代更新所有状态的价值。

策略迭代:

#获取一个格子的状态
def get_state(row,col):if row !=3:return'ground'if row ==3 and col ==0:return 'ground'if row==3 and col==11:return 'terminal'return 'trap'
get_state(0,0)

地图上有平地,陷阱,终点

#在一个格子里做动作
def move(row,col,action):#如果当前已经在陷阱或者终点,则不能执行任何动作,反馈都是0if get_state(row,col)in['trap','terminal']:return row,col,0#向上if action==0:row-=1#向下if action ==1:row+=1#向左if action==2:col-=1#向右if action==3:col+=1#不允许走到地图外面去row = max(0,row)row = min(3,row)col =max(0,col)col =min(11,col)#是陷阱的话,奖励是-100,否则都是-1#这样强迫了机器尽快结束游戏,因为每走一步都要扣一分#结束最好是以走到终点的形式,避免被扣100分reward = -1if get_state(row,col)=='trap':reward -=100return row,col,reward
import numpy as np#初始化每个格子的价值
values = np.zeros([4,12])#初始化每个格子下采用动作的概率
pi = np.ones([4,12,4])*0.25values,pi[0]

#Q函数,求state,action的分数
#计算在一个状态下执行动作的分数
def get_qsa(row,col,action):#当前状态下执行动作,得到下一个状态和rewardnext_row,next_col,reward = move(row,col,action)#计算下一个状态分数,取values当中记录的分数即可,0.9是折扣因子value = values[next_row,next_col]*0.9#如果下个状态是终点或者陷阱,则下一个状态分数为0if get_state(next_row,next_col)in ['trap','terminal']:value = 0#动作的分数本身就是reward,加上下一个状态的分数return value + reward
get_qsa(0,0,0)
-1.0
#策略评估
def get_values():#初始化一个新的values,重新评估所有格子的分数new_values = np.zeros([4,12])#遍历所有格子for row in range(4):for col in range(12):#计算当前格子4个动作分别的分数action_value = np.zeros(4)#遍历所有动作for action in range(4):action_value[action] = get_qsa(row,col,action)#每个动作的分数和它的概率相乘action_value *=pi[row,col]#最后这个格子的分数,等于该格子下所有动作的分数求和new_values[row,col] = action_value.sum()return new_values
get_values()

#策略提升函数
def get_pi():#重新初始化每个格子下采用动作的概率,重新评估new_pi = np.zeros([4,12,4])#遍历所有格子for row in range(4):for col in range(12):#计算当前格子4个动作分别的分数action_value = np.zeros(4)#遍历所有动作for action in range(4):action_value[action] = get_qsa(row,col,action)#计算当前状态下,达到最大分数的动作有几个count = (action_value == action_value.max()).sum()#让这些动作均分概率for action in range(4):if action_value[action]==action_value.max():new_pi[row,col,action] = 1/countelse:new_pi[row,col,action]=0return new_pi
get_pi()

#循环迭代策略评估和策略提升,寻找最优解
for _ in range(10):for _ in range(100):values = get_values()pi = get_pi()
values,pi

#打印游戏,方便测试
def show(row,col,action):graph=['','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','2','2','2','2','2',   '2','2','2','2','2','1']action = {0:'上',1:'下',2:'左',3:'右'}[action]graph[row*12+col] = actiongraph=' '.join(graph)for i in range(0,4*12,12):print(graph[i:i+12])show(1,1,0)
#测试函数
from IPython import display
import timedef test():#起点在0,0row = 0col = 0#最多玩N步for _ in range(200):#选择一个动作action = np.random.choice(np.arange(4),size = 1,p=pi[row,col])[0]#打印这个动作display.clear_output(wait = True)time.sleep(1)show(row,col,action)#执行动作row,col,reward = move(row,col,action)#获取当前状态,如果状态是终点或者掉到陷阱则终止if get_state(row,col) in ['trap','terminal']:break
test()

价值迭代算法

def get_values():#初始化一个新的values,重新评估所有格子的分数new_values = np.zeros([4,12])#遍历所有格子for row in range(4):for col in range(12):#计算当前格子4个动作分别的分数action_value = np.zeros(4)#遍历所有动作for action in range(4):action_value[action] = get_qsa(row,col,action)"""和策略迭代算法唯一的不同点"""#求每一个格子的分数,等于该格子下所有动作的最大分数new_values[row,col] = action_value.max()return new_values
get_values()


http://www.ppmy.cn/ops/96448.html

相关文章

【区块链+商贸零售】神椰——积分互通互兑平台 | FISCO BCOS应用案例

作为企业增加用户忠诚度以及活跃度的营销手段,积分已经被广泛使用。但企业积分由每个企业单独发行,使消 费者在使用的时候面临一些问题,如:积分种类太多、管理困难、价值量不高、在单个企业可积分兑换的产品种 类较少等。其背后的…

Apache Doris 中Compaction问题分析和典型案例

说明 此文档主要说明一些常见compaction问题的排查思路和临时处理手段。这些问题包括 Compaction socre高Compaction失败compaction占用资源多Compaction core 如果问题紧急,可联系社区同学处理 如果阅读中有问题,可以反馈给社区同学。 1 compaction …

【设计模式】观察者模式和订阅发布模式

观察者模式 观察者模式包含观察目标和观察者两类对象。一个目标可以有任意数目的与之相依赖的观察者。一旦观察目标的状态发生改变,所有的观察者都将得到通知。 当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新,解决…

Vue状态管理工具:vuex

目录 基本概念 使用步骤 核心概念 1.State 2.Getters 3.Mutations 4.Actions 5.Modules 辅助函数 基本概念 基础用法 基本概念 官方:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 库。它采用集中式存储管理应用的所有组件的状态,并以…

UniAD_面向规划的自动驾驶

Planning-oriented Autonomous Driving 面向规划的自动驾驶 https://github.com/OpenDriveLab/UniAD Abstract Modern autonomous driving system is characterized as modular tasks in sequential order, i.e., perception, prediction, and planning. In order to perfor…

深入理解浏览器解析机制和XSS向量编码

基础部分 1.<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a> <a>标签可以识别&#xff0c;但是解析不了&#xff0c; 是在协议的编码顺序上&#xff0c;先认协议 URL 编码 "javascript:alert(1)" 2.<a …

MariaDB基本知识汇总

/* MariaDB 1、视图 2、临时表 3、自定义函数 4、存储过程 5、触发器 6、游标 7、变量声明与赋值 8、常用函数&#xff08;日期格式&#xff0c;Guid&#xff0c;判断&#xff0c;循环&#xff0c;XML格式操作&#xff09; 9、动态执行SQL 语句 10、开启执行计划 11、创建登录M…

查券机器人如何提升电商返利系统的用户体验

查券机器人如何提升电商返利系统的用户体验 大家好&#xff0c;我是阿可&#xff0c;微赚淘客系统及省赚客APP创始人&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 电商返利系统是连接用户与电商平台的桥梁&#xff0c;通过提供优惠券和返利服务…