深度强化学习中利用Q-Learngin和期望Sarsa算法确定机器人最优策略实战(超详细 附源码)

news2024/12/22 19:30:59

需要源码和环境搭建请点赞关注收藏后评论区留下QQ~~~

一、Q-Learning算法

Q-Learning算法中动作值函数Q的更新方向是最优动作值函数q,而与Agent所遵循的行为策略无关,在评估动作值函数Q时,更新目标为最优动作值函数q的直接近似,故需要遍历当前状态的所有动作,在所有状态都能被无限次访问的前提下,Q-Learning算法能以1的概率收敛到最优动作值函数和最优策略

下图是估算最优策略的Q-Learning算法流程图

Q-Learning虽然是异策略,但是从值函数更新迭代式中可以看出,它并没有使用到重要性采样。

 

 使用Q-Learning算法解决确定环境中的扫地机器人问题 参数设置与之前相同 使用贪心策略 

机器人背景及环境搭建

输出如下

 

 

 代码如下


#Q-learning算法
from 扫地机器人gym环境 import GridWorldEnv
import numpy as np
np.random.seed(1)
env = GridWorldEnv()
#有效动作空间
def vilid_action_space(s):
    action_sacpe = []
    if s % 5 != 0:#左
        action_sacpe.append(0)
    if s % 5 != 4:#右
        action_sacpe.append(1)
    if s <= 19:#上
        action_sacpe.append(2)
    if s >= 5:#下
        action_sacpe.append(3)
    return action_sacpe

def policy_epsilon_greedy(s, Q, epsilon):
    Q_s = Q[s]
    action = vilid_action_space(s)
    if np.random.rand() < epsilon:
        a = np.random.choice(action)
    else:
        index_a = np.argmax([Q_s[i] for i in action])
        a = action[index_a]
    return a

def trans1(Q_S):
    new_Q = []
    new_Q.append(Q_S[2])
    new_Q.append(Q_S[3])
    new_Q.append(Q_S[0])
    new_Q.append(Q_S[1])
    return new_Q

def trans(Q_S):
    new_Q = []
    new_Q.append(round(Q_S[2],3))
    new_Q.append(round(Q_S[3],3))
    new_Q.append(round(Q_S[0],3))
    new_Q.append(round(Q_S[1],3))
    return new_Q

def print_dd(s, a, next_s, print_len, episode_i, Q,e_k,a_k):
    for i in range(2):
        if episode_i == int(print_len * (0.1 * i + 1)):
            if s == 15 and a == 3 and next_s == 10:
                print("*********************************单步的计算过程***************************************")
                print("alpha:"+str(a_k))
                print("epsilon:"+str(e_k))
                print("state:" + str(int(print_len * (0.1 * i + 1))))
                print("Q(%d,%d)"%(s,a))
                print(Q[s][a])
                print("Q(%d,*)"%(next_s))
                print(trans1(Q[next_s]))
                print('output:'+str(Q[s][a] + a_k * (0.8 * np.max(Q[next_s]) - Q[s, a])))

def print_ff(list_q, Q, episode_i,epsilon_k,alpha_k):
    list_s = range(0,25)
    for em in list_q:
        if em == episode_i:
            print("*******************************情节数:%s*******************************"%(str(em)))
            for state in list_s:
                print("Q(%d,*)"%(state) + str(trans(Q[state])))
                action = vilid_action_space(state)
                len_a = len(action)
                e_p = epsilon_k / float(len_a)
                max_a = np.argmax(Q[state])
                prob = []
                index_a = np.argmax([Q[state][i] for i in action])
                for i in range(4):#计算epsilon
                    if i not in action:
                        prob.append(0.0)
                    else:
                        if i == action[index_a]:
                            prob.append(1 - epsilon_k + e_p)
                        else:
                            prob.append(e_p)
                print('概率值:' + str(trans(prob)))
                print("epsilon_k: {}".format(epsilon_k))
                print("alpha_k:{}".format(alpha_k))

