使用矢量化/优化替换嵌套的while循环

时间:2014-02-11 00:16:33

标签: r loops optimization nested-loops

我正在尝试编写一个基本上运行吸收马尔可夫链的阵容模拟器,以期接近阵容产生的“真实”平均运行次数。我在这里看了大约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
}

0 个答案:

没有答案