马尔可夫决策过程与贝尔曼方程在扫地机器人中的应用(求解状态值和最优状态值函数和策略)

简介: 马尔可夫决策过程与贝尔曼方程在扫地机器人中的应用(求解状态值和最优状态值函数和策略)

需要源码请点赞关注收藏后在评论区留下QQ邮箱

马尔可夫决策过程(MDP)是强化学习的数学理论基础,马尔可夫决策过程以概率形式对强化学习任务进行建模,并对强化学习过程中出现的状态 动作 状态转移概率和奖赏等概念进行抽象表达。从而实现对强化学习任务的求解,即得到最优策略,获得最大累计奖赏。

关于扫地机器人环境动画的搭建 可以参考我这篇文章 搭建机器人环境

马尔可夫决策过程

1:马尔可夫性质

在某一任务中 如果Agent从环境中得到的下一状态仅仅依赖于当前状态,而不考虑历史状态,那么该任务即满足马尔可夫性质,虽然从定义上来看只有当前状态和与其相邻的下一个状态具有关联性,但实际上当前状态蕴含了前面所有历史状态的信息,只不过在已知当前状态的情况下,可以丢弃其他所有的历史信息。

2:马尔可夫过程(MP)

由二元组(St,St+1)组成的马尔科夫链,该链中的所有状态都满足马尔可夫性质。

3:马尔可夫奖赏过程(MRP)

由三元组(S,P,R)组成的马尔可夫过程,根据概率,状态自发的转移,其状态转移概率与动作无关

4:马尔可夫决策过程

由四元组(S,A,P,R)组成的马尔可夫过程,状态依靠动作进行转移,根据状态空间或动作空间是否有穷,也可以分为有穷马尔可夫决策过程和无穷马尔可夫决策过程。

机器人状态函数值的贝尔曼方程如下

代码输出结果如下

代码如下