def Attenuation(epsilon,alpha,episode_sum,episode):
    epsilon = (float(episode_sum) - float(episode)) / float(episode_sum) * epsilon
    alpha = (float(episode_sum) - float(episode)) / float(episode_sum) * alpha
    return epsilon, alpha

        while not done:
            a = policy_epsilon_greedy(s, Q, epsilon_k)
            next_s, r, done, _ = env.step(a)
            print_dd(s, a, next_s, 10000, episode_i, Q, epsilon_k, alpha_k)
            Q[s, a] += alpha_k * (r + gamma * np.max(Q[next_s]) - Q[s, a])
            s = next_s
    return Q

Q = Q_Learning(env, 25000, 0.05, 0.8, 0.5)

二、期望Sarsa算法

通过对Sarsa算法进行改进,得到一种异策略TD算法,该算法考虑当前策略下所有动作的可能性,利用动作值函数的期望值取代某一特定动作值函数来更新估计值,该算法称为期望Sarsa算法。

相比于Sarsa算法,期望Sarsa算法计算更为复杂,但通过计算能够有效地消除银随机选择而产生的方差,因此通常情况下,期望Sarsa算法明显优于Sarsa算法,另外期望Sarsa算法还可以使用异策略方法,将Q-Learning进行推广并提升性能

下面利用期望Sarsa算法解决确定环境扫地机器人问题 背景与前面相同 不再赘述

迭代到20000次后基本Q值已经收敛

 

 代码如下


# 期望Sarsa算法
from 扫地机器人gym环境 import GridWorldEnv
import numpy as np
from queue import Queue

np.random.seed(1)
env = GridWorldEnv()


# 有效动作空间
def vilid_action_space(s):
    action_sacpe = []
    if s % 5 != 0:  # 左
        action_sacpe.append(0)
    if s % 5 != 4:  # 右
        action_sacpe.append(1)
    if s <= 19:  # 上
        action_sacpe.append(2)
    if s >= 5:  # 下
        action_sacpe.append(3)
    return action_sacpe


def policy_epsilon_greedy(s, Q, epsilon):
    Q_s = Q[s]
    action = vilid_action_space(s)
    if np.random.rand() < epsilon:
        a = np.random.choice(action)
    else:
        index_a = np.argmax([Q_s[i] for i in action])
        a = action[index_a]
    return a


def compute_epsion(s, Q, epsilon):
    max_a = np.argmax(Q[s])
    action = vilid_action_space(s)
    len_all_a = len(action)
    prob_l = [0.0, 0.0, 0.0, 0.0]
    for index_a in action:
        if index_a == max_a:
            prob_l[index_a] = 1.0 - epsilon + (epsilon / len_all_a)
        else:
            prob_l[index_a] = epsilon / len_all_a
    return prob_l


def compute_e_q(prob, q_n):
    sum = 0.0
    for i in range(4):
        sum += prob[i] * q_n[i]
    return sum


def trans1(Q_S):
    new_Q = []
    new_Q.append(Q_S[2])
    new_Q.append(Q_S[3])
    new_Q.append(Q_S[0])
    new_Q.append(Q_S[1])
    return new_Q


def print_dd(s, a, next_s, print_len, episode_i, Q, e_k, a_k):
    for i in range(50):
        if episode_i == int(print_len * ((0.02 * i) + 1)):
            if s == 15 and a == 3 and next_s == 10:
                print("*****************************单步计算过程****************************************")
                print("alpha:" + str(a_k))
                print("epsilon:" + str(e_k))
                print("state:" + str(int(print_len * (1 + (0.02 * i)))))
                print("Q(%d,%d)" % (s, a))
                print(Q[s][a])
                print("Q(%d,*)" % (next_s))
                print(trans1(Q[next_s]))
                prob_l = compute_epsion(next_s, Q, e_k)
                print('概率' + str(trans1(prob_l)))
                Q_e = compute_e_q(prob_l, Q[next_s])
                print('update:' + str(Q[s, a] + a_k * (0.8 * Q_e - Q[s, a])))


def trans(Q_S):
    new_Q = []
    new_Q.append(round(Q_S[2], 3))
    new_Q.append(round(Q_S[3], 3))
    new_Q.append(round(Q_S[0], 3))
    new_Q.append(round(Q_S[1], 3))
    return new_Q


