You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中构建最优转移矩阵及用MDPtoolbox实现策略迭代

问题解决方案

现有3组转移矩阵(P1、P2、P3)与奖励矩阵(R1、R2、R3),已计算得到各矩阵行乘积和的最大值:q1=8、q2=16、q3=7。以下是在R中构建目标转移矩阵P_NEW,以及使用MDPtoolbox完成策略迭代与改进的具体步骤。


初始化矩阵代码

# 策略1的初始变量设置
P1 <- matrix(c(1/2, 1/4, 1/4,
               1/16,3/4,3/16,
               1/4,1/8,5/8), nrow = 3, byrow = TRUE);rownames(P1)=c("1","2","3");P1
R1 <- matrix(c(10,4,8,
               8,2,4,
               4,6,4), nrow = 3, byrow = TRUE);rownames(R1)=c("1","2","3");R1


# 策略2的初始变量设置
P2 <- matrix(c(1/2, 0, 1/2,
               1/16,7/8,1/16), nrow = 2, byrow = TRUE);rownames(P2)=c("1","2");P2
R2 <- matrix(c(14,0,18,
               8,16,8), nrow = 2, byrow = TRUE);rownames(R2)=c("1","2");R2



# 策略3的初始变量设置
P3 <- matrix(c(1/4,1/4,1/2,
               1/8,3/4,1/8,
               3/4,1/16,3/18), nrow = 3, byrow = TRUE);rownames(P3)=c("1","2","3");P3
R3 <- matrix(c(10,2,8,
               6,4,2,
               4,0,8), nrow = 3, byrow = TRUE);rownames(R3)=c("1","2","3");R3

# 计算各矩阵行乘积和的最大值
q1 <- max(unname(rowSums(P1*R1)))
q2 <- max(unname(rowSums(P2*R2)))
q3 <- max(unname(rowSums(P3*R3)))

构建目标转移矩阵P_NEW

1. 定位最大值对应的行

首先找到每个矩阵中,行乘积和等于对应最大值的行索引:

# 定位P1中rowSums(P1*R1)等于q1的行
row_p1 <- which(rowSums(P1*R1) == q1)
# 定位P2中rowSums(P2*R2)等于q2的行
row_p2 <- which(rowSums(P2*R2) == q2)
# 定位P3中rowSums(P3*R3)等于q3的行
row_p3 <- which(rowSums(P3*R3) == q3)

2. 提取行并构建P_NEW

将找到的行按顺序组合,即可得到目标矩阵:

# 提取对应行并合并
selected_rows <- rbind(P1[row_p1, ], P2[row_p2, ], P3[row_p3, ])
# 转换为3行的矩阵
P_NEW <- matrix(selected_rows, nrow = 3, byrow = TRUE)

# 查看结果
P_NEW

运行后输出与目标矩阵一致:

[,1]  [,2]  [,3]
[1,] 0.50 0.25 0.25
[2,] 0.50 0.00 0.50
[3,] 0.25 0.25 0.50

使用MDPtoolbox进行策略迭代与改进

1. 安装并加载包

# 首次运行需安装包
install.packages("MDPtoolbox")
# 加载包
library(MDPtoolbox)

2. 定义MDP核心要素

设定状态数、动作数,构建转移概率数组和奖励数组:

# 状态数
S <- 3
# 动作数(此处先以P_NEW对应1个动作为例)
A <- 1

# 构建转移概率数组:维度为[状态数, 状态数, 动作数]
P <- array(0, dim = c(S, S, A))
P[, , 1] <- P_NEW

# 构建奖励数组:使用各状态的最大即时奖励(即q1、q2、q3)
R <- matrix(c(q1, q2, q3), nrow = S, ncol = A)

3. 执行策略迭代

调用mdp_policy_iteration函数完成策略迭代:

# 执行策略迭代(折扣因子gamma设为0.9,可根据需求调整)
pi_result <- mdp_policy_iteration(P, R, discount = 0.9)

# 查看输出结果
# 最优策略
cat("最优策略:", pi_result$policy, "\n")
# 最优值函数
cat("最优值函数:", pi_result$V, "\n")

4. 手动策略改进

若需手动执行策略改进,可基于当前值函数计算每个状态的最优动作:

gamma <- 0.9
# 计算每个状态-动作对的Q值
q_values <- matrix(0, nrow = S, ncol = A)
for (s in 1:S) {
  for (a in 1:A) {
    q_values[s, a] <- R[s, a] + gamma * sum(P[s, , a] * pi_result$V)
  }
}

# 选择每个状态下Q值最大的动作作为改进后的策略
improved_policy <- apply(q_values, 1, which.max)
cat("改进后的策略:", improved_policy, "\n")

内容的提问来源于stack exchange,提问作者Homer Jay Simpson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:17:56