'''
深度强化学习——原理、算法与PyTorch实战
'''
import numpy as np
class sweeprobot():
    def __init__(self):
        # 状态空间
        self.S = [[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5]],
                  [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5]],
                  [[2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5]],
                  [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [4, 5]],
                  [[4, 0], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5]],
                  [[5, 0], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5]]]
        # 动作空间
        self.A = [[None, None], [-1, 0], [1, 0], [0, -1], [0, 1]]
        # 状态值
        self.V = [[None for i in range(6)] for j in range(6)]
        self.V[1][1] = 0
        self.V[5][4] = 00
        # 策略
        self.pi = None
        self.gamma = 0.8
    def reward(self, s, a):
        # 奖励函数
        [truth1, truth2] = np.add(s, a) == [5, 4]
        [truth3, truth4] = np.add(s, a) == [1, 1]
        [truth5, truth6] = np.add(s, a) == [3, 3]
        # 若状态s转移到[5,4](收集垃圾)
        if s != [5, 4] and (truth1 and truth2):
            return 3
        # 若状态s转移到[1,1](充电)
        if s != [1, 1] and (truth3 and truth4):
            return 1
        # 若状态s转移到[3,3](撞到障碍物)
        if truth5 and truth6:
            return -10
        return 0
    def cal_coefficient(self):
        # 该函数用来计算出线性方程组的系数矩阵和向量值
        # 首先初始化一个25 * 25的系数矩阵和25个元素的向量
        coef_Matrix = [[0 for i in range(25)] for j in range(25)]
        b = [0 for i in range(25)]
        for i in range(1, 6):
            for j in range(1, 6):
                # 判断是否是终止情况,如果是的话直接计算下一个
                [truth1, truth2] = [i == 5, j == 4]
                [truth3, truth4] = [i == 1, j == 1]
                [truth5, truth6] = [i == 3, j == 3]
                if truth1 and truth2:
                    continue
                if truth3 and truth4:
                    continue
                if truth5 and truth6:
                    continue
                # 计算当前状态下的动作数,以用于计算策略pi
                count_action = 0
                if i - 1 >= 1:
                    count_action += 1
                if i + 1 <= 5:
                    count_action += 1
                if j - 1 >= 1:
                    count_action += 1
                if j + 1 <= 5:
                    count_action += 1
                self.pi = 1 / count_action
                # 具体计算每一个状态值的函数
                b_value = 0
                coef_CurrentState = 0
                # 向上的情况
                if i - 1 >= 1:
                    b_value = b_value + self.pi * self.reward(self.S[i][j], self.A[1])
                    if i - 1 == 3 and j == 3:
                        coef_CurrentState = self.pi * self.gamma
                    else:
                        coef1 = self.pi * self.gamma
                        coef_Matrix[(i - 1) * 5 + j - 1][((i - 1) - 1) * 5 + j - 1] = coef1
                # 向下的情况
                if i + 1 <= 5:
                    b_value = b_value + self.pi * self.reward(self.S[i][j], self.A[2])
                    if i + 1 == 3 and j == 3:
                        coef_CurrentState = self.pi * self.gamma
                    else:
                        coef2 = self.pi * self.gamma
                        coef_Matrix[(i - 1) * 5 + j - 1][((i + 1) - 1) * 5 + j - 1] = coef2
                # 向左的情况
                if j - 1 >= 1:
                    b_value = b_value + self.pi * self.reward(self.S[i][j], self.A[3])
                    if j - 1 == 3 and i == 3:
                        coef_CurrentState = self.pi * self.gamma
                    else:
                        coef3 = self.pi * self.gamma
                        coef_Matrix[(i - 1) * 5 + j - 1][(i - 1) * 5 + (j - 1) - 1] = coef3
                # 向右的情况
                if j + 1 <= 5:
                    b_value = b_value + self.pi * self.reward(self.S[i][j], self.A[4])
                    if j + 1 == 3 and i == 3:
                        coef_CurrentState = self.pi * self.gamma
                    else:
                        coef4 = self.pi * self.gamma
                        coef_Matrix[(i - 1) * 5 + j - 1][(i - 1) * 5 + (j + 1) - 1] = coef4
                # 将左边的移项,所以系数为-1 (单位矩阵减系数矩阵)
                coef_Matrix[(i - 1) * 5 + j - 1][(i - 1) * 5 + j - 1] = -1 + coef_CurrentState
                # 同理,将常数项移项需要乘-1
                b[(i - 1) * 5 + j - 1] = -1 * b_value
        # 因为状态[1,1]和状态[5,4]可以确定其状态值为0,状态[3,3]不存在,所以其实只需求22*22的矩阵
    sr = sweeprobot()
    A, b = sr.cal_coefficient()
    sr.solve_equation(A, b)
    sr.print_value()

最优策略

最优策略就是使得值函数最大的策略。通过计算值函数可以精确的得到至少一个最优策略,优于或等效于其他所有策略,此时记为最优状态值函数。

下面求解确定环境下扫地机器人任务的最优状态值函数 并给出最优策略

代码如下

