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

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

需要源码和环境搭建请点赞关注收藏后评论区留下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)

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

相关文章
|
23天前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
20天前
|
算法
通过matlab分别对比PSO,反向学习PSO,多策略改进反向学习PSO三种优化算法
本项目使用MATLAB2022A版本,对比分析了PSO、反向学习PSO及多策略改进反向学习PSO三种优化算法的性能,主要通过优化收敛曲线进行直观展示。核心代码实现了标准PSO算法流程,加入反向学习机制及多种改进策略,以提升算法跳出局部最优的能力,增强全局搜索效率。
|
22天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
54 1
|
28天前
|
自然语言处理 算法 机器人
智能电话销售机器人源码搭建部署系统电话机器人源码
智能电话销售机器人源码搭建部署系统电话机器人源码
27 4
|
28天前
|
自然语言处理 机器人 语音技术
电销机器人源码搭建(各个版本机器人部署)
电销机器人源码搭建(各个版本机器人部署)
29 3
|
1月前
|
算法
优化策略:揭秘钢条切割与饼干分发的算法艺术
本文探讨了钢条切割与饼干分发两个经典算法问题,展示了算法在解决实际问题中的应用。钢条切割问题通过动态规划方法,计算出不同长度钢条的最大盈利切割方式,考虑焊接成本后问题更为复杂。饼干分发问题则采用贪心算法,旨在尽可能多的喂饱孩子,分别讨论了每个孩子一块饼干和最多两块饼干的情况。这些问题不仅体现了数学的精妙,也展示了工程师的智慧与创造力。
37 4
|
1月前
|
人工智能 自然语言处理 机器人
智能语音机器人底层系统设计逻辑机器人源码系统逻辑
简介: — 1 —智能客服背景智能语音客服机器人是在传统的客服系统基础上,集成了语音识别、语义理解、知识图谱、深度学习等多项智能交互技术,能准确理解用户的意图或提问,再根据丰富的内容和海量知识图谱,给予用户满意的回答。目前已广泛应用于金融、保险、汽车、房产、电商、政府等多个领域。
|
1月前
|
机器学习/深度学习 监控 算法
现货量化交易机器人系统开发策略逻辑及源码示例
现货量化交易机器人系统是一种基于计算机算法和数据分析的自动化交易工具。该系统通过制定交易策略、获取和处理数据、生成交易信号、执行交易操作和控制风险等环节,实现高效、精准的交易决策。系统架构可采用分布式或集中式,以满足不同需求。文中还提供了一个简单的双均线策略Python代码示例。
|
1月前
|
机器学习/深度学习 人工智能 运维
电话机器人源码-智能ai系统-freeswitch-smartivr呼叫中心-crm
电话机器人源码-智能ai系统-freeswitch-smartivr呼叫中心-crm
51 0
|
1月前
|
机器人 人机交互 语音技术
智能电销机器人源码部署安装好后怎么运行
销售打电销,其中90%电销都是无效的,都是不接,不要等被浪费了这些的精力,都属于忙于筛选意向客户,大量的人工时间都耗费在此了。那么,有这种新型的科技产品,能为你替代这些基本的工作,能为你提升10倍的电销效果。人们都在关心智能语音客服机器人如何高效率工作的问题,今天就为大家简单的介绍下:1、智能筛选系统:电销机器人目前已经达到一个真人式的专家级的销售沟通水平,可以跟客户沟通,筛选意向,记录语音和文字通话记录,快速帮助电销企业筛选意向客户,大大的节约了筛选时间成本和人工成本。2、高速运转:在工作效率上,人工电销员,肯定跟不上智能语音机器人,机器人自动拨出电话,跟客户交谈。电话机
95 0