r - 矩阵不同概率的赌场游戏

标签 r matrix stochastic-process

这是我的任务:

彼得带着 1 美元去赌场。在 p 的机会下,Peter 赢得 1 美元,在 (1-p) 的机会下,他损失 1 美元。这个过程可以看作是一条马尔可夫链。

如果彼得达到 0 美元,他就会破产回家,如果他设法达到 5 美元,他就会高兴地回家。

求当 p= 30%、40%、50%、60% 和 70% 时,Peter 带着 5 美元回家的概率。为每个概率构造矩阵,其中前 4 个状态是 transient 类(1-4 美元),最后两个状态是两个循环状态(0 和 5 美元)。

我的解决方案

使用when_converged 查找每个单独矩阵何时收敛(P^n = P^n+1)。

然后使用 mpow 中的 n 来查看从 1 美元到 5 美元(即从状态 1 到状态 6)的概率。

这是我的代码:

mpow <- function(P, n) {
    if (n == 0) {
        return(diag(nrow(P)))
    } else if (n == 1) {
        return(P)
    } else {
        return(P %*% mpow(P, n - 1))
    }
}

when_converged <- function(P, tol=0.00005) { 
    n = 1; diff = 1 
    while (diff > tol) { 
        A <- mpow(P, n) 
        B <- mpow(P, n+1) 
        diff <- max(abs(A - B)) 
        n <- n + 1 
    } 
    return(n) 
}


P30 <- matrix(c(0, 0.3, 0, 0, 0.7, 0, 0.7, 0, 0.3, 0, 0, 0, 0, 0.7, 0, 0.3, 0, 0, 0, 0, 0.7, 0, 0, 0.3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), nrow = 6, ncol = 6, byrow = TRUE)

P40 <- matrix(c(0, 0.4, 0, 0, 0.6, 0, 0.6, 0, 0.4, 0, 0, 0, 0, 0.6, 0, 0.4, 0, 0, 0, 0, 0.6, 0, 0, 0.4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), nrow = 6, ncol = 6, byrow = TRUE)

P50 <- matrix(c(0, 0.5, 0, 0, 0.5, 0, 0.5, 0, 0.5, 0, 0, 0, 0, 0.5, 0, 0.5, 0, 0, 0, 0, 0.5, 0, 0, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), nrow = 6, ncol = 6, byrow = TRUE)

P60 <- matrix(c(0, 0.6, 0, 0, 0.4, 0, 0.6, 0, 0.4, 0, 0, 0, 0, 0.6, 0, 0.4, 0, 0, 0, 0, 0.6, 0, 0, 0.4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), nrow = 6, ncol = 6, byrow = TRUE)

P70 <- matrix(c(0, 0.7, 0, 0, 0.3, 0, 0.7, 0, 0.3, 0, 0, 0, 0, 0.7, 0, 0.3, 0, 0, 0, 0, 0.7, 0, 0, 0.3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1), nrow = 6, ncol = 6, byrow = TRUE)

when_converged(P30, 0.00005)

从 Rstudio 得知 P30 收敛于 35。

when_converged(P40, 0.00005)

从 Rstudio 得知 P40 收敛于 37。

when_converged(P50, 0.00005)

从 Rstudio 得知 P50 收敛于 47。

when_converged(P60, 0.00005)

从 Rstudio 得知 P60 收敛于 61。

when_converged(P70, 0.00005)

从 Rstudio 得知 P70 收敛于 79。

mpow(P30, 35)

mpow(P40, 37)

mpow(P50, 47)

mpow(P60, 61)

mpow(P70, 79)

我需要什么帮助

我从 Rstudio 得到的是,对于 mpow(P60, 61) 和 mpow(P70, 79),与 mpow(P50, 47) 和 mpow(P40, 37) 相比,用 5 美元回家的概率变得更小。赢得 1 美元的概率较小。这感觉不对。我做错了什么吗? 请尝试使用我的方法来解决它,而不是使用完全不同的代码。

