R 具有矩阵不同概率的赌场博弈
这是我的任务:R 具有矩阵不同概率的赌场博弈,r,matrix,stochastic-process,R,Matrix,Stochastic Process,这是我的任务: 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
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)
彼得带着1美元去赌场。有了p的机会,彼得赢了1美元,有了(1-p)的机会,他失去了1美元。这个过程可以看作是一个马尔可夫链
如果彼得挣到0美元,他就破产了,如果他挣到5美元,他就会快乐地回家
当p=30%、40%、50%、60%和70%时,找出彼得带着5美元回家的概率。为每个概率构造矩阵,其中前4个状态为瞬态类(1-4美元),后两个状态为两个循环状态(0&5美元)
我解决问题的计划
找出每个独立矩阵何时收敛(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我得到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
同意您的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
如果有什么不清楚的地方,请询问。在我看来,保持在0或5状态的概率应该是1。这就是所谓的吸收态。只有从1状态到0或2状态的转换,并且它们应该是互补的(即总和到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
> 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
> 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