动态规划法和策略迭代在扫地机器人中确定状态值和动作值函数的策略评估(python实现 附源码 超详细)

article/2025/8/29 21:46:53

觉得有帮助或需要源码请点赞关注收藏后评论区留言或私信博主要

在强化学习中,动态规划法主要用于求解有模型的MDP问题,尽管在现实任务中难以获得完备的环境模型,且动态规划法需要消耗大量的计算资源,但是作为强化学习的基础,动态规划法仍然具有非常重要的理论意义。

动态规划法主要包括基于模型的策略迭代和基于模型的值迭代两种。这两种算法都是利用值函数来评价策略的,一旦计算出满足贝尔曼最优方程的最优状态值函数V或最优动作值函数Q,就能得到最优策略。

策略迭代通过构建策略的值函数(状态值函数v 动作值函数q)来评估当前策略,并利用这些值函数给出改进的新策略,策略跌打由策略评估和策略改进两部分组成。 

 下面通过扫地机器人在不同环境下的策略评估进行实战

基于状态值函数的策略评估

 

1:确定环境如下

部分代码如下

# 代05-例4.1-基于状态值函数的确定环境扫地机器人任务策略评估
import numpy as npfrom 扫地机器人gym环境 import GridWorldEnvenv = GridWorldEnv()
"""定义格子世界参数"""
world_h =  5
world_w = 5
length = world_h * world_w
gamma = 0.8
state = [i for i in range(length)]  # 状态(编号)
action = ['n', 's', 'w', 'e']  # 动作名称
ds_action = {'n': -world_w, 'e': 1, 's': world_w, 'w': -1}
policy = np.zeros([length, len(action)])
suqe=[20, 21, 22, 23, 24, 15, 16, 17, 18, 19, 10, 11, 12, 13, 14, 5, 6, 7, 8, 9, 0, 1, 2, 3,4]# 定义奖励
def reward(s):if s == 20:  # 到充电站return 1elif s == 12:  # 到陷阱中return -10elif s == 9:  # 到垃圾处return 3else:return 0  # 其他def getAction(a):if a == 'n':return 0elif a == 'e':return 3elif a == 's':return 1elif a == 'w':return 2
入状态,则直接pass不做操作continuev = 0  # 针对每个状态值函数进行计算print("第%d 的状态" % (k), end="")for a in action:newAction = getAction(a)next_state = next_states(s, a)rewards = reward(next_state)if next_state == 12:v += policy[s][newAction] * (rewards + gamma * V[s])# print(" %.2f*(%d+%.1f*%.3f)+" % (policy[s][newAction], rewards, gamma, V[next_state]), end="")print(" %.2f*(%d+%.1f*%.3f)+" % (policy[s][newAction], rewards, gamma, V[next_state]), end="")else:v += policy[s][newAction] * (rewards + gamma * V[next_state])#     print("%.2f*(%d+%.1f*%.2f)+" % (policy[s][newAction], rewards, gamma, value[next_state]), end="")# print()# successor = getsuccessor(s)# for next_state in successor:#     rewards = reward(next_state)#     v += 1 / len(successor) * (rewards + gamma * V[next_state])print(" %.2f*(%d+%.1f*%.3f)+" % (policy[s][newAction], rewards, gamma, V[next_state]), end="")print("v = %.3f" % (v))delta = max(delta, np.abs(v - V[s]))  # 更新差值V[s] = v  # 存储(更新)每个状态下的状态值函数,即伪代码中的 v <- V(s)value = np.array(V).reshape(world_h, world_w)iter += 1print('k=', iter)  # 打印迭代次数print("当前的状态值函数为:")print(np.round(value, decimals=3))# 输出当前的状态值函数if delta < theta:  # 策略评估的迭代次数不能太多,否则状态值函数的数值会越来越大(即使算法仍然在收敛)breakreturn V  # 一轮迭代结束后,状态值函数暂时固定initPolicy()
value = policy_eval()

 随机环境的状态值函数策略评估此处省略 有需要请点赞关注收藏后私信博主

基于动作值函数的策略评估 

 

 部分代码如下

