jskskslee 2024-09-27 20:46 采纳率: 0%
浏览 4

马尔科夫决策,人工智能任务求解答

img

img


import numpy as np  
from scipy.linalg import solve  

class Env:  
    def __init__(self, name, r):  
        self.N = 12  
        self.Name = name  
        self.A = np.arange(4)  # 右下左上分别用0,1,2,3  
        self.X = np.arange(self.N) 
        self.makeR(r)  
        self.makeP() 
        self.Gamma = 1.0  
        self.Endstatus = [10, 11]  # 终止状态  

    def makeP(self):  
        """生成状态转移概率"""  
        P = np.zeros((self.N, len(self.A), self.N)) 
        for x in self.X:  
            (row, col) = X2RowCol(x)  # 将状态转为坐标  
            ne = neighbour(row, col)  # 获取可移动的邻居状态  

            for x_ in ne:  
                d = rel_pos(x, x_)  # 获取相对方向  
                P[x, d, x_] = 0.8  # 以0.8的概率移动到相邻状态  
                # 以0.1的概率转向左侧和右侧的状态  
                P[x, (d + 1) % len(self.A), x] += 0.1  #右
                P[x, (d + 3) % len(self.A), x] += 0.1  #左  

        # 处理障碍物  
        P[4, :, :] = 0  # 状态4是障碍物  
        P[4, :, 4] = 1  # 遇到障碍物停留在原地 
        
        # 处理转移概率未分配的情况  
        for x in self.X:  
            for d in range(len(self.A)):  
                if np.sum(P[x, d, :]) < 1:  # 如果状态转移概率未分配,留在原地  
                    P[x, d, x] += 1 - np.sum(P[x, d, :])  # 剩余概率留在原地  

        P[10, :, :] = 0  # 状态10是标有-1的终止状态  
        P[11, :, :] = 0  # 状态11是标有+1的终止状态 

        self.P = P  

    def makeR(self, r):  
        """生成奖励"""  
        self.R = np.ones(self.N) * r  # 初始奖励设置  
        self.R[4] = -1  # 障碍物(2,2)的奖励  
        self.R[11] = 1  # 终止状态(4,3)的奖励  
        self.R[10] = -1  # 终止状态(4,2)的奖励  

    def ValueIter(self):  
        """值迭代算法"""  
        U = np.zeros(self.N)  # 初始状态值  
        U_ = np.zeros(self.N)  
        delta = 1  
        while delta > 0.0001:  # 精度要求  
            U_ = self.R + self.Gamma * np.max(np.dot(self.P, U), axis=1)  
            delta = np.max(np.abs(U - U_))  
            U = U_  
        Pai = np.argmax(np.dot(self.P, U), axis=1)  # 最优策略  
        return U, Pai  

    def Eval(self, Pai):  
        """策略评估"""  
        A = self.Gamma * self.P[:, Pai, :]  
        A = A.sum(axis=1) - np.identity(self.N)  
        b = -self.R  
        U = solve(A, b)  
        return U  

    def PolicyIter(self):  
        """策略迭代"""  
        Pai = np.zeros(self.N, dtype=int)  
        change = True  
        while change:  
            U = self.Eval(Pai)  
            change = False  
            for x in self.X:  
                action = np.argmax(np.dot(self.P[x, :, :], U))  
                if action < len(self.A):  
                    if np.any(np.max(np.dot(self.P[x, :, :], U)) > np.dot(self.P[x, Pai[x], :], U) + 1E-5):  
                        Pai[x] = action  
                        change = True  
        return Pai  

def X2RowCol(x):  
    """将状态索引转换为行列坐标"""  
    return (x // 3) + 1, (x % 3) + 1   

def neighbour(row, col):  
    """获取状态的邻居状态"""  
    ne = []  
    if row > 1:  #左
        ne.append((row - 2)* 3 + col - 1)  
    if row < 4:  #右 
        ne.append(row * 3 + col - 1)  
    if col > 1:  #下
        ne.append((row - 1) * 3 + (col - 2))  
    if col < 3:  #上
        ne.append((row - 1) * 3 + col)  
    return ne  

def rel_pos(x, x_):  
    """获取相对位置"""  
    if x_ == x + 3:  
        return 0  # 右 
    elif x_ == x - 1:  
        return 1  # 下  
    elif x_ == x - 3:  
        return 2  # 左  
    elif x_ == x + 1:  
        return 3  # 上 
    else:  
        return -1  

# 接受输入  
r, x, y = input().strip().split()  
r = float(r)
x = int(x)
y = int(y)

# 创建环境实例  
env = Env("MyEnv", r)  

# 计算最优策略  
Pai = env.PolicyIter()  

# 获取对应方向  
direction = Pai[(x - 1) * 3 + y - 1]  # 将2D坐标转换为状态索引  

# 输出方向 0=右,1=下,2=左,3=上  
print(direction)

img

img

img

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-27 20:47
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    针对您提供的代码和描述的问题,我会逐步进行分析和解答。首先,让我们关注代码的主要结构和功能。代码定义了一个名为Env的类,用于模拟机器人导航的环境,包括状态转移、奖励设置和值迭代等。接着是主要的逻辑部分,接受输入并计算最优策略。

    关于您提供的测试输入和预期输出,我注意到以下几点:

    1. 测试输入格式:您提供的测试输入包括三个数值,分别是报酬r、x坐标和y坐标。然而,代码中的输入处理方式可能不完全正确。在创建环境实例时,应该使用字符串形式的地图名称("MyEnv")而不是其他字符。此外,坐标转换部分可能存在错误,需要确保坐标转换与地图上的实际位置相匹配。

    正确的输入处理可能类似于以下方式:

    r = float(input("请输入报酬r:"))
    x = int(input("请输入x坐标:"))
    y = int(input("请输入y坐标:"))
    env = Env("正确的地图名称", r)  # 使用正确的地图名称替换"正确的地图名称"
    

    请确保输入的地图名称与实际地图名称相匹配。

    1. 值迭代和策略评估:代码中的值迭代算法和策略评估部分看起来是正确的,但需要根据实际的地图结构和状态转移概率矩阵进行调整。确保状态转移概率矩阵P和奖励矩阵R与地图上的实际情况相匹配。

    2. 输出方向:在输出部分,您需要将状态索引转换为对应的方向输出。代码中的方向输出似乎是正确的(0=右,1=下,2=左,3=上),但需要确保索引转换与实际地图上的位置相对应。根据您提供的测试输入和预期输出,检查转换逻辑是否正确。确保 (x - 1) * 3 + y - 1 的计算方式能够正确对应到实际的格子位置。

    最后,对于您提供的多个测试图和输入数据,请确保输入的坐标与实际地图上的位置一致,并检查输出是否与预期相符。如果输出不正确,请检查上述提到的输入处理和算法逻辑部分是否有问题。如果问题仍然存在,请提供更多关于地图结构和预期输出的详细信息,以便进一步分析和解决问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月27日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?