最佳答案

这就是我构建 P30 矩阵的方式......与你的不同:

> P30 <- matrix(c(1,  0, 0,  0,  0, 0,
+                   0.7, 0, 0.3, 0, 0,  0, 
+                   0,  0.7, 0, 0.3, 0, 0, 
+                   0,  0, 0.7, 0, 0.3, 0,
+                   0,  0,  0,  0.7, 0 , 0.3,                  
+                   0,  0, 0, 0, 0, 1), nrow = 6, ncol = 6, byrow = TRUE)
> P30
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]  1.0  0.0  0.0  0.0  0.0  0.0
[2,]  0.7  0.0  0.3  0.0  0.0  0.0
[3,]  0.0  0.7  0.0  0.3  0.0  0.0
[4,]  0.0  0.0  0.7  0.0  0.3  0.0
[5,]  0.0  0.0  0.0  0.7  0.0  0.3
[6,]  0.0  0.0  0.0  0.0  0.0  1.0

请注意,在每一行中,在 0 或 5 状态的情况下,输入列仅发送到其自身,但在其他状态下,它会发送到相邻的输出列。因此,in-1 会转到 out-0 或 out-2。使用列名和行名显示可能更清晰:

> rownames(P30) <- 0:5
> colnames(P30) <- 0:5
> P30
    0   1   2   3   4   5
0 1.0 0.0 0.0 0.0 0.0 0.0
1 0.7 0.0 0.3 0.0 0.0 0.0
2 0.0 0.7 0.0 0.3 0.0 0.0
3 0.0 0.0 0.7 0.0 0.3 0.0
4 0.0 0.0 0.0 0.7 0.0 0.3
5 0.0 0.0 0.0 0.0 0.0 1.0

这有助于构建具有不同 P 值的矩阵

 p0 <-  matrix(0, nrow = 6, ncol = 6); p=.30
 p30 <- p0; p30 [cbind(2:5,1:4)] <- 1-p
             p30[cbind(2:5,3:6)] <- p
 p30[ cbind(c(1,1),c(6,6))] <- 1
 p30

     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]  1.0  0.0  0.0  0.0  0.0  0.0
[2,]  0.7  0.0  0.3  0.0  0.0  0.0
[3,]  0.0  0.7  0.0  0.3  0.0  0.0
[4,]  0.0  0.0  0.7  0.0  0.3  0.0
[5,]  0.0  0.0  0.0  0.7  0.0  0.3
[6,]  0.0  0.0  0.0  0.0  0.0  1.0

三次迭代后的确定性概率或理论概率(从 state=1 开始:

c(0,1,0,0,0,0) %*% P30 %*% P30 %*% P30
#-----
         0 1     2 3     4 5
[1,] 0.847 0 0.126 0 0.027 0

同意您的mpow

> c(0,1,0,0,0,0) %*% mpow(P30 ,3)
         0 1     2 3     4 5
[1,] 0.847 0 0.126 0 0.027 0

expm 包中还有一个矩阵幂函数 %^%

> c(0,1,0,0,0,0) %*% expm::'%^%'( P30,3)
         0 1     2 3     4 5
[1,] 0.847 0 0.126 0 0.027 0

关于r - 矩阵不同概率的赌场游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38312464/

相关文章:

r - 正确着色 R igraph 中的顶点

R 批处理模式 : How to see output/error of R on console screen?

python - 从稀疏矩阵中获取所有唯一值[python/scipy]

r - 设置条件 group_by

r - R 中离散属性的极限学习机

java - 如何在不使用存储阵列的情况下将 2D 阵列旋转 90 度?

java - 读取带有数字的txt文件并将其保存在字符串矩阵中

c++ - 动态(即可变大小)分域树?

在无限一维图中寻找洞的算法

python - 马尔可夫链蒙特卡罗模拟问题