'''
深度强化学习——原理、算法与PyTorch实战
'''
import numpy as np
class SweepRobot():
    def __init__(self):
        # 状态空间
        self.S = [[[0, 0], [0, 1], [0, 2], [0, 3], [0, 4], [0, 5]],
                  [[1, 0], [1, 1], [1, 2], [1, 3], [1, 4], [1, 5]],
                  [[2, 0], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5]],
                  [[3, 0], [3, 1], [3, 2], [3, 3], [3, 4], [4, 5]],
                  [[4, 0], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5]],
                  [[5, 0], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5]]]
        # 动作空间
        self.A = [[None, None], [-1, 0], [1, 0], [0, -1], [0, 1]]
        # 状态值
        self.V = [[None for i in range(6)] for j in range(6)]
        self.V[1][1] = 0
        self.V[5][4] = 0
        # 无策略
        self.gamma = 0.8
        self.theta = 0.0001
    def reward(self, s, a):
        # 奖励函数
        [truth1, truth2] = np.add(s, a) == [5, 4]
        [truth3, truth4] = np.add(s, a) == [1, 1]
        [truth5, truth6] = np.add(s, a) == [3, 3]
        # 若状态s转移到[5,4](收集垃圾)
        if s != [5, 4] and (truth1 and truth2):
            return 3
        # 若状态s转移到[1,1](充电)
        if s != [1, 1] and (truth3 and truth4):
            return 1
        # 若状态s转移到[3,3](撞到障碍物)
        if truth5 and truth6:
            return -10
        return 0
        while True:
            Delta = 0
            for i in range(1, 6):
                for j in range(1, 6):
                    # 判断是否是终止情况,如果是的话直接计算下一个
                    [truth1, truth2] = [i == 5, j == 4]
                    [truth3, truth4] = [i == 1, j == 1]
                    [truth5, truth6] = [i == 3, j == 3]
                    if truth1 and truth2:
                        continue
                    if truth3 and truth4:
                        continue
                    if truth5 and truth6:
                        continue
                    v = self.V[i][j]
                    # 因为每个状态的动作空间不一样,所以需要分情况讨论
                    max_value = 0
                    # 向上的情况
                    if i - 1 >= 1:
                        if i - 1 == 3 and j == 3:
                            max_value = max(max_value, self.reward(self.S[i][j], self.A[1]) + self.gamma * self.V[i][j])
                        else:
                            max_value = max(max_value, self.reward(self.S[i][j], self.A[1]) + self.gamma * self.V[i - 1][j])
                    # 向下的情况
                    if i + 1 <= 5:
                        if i + 1 == 3 and j == 3:
                            max_value = max(max_value, self.reward(self.S[i][j], self.A[1]) + self.gamma * self.V[i][j])
                        else:
                            max_value = max(max_value, self.reward(self.S[i][j], self.A[2]) + self.gamma * self.V[i + 1][j])
                    # 向左的情况
                    if j - 1 >= 1:
                        if j - 1 == 3 and i == 3:
                            max_value = max(max_value, self.reward(self.S[i][j], self.A[1]) + self.gamma * self.V[i][j])
                        else:
                            max_value = max(max_value, self.reward(self.S[i][j], self.A[3]) + self.gamma * self.V[i][j - 1])
                    # 向右的情况
                    if j + 1 <= 5:
                        if j + 1 == 3 and i == 3:
                            max_value = max(max_value, self.reward(self.S[i][j], self.A[1]) + self.gamma * self.V[i][j])
                        else:
                            max_value = max(max_value, self.reward(self.S[i][j], self.A[4]) + self.gamma * self.V[i][j + 1])
                    copy_V[i][j] = max_value
                    Delta = max(Delta, abs(v - copy_V[i][j]))
            self.V = copy_V
            if Delta < self.theta:
                break
    def print_value(self):
        # 输出扫地机器人的状态值
        print('扫地机器人最优状态值:')
        for i in range(1, 6):
            for j in range(1, 6):
                if self.V[j][6 - i] != None:
                    print('%.3f'%self.V[j][6 - i], end=" ")
                else:
                    print(self.V[j][6 - i], end=" ")
            print()
if __name__ == '__main__':
    sr = SweepRobot()
    sr.cal_optimal_value()
    sr.print_value()