def print_ff(list_q, Q, episode_i, epsilon_k, alpha_k):
    list_s = range(0, 25)
    for em in list_q:
        if em == episode_i:
            print("*******************************情节数:%s*******************************" % (str(em)))
            for state in list_s:
                print("Q(%d,*) " % (state) + str(trans(Q[state])))
                action = vilid_action_space(state)
                len_a = len(action)
                e_p = epsilon_k / float(len_a)
                prob = []
                index_a = np.argmax([Q[state][i] for i in action])
                for i in range(4):  # 计算epsilon
                    if i not in action:
                        prob.append(0.0)
                    else:
                        if i == action[index_a]:
                            prob.append(1 - epsilon_k + e_p)
                        else:
                            prob.append(e_p)
                print('概率值:' + str(trans(prob)))
                print("epsilon_k: {}".format(epsilon_k))
                print("alpha_k:{}".format(alpha_k))


def Attenuation(epsilon, alpha, episode_sum, episode):
    epsilon = (float(episode_sum) - float(episode)) / float(episode_sum) * epsilon
    alpha = (float(episode_sum) - float(episode)) / float(episode_sum) * alpha
    return epsilon, alpha


def Expectation_sarsa(env, episode_num, alpha, gamma, epsilon):
    Q = np.zeros((env.n_width * env.n_height, env.action_space.n))
    Q_queue = Queue(maxsize=11)
lon_k, alpha_k)
            prob_l = compute_epsion(next_s, Q, epsilon_k)
            Q_e = compute_e_q(prob_l, Q[next_s])
            Q[s, a] += alpha_k * (r + gamma * Q_e - Q[s, a])
            s = next_s
    return Q


Q = Expectation_sarsa(env, 20000, 0.05, 0.8, 0.5)

创作不易 觉得有帮助请点赞关注收藏~~~

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

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

相关文章

深入理解java虚拟机:虚拟机类加载机制(2)

文章目录3.类加载器3.1 类与类加载器3.2 双亲委派模型3.3 破坏双亲委派模型3.类加载器 虚拟机设计团队把类加载阶段中的通过一个类的全限定名来获取描述此类的二进制字节流这个动作放到Java虚拟机外部去实现&#xff0c;以便让应用程序自己决定如何去获取所需要的类。实现这个…

【密码学篇】数字签名基础知识(无保密性)

【密码学篇】数字签名基础知识&#xff08;无保密性&#xff09; 数字签名主要用于确认数据的完整性、签名者身份的真实性和签名行为的不可否认性等。—【蘇小沐】 文章目录【密码学篇】数字签名基础知识&#xff08;无保密性&#xff09;1.数字签名定义2.数字签名原理3.数字签…

Apache-DBUtils实现CRUD操作

Apache-DBUtils实现CRUD操作 每博一文案 有人说&#xff0c;不要轻易去伤害任何一个人&#xff0c;因为你会因此而受伤。欠的债&#xff0c;躲不掉&#xff0c;总是要还的。 要知道&#xff0c;哪些能被你欺骗的人&#xff0c;都是无条件相信你的人&#xff0c;因为心里有你&a…

【LeetCode-中等】240. 搜索二维矩阵 II(详解)

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/…

ROS之话题通信自定义msg

文章目录背景自定义msg例子1.定义msg文件2.编辑配置文件3.编译话题通信自定义msg调用A(C)0.vscode 配置1.发布方2.订阅方3.配置 CMakeLists.txt4.执行背景 在 ROS 通信协议中&#xff0c;数据载体是一个较为重要组成部分&#xff0c;ROS 中通过 std_msgs 封装了一些原生的数据…

【软考软件评测师】第三十三章 数据库系统应用

【软考软件评测师】第三十三章 数据库系统应用 【软考软件评测师】第三十三章 数据库系统应用【软考软件评测师】第三十三章 数据库系统应用第一部分 知识点集锦1.关系数据库候选码2.自然连接3.元祖关系1&#xff09;1对多关系2&#xff09;多对多关系3&#xff09;复合属性4&a…

Centos8界面语言怎么设置? Centos用户界面语言的设置方法

Centos8怎么给用户设置界面语言&#xff1f;想要设置界面语言&#xff0c;该怎么设置呢&#xff1f;下面我们就来看看详细的教程。 1、Gnome桌面环境下&#xff0c;在桌面空白处右键选择【设置】。 2、在【设置】中点【详细信息】。 3、之后点【用户】。 4、首先单击选中要设置…