# 代08-例4.4-基于动作值函数的随机环境扫地机器人任务策略评估
import numpy as np
import pandas as pd"""定义格子世界参数"""
world_h =  5
world_w = 5
length = world_h * world_w
gamma = 0.8
action = ['n', 's', 'w', 'e']  # 动作名称
ds_action = {'n': -world_w, 'e': 1, 's': world_w, 'w': -1}
policy = np.zeros([length, len(action)])
suqe=[20, 21, 22, 23, 24, 15, 16, 17, 18, 19, 10, 11, 12, 13, 14, 5, 6, 7, 8, 9, 0, 1, 2, 3,4]# 定义奖励
def reward(s):if s == 20:  # 到充电站return 1elif s == 12:  # 到陷阱中return -10elif s == 9:  # 到垃圾处return 3else:return 0  # 其他# in表示0是[*,*,*]中的一个def getAction(a):if a == 'n':return 0elif a == 'e':return 3elif a == 's':return 1elif a == 'w':return 2# 在s状态下执行动作a,返回下一状态(编号)
def next_states(s, a):# 越过边界时passif (s < world_w and a == 'n') \or (s % world_w == 0 and a == 'w') \or (s > length - world_w - 1 and a == 's') \or ((s + 1) % world_w == 0 and a == 'e'):  # (s % (world_w - 1) == 0 and a == 'e' and s != 0)next_state = s  # 表现为next_state不变else:next_state = s + ds_action[a]  # 进入下一个状态return next_state# 在s状态下执行动作,返回所有可能的下一状态(编号)list
def getsuccessor(s):successor = []for a in action:  # 遍历四个动作if s == next_states(s, a):continueelse:# print("状态s=%s,动作a=%s"%(s,a))next = next_states(s, a)  # 得到下一个状态(编号)successor.append(next)  # 以list保存当前状态s下执行四个动作的下一状态# print(len(successor))return successordef envActionPolicy(a):if a == 'n':return 's'elif a == 's':return 'n'elif a == 'e':return 'w'elif a == 'w':return 'e'def CaValue(Q):v = [0 for i in range(length)]for i in range(length):for a in action:newAction = getAction(a)v[i] += policy[i][newAction] * Q.loc[i, a]value = np.array(v).reshape(world_h, world_w)print(np.round(value, decimals=4))def sumQ_nextstate(s, Q, visios):sum = 0for i in action:newAction = getAction(i)sum += policy[s][newAction] * Q.loc[s, i]return sumdef initPolicy():for s in range(length):for a in action:if next_states(s, a) == s:continuenewAction = getAction(a)policy[s][newAction] = 1 / len(getsuccessor(s))# print(policy)
def policy_eval_Q_random(theta=0.0001):Q = pd.DataFrame(np.zeros((length, len(action))),  # q_table initial valuescolumns=action,  # actions's name)iter = 0while True:k = -1delta = 0  # 定义最大差值,判断是否有进行更新for s in suqe:  # 遍历所有状态 [0~25]visio = Falsek += 1if s in [9, 20, 12]:  # 若当前状态为吸入状态,则直接pass不做操作continueif s == 17:visio = True# [[-0.7954 - 1.0218 - 1.2655 - 0.1564  1.369]#  [-1.066 - 1.9614 - 3.8893 - 0.7455  0.]# [-1.4346 - 4.176# 0. - 3.5631 - 0.0563]# [-0.489 - 1.7904 - 4.1252 - 1.7891 - 0.6118]# [0. - 0.4778 - 1.3917 - 0.9611 - 0.5992]]for a in action:newAction = getAction(a)env_action = envActionPolicy(a)next_state = next_states(s, a)env_state = next_states(s, env_action)rewards = reward(next_state)env_rewards = reward(env_state)if policy[s][newAction] == 0:continueif next_state == 12:q = 0.8 * (rewards + gamma * sumQ_nextstate(s, Q, visio)) + 0.15 * (gamma * sumQ_nextstate(s, Q, visio)) + 0.05 * (env_rewards + gamma * (sumQ_nextstate(env_state, Q, visio)))if visio == True:print("q=%.2f=0.8*(%.2f+%.2f*%.2f)+0.15*(%.2f*%.2f)+0.05*(%.2f+%.2f*%.2f)"% (q, rewards, gamma, sumQ_nextstate(s, Q, visio), gamma, sumQ_nextstate(s, Q, visio),env_rewards, gamma, sumQ_nextstate(env_state, Q, visio)))else:q = 0.8 * (rewards + gamma * sumQ_nextstate(next_state, Q, visio)) + 0.05 * (env_rewards + gamma * sumQ_nextstate(env_state, Q, visio)) \+ 0.15 * gamma * sumQ_nextstate(s, Q, visio)if visio == True:print("q=%.2f=0.8*(%.2f+%.2f*%.2f)+0.15*(%.2f*%.2f)+0.05*(%.2f+%.2f*%.2f)" % (q,rewards, gamma,sumQ_nextstate(next_state, Q,visio), gamma,sumQ_nextstate(s,Q,visio),env_rewards,gamma,sumQ_nextstate(env_state, Q,visio)))delta = max(delta, np.abs(q - Q.loc[s, a]))  # 更新差值Q.loc[s, a] = q  # 存储(更新)每个状态下的状态值函数,即伪代码中的 v <- V(s)iter += 1print('k=', iter)  # 打印迭代次数k = 0Q1 = pd.DataFrame(np.zeros((length, len(action))),  # q_table initial valuescolumns=action,  # actions's name)for s in suqe:Q1.loc[k] = Q.loc[s]k = k + 1Q1.rename(columns={'n': 'UP', 's': 'DOWN', 'w': 'LEFT', 'e': 'RIGHT'}, inplace=True)print(Q1)if delta < theta:  # 策略评估的迭代次数不能太多,否则状态值函数的数值会越来越大(即使算法仍然在收敛)break# CaValue(Q)return QinitPolicy()
q = policy_eval_Q_random()
CaValue(q)

确定环境下的省略不表 有需要请点赞关注收藏后私信博主要


http://chatgpt.dhexx.cn/article/lqNVhjuX.shtml

相关文章

扫地机器人市场:米家、科沃斯激烈肉搏

配图来自Canva 一个干净、整洁的家&#xff0c;在给全家人营造一个舒适的生活空间的同时&#xff0c;也能给全家人带来好的心情以及和睦的家庭氛围&#xff0c;但要一直保持家的整洁&#xff0c;并不是一件轻松的事。 尤其是作为上班族&#xff0c;常常在繁忙的一天工作之后&…

扫地机器人的喋血江湖

2025年全球和中国扫地机器人市场规模&#xff0c;将分别达到130亿美元和50亿美元&#xff08;瑞银预测数据&#xff09;。而眼下&#xff0c;扫地机器人在国内市场渗透率仅4%-6%&#xff0c;远低于美国的13%。 这是资本狂热追逐扫地机器人行业的一个重要原因。 即便行业里已经有…

日语900句(衣食住行)PDF下载地址|百度云盘免费分享

有人说&#xff0c;金字塔的魅力就在于它完美的建筑结构&#xff0c;有坚实深厚的基础&#xff0c;才造就了塔尖的辉煌。 学好日语也是同样的道理&#xff0c;坚实的语言基础很多时候来源于大量的输入&#xff0c;量变达到质变&#xff0c;这种语言便能脱口而出&#xff0c;语感…

基于YoloV4的车辆检测跟踪系统(跟踪准确率大于99%)

1.结果展示 系统采用YoloV4检测车辆目标&#xff0c;对有效车辆检测框进行跟踪匹配&#xff0c;检测结果示意图如下&#xff1a; 检测结果视频为&#xff1a;基于YoloV4的车辆检测跟踪系统_哔哩哔哩_bilibili 2.系统工作流程 工作流程图如下&#xff1a; 检测跟踪系统性能&am…

跟踪自主车辆软件平台

跟踪自主车辆软件平台 Tracking autonomous vehicle software platforms 全世界——包括影音产业和媒体——都承认&#xff0c;通往4级和5级自动驾驶汽车的道路仍然漫长而曲折。 多家领先的汽车原始设备制造商和技术供应商推迟了自主汽车的上市&#xff0c;这是充分的证据&a…

【carsim+simulink 联合仿真——车辆轨迹MPC跟踪】

学习北理工的无人驾驶车辆模型预测控制第2版第四章&#xff0c;使用的仿真软件为Carsim8和MatlabR2019a联合仿真&#xff0c;使用MPC控制思想对车辆进行轨迹跟踪控制&#xff0c;并给出仿真结果。 mpc控制器函数&#xff1a;s-function function [sys,x0,str,ts] MY_MPCContr…

智能车辆路径跟踪控制:纯跟踪控制与Stanley控制算法,其他线相关算法

智能车辆路径跟踪控制&#xff1a;纯跟踪控制与Stanley控制算法&#xff0c;其他线相关算法 主要是MATLAB程序&#xff0c;可以根据需要的路径进行跟踪 ID:6920649147612984

LoRaWAN模块在车辆跟踪定位中的应用

目前 GPS已经在资产的管理中得到了越来越多的运用&#xff0c;如车辆跟踪、车队跟踪、资产监控等&#xff1b;人员跟踪&#xff0c;宠物跟踪&#xff0c;等等。在所有追踪装置中&#xff0c;最重要的是它的电池期望和监视距离。鉴于 LoRaWAN的功率消耗很小&#xff0c;而且能在…

无人驾驶车辆轨迹跟踪控制文献分享(1)

文献题目&#xff1a;Modelling and Control Strategies in Path Tracking Control for Autonomous Ground Vehicles: A Review of State of the Art and Challenges 作者&#xff1a;Noor Hafizah Amer Hairi Zamzuri Khisbullah Hudha Zulkiffli Abdul Kadir 论文类型&am…

无人驾驶之车辆检测与跟踪

整个项目源码&#xff1a;GitHub 整个项目数据集&#xff1a;车辆数据集、无车辆数据集 引言 本次分享主要介绍&#xff0c;如何对道路上的汽车进行识别与跟踪。这里我们实现一个简单的demo。后续我们还会对前面的代码及功能进行重构&#xff0c;从而进一步丰富我们的功能。 …

自动驾驶路径跟踪控制——车辆动力学建模基本概念

文章目录 1. 位姿自由度2. TDOFandCDOF3.运动学与动力学4. 运动控制问题描述5. 运动学建模6. 机器人位姿7. 跟踪误差8. 控制律设计声明 1. 位姿自由度 位姿自由度——系统在空间中的位姿描述所需变量的个数。任何一个没有受约束的物体&#xff0c;在空间均具有6个独立的运动&am…

车辆、行人跟踪一网打尽,超轻量、多类别、小目标跟踪系统开源了!

在琳琅满目的视觉应用中&#xff0c;对车辆、行人、飞行器等快速移动的物体进行实时跟踪及分析&#xff0c;可以说是突破安防、自动驾驶、智慧城市等炙手可热行业的利器~ 但要实现又快又准的持续跟踪&#xff0c;往往面临被检目标多、相互遮挡、图像扭曲变形、背景杂乱、视角差…

车辆轨迹跟踪算法---几何跟踪算法

车辆轨迹跟踪算法 车辆轨迹跟踪算法 车辆轨迹跟踪&#xff0c;目前的主流方法分为两类&#xff1a;基于几何追踪的方法和基于模型预测的方法&#xff1b; 几何追踪方法–pure-pursuit (纯跟踪)算法 阿克曼几何的简化版 – 车辆单轨模型&#xff08;自行车模型&#xff09;采…

MPC车辆轨迹跟踪----理论推导

MPC控制简介 众所周知&#xff0c;控制算法中&#xff0c;PID的应用占据了90&#xff05;&#xff0c;而另外10&#xff05;就是这次的主角MPC控制算法。 MPC控制算法全称模型预测控制&#xff0c;它相对比PID有着多输入&#xff0c;多输出以及更加平稳的特点。并且最重要的是…

车辆检测和跟踪技术的研究与实现

一、引言 车辆的持续跟踪对于肇事车辆的追捕以及减少交通事故具有重要意义。随着计算机技术的快速发展&#xff0c;推动着视频图像的智能化应用。当前对于视频图像的研究热点之一&#xff0c;就包括运动目标跟踪。当前对于运动目标的研究主要集中在单个摄像头的跟踪&#xff0…

自动驾驶:车道线检测、车速检测、实时通行跟踪、基于视频的车辆跟踪及流量统计

日萌社 人工智能AI&#xff1a;Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战&#xff08;不定时更新&#xff09; CNN&#xff1a;RCNN、SPPNet、Fast RCNN、Faster RCNN、YOLO V1 V2 V3、SSD、FCN、SegNet、U-Net、DeepLab V1 V2 V3、Mask RCNN 自动驾驶&…

yolo-车辆测距+前车碰撞预警(追尾预警)+车辆检测识别+车辆跟踪测速(原创算法-毕业设计)

目录 前言一、环境配置二、车辆检测、实时跟踪测速算法及代码解读1、主函数各参数含义2、算法实现3、核心代码4、效果展示 二、跟车距离测量算法及代码解读1、主函数各参数含义2、算法实现3、效果展示 三、前车碰撞预警&#xff08;追尾预警&#xff09;算法及代码解读1、算法实…

车辆跟踪技术概述zt

摘 要 基于视频的车辆检测器近年来在智能交通系统(ITS)中得到了越来越广泛的应用。本文介绍了近年来提出的一些主要的基于视频的车辆检测与跟踪技术&#xff0c;并对这些技术进行了分类。同时分析比较了各种方法的优缺点。最后&#xff0c;说明了这一领域仍然存在的问题和对可能…

车辆跟踪检测

这个是GUI的界面&#xff0c;我们分别对这个界面做介绍。 第一个窗口显示的是原始的视屏 第二个窗口是提取视屏的背景。 第三个窗口是汽车跟踪&#xff0c;将汽车跟踪效果显示。 第四个窗口是画线&#xff0c;将用户画线后的区域分为两个区间&#xff0c;通过检测区间后&…

【车辆行人检测和跟踪数据集及代码汇总】

车辆行人检测和跟踪数据集和代码汇总 1. 车辆检测和跟踪1.1 车辆检测数据集和训练权重1.2 车辆跟踪 2. 行人检测和跟踪2.1 行人检测数据集和训练权重2.2行人多目标跟踪 3. 车辆行人检测和跟踪3.1车辆行人检测数据集和训练权重3.2 车辆行人多目标跟踪 1. 车辆检测和跟踪 1.1 车…