相关文章
|
存储 人工智能 监控
大牛直播SDK在四足机器人和无人机巡检中的创新应用方案
在工业4.0和智能化浪潮下,传统巡检方式正经历深刻变革。四足机器人与无人机凭借灵活机动性和高效巡检能力崭露头角,而大牛直播SDK则赋予其实时直播与智能互动功能。本文介绍大牛直播SDK的核心优势、在四足机器人和无人机巡检中的应用方案,以及技术实现要点和未来展望,展示智能巡检的广阔前景。
622 6
|
机器人 API 数据安全/隐私保护
【最佳实践系列】通过AppFlow,支持飞书机器人调用阿里云百炼应用
本文介绍了如何创建并配置飞书应用及机器人,主要包括三个步骤:1. 登录飞书开发者后台,创建企业自建应用并添加机器人卡片和API权限;2. 创建AppFlow连接流,配置飞书平台凭证和阿里云百炼鉴权凭证,发布WebhookUrl,并在飞书开放平台配置事件订阅;3. 将机器人添加到群聊中,通过@机器人实现互动。以及通过AppFlow连接流集成阿里云百炼应用服务。此过程详细描述了从应用创建到机器人添加的全流程,帮助开发者快速集成飞书机器人功能。
3357 10
|
机器学习/深度学习 人工智能 机器人
模仿学习在机器人“接触丰富”任务中的应用
本文结合近期发表的一篇综述性论文,简要介绍了机器人技术中的模仿学习(Imitation Learning)、以及接触丰富(Contact-Rich)任务这两个概念
557 41
|
存储 人工智能 机器人
别再只做聊天机器人:AI 应用商业闭环的工程落地指南,免费体验中
本文介绍了如何通过阿里云百炼平台创建一个星座运势分析AI智能体,并集成支付宝MCP服务实现支付闭环。解决AI产品无法直接变现的问题,完成“服务-支付-交易”全流程闭环,帮助开发者快速实现商业化。
|
机器学习/深度学习 存储 算法
【水下机器人建模】基于QLearning自适应强化学习PID控制器在AUV中的应用研究(Matlab代码实现)
【水下机器人建模】基于QLearning自适应强化学习PID控制器在AUV中的应用研究(Matlab代码实现)
620 0
|
人工智能 边缘计算 自然语言处理
大模型应用实践:2025年智能语音机器人厂商推荐和方案详解
随着数字化转型加速,AI客服机器人市场规模预计2025年突破500亿美元,年复合增长率超25%。其发展由语音交互升级、垂直场景解决方案成熟及多模态融合与边缘计算普及三大趋势驱动。文章分析了智能语音机器人的选型核心维度,包括技术性能、场景适配、数据治理与成本效益,并对比了国内外代表厂商如合力亿捷、Zendesk等的方案特点,为企业提供选型策略与落地建议,助力实现服务模式的根本性变革。
1442 0
|
人工智能 自然语言处理 机器人
机器人研发与AI集成的加速策略:模块化生态创新革命
法思诺创新专注于机器人研发与AI集成的加速策略,推动模块化生态革命。通过软硬件分层协作,将机器人分为“躯体操作系统”和“场景思维芯片”,解决当前研发复杂、成本高昂的问题。文章分析机器人研发现状、模块化分工优势及场景芯片应用,并展望未来机器人产业的“智能机时刻”。法思诺提供创新咨询与培训服务,助力企业破解技术难题,实现软硬一体化智能创新。关注法思诺,探索真创新之路。
580 0
|
机器人 API 数据安全/隐私保护
AppFlow:支持飞书机器人调用百炼应用
本文介绍了如何创建并配置飞书应用及机器人,包括登录飞书开发者后台创建应用、添加应用能力和API权限,以及通过AppFlow连接流集成阿里云百炼服务,最后详细说明了如何将机器人添加到飞书群组中实现互动。
2344 5
|
人工智能 自然语言处理 机器人
9.9K star!大模型原生即时通信机器人平台,这个开源项目让AI对话更智能!
"😎高稳定、🧩支持插件、🦄多模态 - 大模型原生即时通信机器人平台"
609 0
|
数据采集 自动驾驶 机器人
数据喂得好,机器人才能学得快:大数据对智能机器人训练的真正影响
数据喂得好,机器人才能学得快:大数据对智能机器人训练的真正影响
1231 1

热门文章

最新文章