ADS原理图到Layout,Layout更新原理图

RF Design-22 目录方法1&#xff1a;自动生成Generate/update Layout将理想元件转换为带footprint的元件统一修改元件参数生成Layout添加传输线&#xff0c;T节由Layout更新原理图Ground pouring覆铜设置地过孔方法2&#xff1a;place components from schem to Layout将原理图…

一种无需调查船上坞的调查设备安装测量方法和安装测量系统

本文来自于博主发明专利的技术交底。 大型科考船船底安装大型的精密测量设备&#xff0c;对安装的测量精度要求比较高&#xff0c;通过上坞&#xff0c;采用传统的测量方式&#xff0c;先做控制网&#xff0c;然后进行碎步测量&#xff0c;得到测量设备及其室内附属设备与船舶的…

Spring Cloud Ribbon面试题大全

Spring Cloud Ribbon面试题大全 目录 文档索引 面试题汇总 Q&#xff1a;Ribbon的总体流程&#xff1f; Q&#xff1a;Ribbon如何选择调用哪个实例&#xff1f; Q&#xff1a;服务列表的获取过程&#xff1f; Q&#xff1a;Ribbon如何避免调用失效实例&#xff1f; Q&am…

JavaScript高级复习上(59th)

1、类 constructor 构造函数 constructor() 方法是类的构造函数&#xff08;默认方法&#xff09;&#xff0c;用于传递参数&#xff0c;返回实例对象&#xff0c;通过new命令生成对象实例时&#xff0c;自动调用该方法。如果没有显示定义,类内部会自动给我们创建一个 constru…

【CPP】string 类的模拟实现

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;前言&…

Angular 学习 之 Hello World !

目录 0.前言・前提&#xff08;Angular介绍&#xff09; 前言 前提&#xff08;node.js已经按照&#xff09; 1.安装・查看版本 2.创建・启动Angular工程 2.1.创建工程 2.2.启动工程 2.3.启动之后&#xff0c;浏览器访问&#xff0c;显示的效果 2.4.工程目录结构 3.各…

计算机毕业设计——基于html汽车商城网站页面设计与实现论文源码ppt(35页) HTML+CSS+JavaScript

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

Flutter高仿微信-第29篇-单聊

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 实现代码&#xff1a; 单聊包含&#xff1a;文本、表情、语音、图片、小视频、…

HTML学生个人网站作业设计——HTML+CSS+JavaScript优分期大学生分期购物商城(7页)

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

Vue3【Composition API 的优势、新的组件(Fragment、Teleport、Suspense)、全局API的转移】

文章目录四、Composition API 的优势1.Options API 存在的问题2.Composition API 的优势五、新的组件1.Fragment2.Teleport3.Suspense六、其他1.全局API的转移2.其他改变四、Composition API 的优势 1.Options API 存在的问题 使用传统OptionsAPI中&#xff0c;新增或者修改一…

web前端网页设计与制作:HTML+CSS旅游网页设计——桂林旅游(3页) web前端旅游风景网页设计与制作 div静态网页设计

&#x1f468;‍&#x1f393;学生HTML静态网页基础水平制作&#x1f469;‍&#x1f393;&#xff0c;页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码&#xff0c;这是一个不错的旅游网页制作&#xff0c;画面精明&#xff0c;排版整洁&#xff0c;内容…

Flink时间窗口语义

Flink时间窗口语义WarterMarker特点自定义水位线策略周期性水位线生成器&#xff08;Periodic Generator&#xff09;断点式水位线生成器&#xff08;Punctuared Generator&#xff09;在自定义数据源中发送水位线水位线的传递水位线总结窗口&#xff08;Window&#xff09;窗口…

spark-core-源码、Worker启动、sparksubmit提交、Driver启动

sparksubmit源码解析 在提交我们写好的jar包时候&#xff0c;用到submit命令&#xff0c;他的源码解析流程如上图 位于deploy里的SparkSubmit里面&#xff0c;根据main方法一点点run进去&#xff0c;分配我们传的参数&#xff0c;尤其是 val (childArgs, childClasspath, spa…