我正在尝试编写一个基本上运行吸收马尔可夫链的阵容模拟器,以期接近阵容产生的“真实”平均运行次数。我在这里看了大约25个帖子,解释了某些类型的矢量化和优化,但却无法在我的代码中使用其中任何一个。因此,我想我会问,看看是否有任何提示。谢谢!
PHLoops <- function(P1,P2,P3,P4,P5,P6,P7,P8,P9,PPH,R,start=1){
s <- start; path <- NULL; runs <- 0; zz=1;inn=1;gam=1;atbat=1
while (gam<163){
while(inn<10){
s <- start; path <- NULL;
while(s<25){
if(zz==1){
P=P1
}
if(zz==2){
P=P2
}
if(zz==3){
P=P3
}
if(zz==4){
P=P4
}
if(zz==5){
P=P5
}
if(zz==6){
P=P6
}
if(zz==7){
x3 <- sample(1:100, 1)
if((atbat>=24)&(table(P7==mat9)[1]>=625)&(atbat<=30)&(x3<=6)){
P=P7
}else if((atbat>=25)&(table(P7==mat9)[1]>624)&(atbat<=30)&(x3>=7)){
P=PPH
}else if(((atbat>=27)&(table(P8==mat9)[1]>624))){
P=PPH
}else{
P=P7
}
}
if(zz==8){
x3 <- sample(1:100, 1)
if((atbat>=25)&(table(P8==mat9)[1]>624)&(atbat<=30)&(x3<=3)){
P=P8
}else if((atbat>=26)&(table(P8==mat9)[1]>=625)&(atbat<=32)&(x3>=4)){
P=PPH
}else if(((atbat>=27)&(table(P8==mat9)[1]>624))){
P=PPH
}else{
P=P8
}
}
if(zz==9){
if(((atbat>=27)&(table(P9==mat9)[1]>624))){
P=PPH
}
else{
P=P9
}
}
s.new <- sample(1:25,1,prob=P[s,])
path <- c(path,s.new)
runs <- runs+R[s,s.new]
s <- s.new
zz=ifelse(zz==9,1,zz+1)
atbat=atbat+1
}
inn=inn+1
runs
}
gam=gam+1
atbat=1
inn=1
runs
}
runs
}
然后我使用:
运行此功能RUNS8 <- replicate(1000,PHLoops(mat2,
mat4,mat5,mat7,mat1,mat8,mat6,mat9,mat3,mat10,R))
其中mat 1-10是每个玩家的25x25过渡矩阵。 R是一个矩阵,它告诉函数团队从一个州到另一个州的运行次数。 zz是一个变量,对应于我们在击球顺序中的位置。 7-9个位置不同,因为投手每次上场击球都不会击球。所以基本上经过2次完整的迭代后,投手不会击球,而PPH(投球击球手)将击球。然而,当他接近订单的顶部时,投手将更频繁地击中。 (这就是x3正在模拟的东西)。
任何帮助都会很棒,我会继续阅读论坛以获取更多提示。
谢谢!
更新(2-11)
进行下面人们建议的更改,现在代码如下:
simulate.half.inning9test <- function(P1,P2,P3,P4,P5,P6,P7,P8,P9,PPH,R,start=1){
s <- start; path <- NULL; runs <- 0; zz=1;inn=1;gam=1;atbat=1
p7=(table(P7==mat9)[1]>624)
p8=(table(P8==mat9)[1]>624)
p9=(table(P9==mat9)[1]>624)
order=list(P1,P2,P3,P4,P5,P6,P7,P8,P9)
while (gam<163){
x3 <- sample(1:100, 1)
while(inn<10){
s <- start; path <- NULL;
while(s<25){
P=order[[zz]]
if(zz==7){
if((atbat>=24)&&(p7==TRUE)&&(atbat<=30)&&(x3<=6)){
P=P7
}else if((atbat>=25)&&(p7==TRUE)&&(atbat<=30)&&(x3>=7)){
P=PPH
}else if(((atbat>=27)&&(p7==TRUE))){
P=PPH
}else{
P=P7
}
}
if(zz==8){
if((atbat>=25)&&(p8==TRUE)&&(atbat<=30)&&(x3<=3)){
P=P8
}else if((atbat>=26)&&(p8==TRUE)&&(atbat<=32)&&(x3>=4)){
P=PPH
}else if(((atbat>=27)&&(p8==TRUE))){
P=PPH
}else{
P=P8
}
}
if(zz==9){
if(((atbat>=27)&&(p9==TRUE))){
P=PPH
}
else{
P=P9
}
}
s.new <- sample(1:25,1,prob=P[s,])
runs <- runs+R[s,s.new]
s <- s.new
zz=ifelse(zz==9,1,zz+1)
atbat=atbat+1
}
inn=inn+1
runs
}
gam=gam+1
atbat=1
inn=1
runs
}
runs
}